2016-02-12 46 views
3

时,Webpack忽略代码拆分我有一个使用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 
} 

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

在每个路由文件我的顶部:

if (typeof require.ensure !== 'function') require.ensure = (d, c) => c(require); 

,当我在开发中使用require('babel/register')其中一期工程,但我宁愿有生产编译的文件。

回答

6

我已经解决了这个需求周围的条件。如果它是浏览器版本,require.ensure,如果它是服务器版本,只需要。我用的是DefinePlugin来定义“常量”变量为每个制作环境,所以它看起来像

if (BUILD_BROWSER) { 
    require.ensure('foo.js', function() { ... }); 
} else { 
    require('foo.js'); 
    ... 
} 

的WebPack的静态分析仅是足够聪明,明白布尔值,所以做这样的事情if (BUILD_TARGET === 'browser')不会工作;解析器将不会遵循逻辑并将处理这两个要求。

如果您使用的是Uglify插件,它会去掉不需要的条件逻辑,这样您就不会膨胀您的生产版本。

+0

谢谢!像魅力一样工作。 – Brad

+0

但是你有React的问题,校验和在服务器端呈现的HTML和客户端上生成的HTML之间不匹配,从而失去了服务器端呈现的许多“优点”。即服务器和客户端都呈现不同的HTML。另外,我甚至不知道如何在客户端上有条件地从嵌入在DOM中的不同js包(您只为给定路径呈现)加载,而现在不触发主包来包含相同的文件。看起来它只能通过为每条路线创建入口点,而不是'确保'。 –