Webpack在目标节点时忽略代码拆分

Bra*_*rad 3 javascript node.js reactjs webpack react-router

我有一个节点应用程序,它使用react-router来呈现服务器端的React视图.我的问题是我require.ensure在客户端使用代码拆分,但在编译服务器端代码时不希望代码拆分.这是我的webpack配置:

{
  entry: path.join(__dirname, '../server/app.js'),
  target: 'node',
  output: {
    path: './',
    filename: 'server.js'
  },
  module: {
    loaders: [
      { test: /\.js$/, loader: 'babel', exclude: /node_modules/ },
      { test: /\.hbs$/, loader: 'handlebars-loader', include: /client/ }
    ]
  },
  externals: nodeModules
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到server.js,1.server.js,2.server.js等.我宁愿只有一个server.js文件.

在每个路径文件的顶部我有:

if (typeof require.ensure !== 'function') require.ensure = (d, c) => c(require);
Run Code Online (Sandbox Code Playgroud)

当我require('babel/register')在开发中使用时,它有用,但我宁愿有一个用于生产的编译文件.

Bre*_*non 7

我已经通过围绕要求的条件解决了这个问题.如果它是浏览器构建,require.ensure,如果它是服务器构建,只需要.我使用DefinePlugin为每个构建定义环境的"常量"变量,所以它看起来像

if (BUILD_BROWSER) {
  require.ensure('foo.js', function() { ... });
} else {
  require('foo.js');
  ...
}
Run Code Online (Sandbox Code Playgroud)

Webpack的静态分析只有足够智能才能理解布尔值,因此做类似的事情是if (BUILD_TARGET === 'browser')行不通的; 解析器将不遵循逻辑并将处理两个要求.

如果你正在使用Uglify插件,那将删除不需要的条件逻辑,这样你就不会膨胀你的生产版本.