2015-04-22 536 views
11

我想喜歡RequireJS empty:http://requirejs.org/docs/optimization.html#empty排除模塊從捆綁的WebPack

相同的功能我用例是我包括開發jquery-migrate,但我想在生產內置排除這一點。

使用IgnorePlugin只是使其不包含,並且當require在代碼中,它然後會引發錯誤(Uncaught Error: Cannot find module "jquery-migrate")。

我想要發生的是它只是返回undefined或類似的東西(如RequireJS中的empty:)。 Id喜歡不要觸摸代碼中的導入,只需將其配置爲返回undefined即可。

編輯:使用NormalModuleReplacementPlugin的作品,如果我指出替換爲空文件。但爲此只保留一個空文件似乎沒有必要。

回答

16

我用空裝載機用於消隱模塊。 在配置中,noop-loader可以用於不那麼笨拙的if-else。

嘗試:

rules: [{ 
    test: /jquery-migrate/, 
    use: IS_DEV ? 'null-loader' : 'noop-loader' 
}] 
+0

這似乎適用於我,我認爲最好的答案OP的問題。沒有改變代碼,我仍然在代碼的頂部有一個'import foo'excluded-module'',沒有有趣的if(DEV)'包裝器。想象一下,require('excluded-module')'也可以。 –

+2

注意其他新手,這些裝載機不包含在webpack中:'npm install --save-dev null-loader && npm install --save-dev noop-loader' – diachedelic

+0

注2 - 在末尾添加'-loader'加載器名稱。例如'null-loader' ... –

3

你可以嘗試做一個resolve.alias在webpack.config:

resolve: { 
    alias: { 
     "jquery-migrate": process.env.NODE_ENV === 'production' ? "empty-module": "jquery-migrate" 
    } 
} 
+0

這仍然迫使我有一個空的模塊躺在附近。雖然比NormalModuleReplacementPlugin更清潔:) – SimenB

+3

@Simen'npm i -D empty-module' – srcspider

1

使用的WebPack的DefinePlugin與正常生產的插件組合(重複數據刪除和醜化)。

然後在你的代碼,你可以寫:

if(DEBUG) { 
    var test = require('test'); 
    alert(test); 
} 

時,它的建成投入生產,該DEBUG將文字if(false) { ... }將由醜化插件完全去除取代,因此test只會在調試版本中需要。

下面是一個示例咕嚕任務配置爲grunt-webpack具有用於任務developmentproduction目標:

 development: { 
      devtool: "sourcemap", 
      output: { 
       pathinfo: true, 
      }, 
      debug: true, 
      production: false, 
      plugins: [ 
       new webpack.DefinePlugin({ 
        DEBUG: true, 
        PRODUCTION: false 
       }) 
      ] 
     }, 

     production: { 
      plugins: [ 
       new webpack.DefinePlugin({ 
        DEBUG: false, 
        PRODUCTION: true 
       }), 
       new webpack.optimize.DedupePlugin(), 
       new webpack.optimize.UglifyJsPlugin({ 
        output: { 
         comments: false, 
        } 
       }) 
      ] 
     }, 
+0

我實際上更喜歡用調試語句而不是構建工具腳本來裝飾源代碼。在嘗試瞭解jQuery遷移的來源時,回到代碼和其他代碼後,它對於你自己來說更容易理解。 –

+0

是的。這對AMD來說並不是很清楚,至少如果在最初的'define'調用中列出的話。使用別名與'empty:'完全一樣,除了我必須自己創建'empty'模塊。 – SimenB