2013-06-20 78 views
4

我正在使用grunt-browserify並特別遇到兩個問題。使用以下配置選項成功啓動並運行任務。變量jsFilesToConcat代表Backbone.js + Marionette.js應用程序的所有JavaScript文件,主應用程序定義,前端實用程序資產(例如Bootstrap插件)以及與項目相關的所有JS。這是錯誤的方法?這個想法是一次加載整個250k JS應用程序(以及它的所有依賴項)。Backbone.Marionette - Grunt Browserify - 「require is not defined」

我想提供的聲明,這對我來說是一個新的領域,所以我覺得我的預期使用情況下可與已經可用插件的選項,但我的兩個錯誤很困惑:

1 )Backbone not defined - 這意味着腳本實際上正在加載,但是,當我在Chrome Dev Tools中檢查調用堆棧時,它只顯示匿名自調用函數。所以我不清楚如何將Backbone對象傳遞給Marionette,以便在加載時進行擴展。

2)require is not defined - 我聲明的線路錯誤var SampleApp = require('SampleApp')。我需要在我的grunt配置中做些特別的事情,或者需要在node.js server.js配置文件中公開require函數?

3)javascript本身是異步執行的,這是我不能正確處理的browserify預期行爲的一部分嗎?我認爲,因爲我在全局包裝中包裝了很多JS實用程序來保護名稱空間,這就是某些函數不可用的原因,但我不清楚爲什麼會影響require

// uses grunt-browserify task 
    browserify: { 
     developmentJs: { 
      options: { 
       debug: true, 
       alias: ["./js/app.dev.js:SampleApp"], 
      }, 
      src: [ 
       '<%= pkg.jsFilesToConcat %>' 
      ], 
      dest: 'public-dev/js/app.dev.js' 
     } 
    } 

,然後在我的單頁木偶應用的index.html,我有。

(function ($) { 
     $(document).ready(function() { 
      var sampleApp = require('SampleApp'); 
      console.log(SampleApp); 
     }); 
    })(jQuery); 
+0

在配置中有一個別名應該使得require()暴露AFAIK。你看看生成的'public-dev/js/app.dev.js'文件嗎?另外,爲了確保你在index.html中正確包含了public-dev/js/app.dev.js? –

+0

@AmitayDobo我認爲是一樣的,但我遇到了同樣的問題,需要不被全局定義 – pixshatterer

回答

0

對於初學者來說,grunt文件中的src屬性不需要引用應用程序中的所有文件。它只需要一個入口點。所以通常我在index.js文件中有類似於匿名自執行功能的東西,並將我的src配置選項設置爲["./index.js"]。當browserify查看該文件時,它將檢查需要的調用並獲取所有必需的依賴關係。

也就是說,browserify將生成一個內部定義爲require的文件。 require函數在頁面上不是全局可用的,您所要求的依賴項也不是。您可以在應用程序中使用它們,但這並不能使它們在頁面中可用。因此,如果你得到的Backbone沒有定義錯誤,我首先要檢查的是你已經通過npm安裝了主幹(npm install backbone --save)。

一旦設置好了,你只需要在頁面上包含你的編譯腳本,並讓你的匿名自執行函數(現在應該在grunt-browserify正在處理的文件中)完成啓動工作你的申請。

相關問題