2015-04-22 29 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