Webpack2 node-libs-browser排除?

CWr*_*ght 10 node.js webpack webpack-2

我已经升级到webpack 2,在树摇动之前我的包大小增加了.在调查为什么看来我得等大文件bn.jseliptic(节点库浏览器的一些依赖-这本身就是现在webpack2的依赖).有没有办法删除它们或排除它们?在webpack1中,他们没有被添加到我的包中.

Joe*_*hen 12

问题是因为默认情况下webpack NodeSourcePlugin 在这里这里为webworker应用它的内部插件,如果你有一个甚至引用NodeJS 模块的模块,例如crypto:var Crypto = canUseDom ? null : require("crypto"),webpack将捆绑一堆大文件来模拟NodeJS.请参阅此处提交的问题https://github.com/webpack/webpack/issues/4976.

解决方案是避免引用NodeJS内部模块的任何代码,即使它们未在浏览器上使用.

要捕获这些,可以NodeSourcePlugin通过覆盖target选项来删除.

const webpack = require("webpack");
const FunctionModulePlugin = require("webpack/lib/FunctionModulePlugin");

const output = {
  path: process.cwd() + "/build",
  filename: "bundle.[hash].js"
};

{
  target: () => undefined,
  output,
  plugins: [
    new webpack.JsonpTemplatePlugin(output),
    new FunctionModulePlugin(output),
    new webpack.LoaderTargetPlugin("web"),
  ]
}
Run Code Online (Sandbox Code Playgroud)

编辑:使用webpack 3,它现在很简单:

const webpackConfig = {
  node: false
}
Run Code Online (Sandbox Code Playgroud)

如果您必须具有仅用于服务器端的代码并引用NodeJS模块,则最好将它们分隔到自己的模块中,并通过该browser字段导出虚拟副本package.json.

编辑:我在这里写了一篇与此问题相关的博客https://medium.com/walmartlabs/webpack-optimization-a-case-study-92b130334b6c.