【问题标题】:Webpack exclude entries for CommonsChunkPluginWebpack 排除 CommonsChunkPlugin 的条目
【发布时间】:2016-01-22 07:47:00
【问题描述】:

我正在尝试设置 webpack 生产配置。一切看起来都很好。但是,我意识到,在使用 commons chunk 插件时,它涵盖了所有共同的文件,正如预期的那样。我想要做的是,公共库模块和公共应用程序模块的分离。我的配置文件是:

module.exports = {
  entry: {
    lib: ["react", "react-dom"],
    app: "./ui-v2/app/app.js",
    app2: "./ui-v2/app/app2.js"
  },
  output: {
    path: path.join(__dirname, "target/ui/v2"),
    filename: "/app/[name].[chunkhash].min.js"
  },
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: "babel-loader"
      },
      {
        test: /\.(png|jpg|svg)/,
        loader: "file-loader?name=img/[name].[hash].[ext]"
        // loaders: ["url", "image-webpack"]
      },
      {
        test: /\.scss$/,
        loader: ExtractTextPlugin.extract("style-loader", "css-loader!autoprefixer-loader!sass-loader", {
          publicPath: __dirname
        })
      },
      {
        test: /\.(woff|woff2|ttf|eot)$/,
        loader: "file-loader?name=fonts/[name].[hash].[ext]"
      }
    ]
  },
  plugins: [
    clean,
    new webpack.optimize.CommonsChunkPlugin("common", "app/common.[chunkhash].js"),
    new webpack.ProvidePlugin({
      React: "react",
      ReactDOM: "react-dom",
      $: "jquery",
      _: "lodash"
    }),
    new webpack.optimize.UglifyJsPlugin({
      compress: {
      warnings: false
      sourceMap: true
    },
    mangle: {
    except: ["exports", "import", "$", "_", "require", "React", "ReactDOM"]
    }
    }),
    new ExtractTextPlugin("styles/[name].[contenthash].css"),
    new Manifest()
  ]
}

基本上我在应用中有 3 个模块; app.js、app2.js 和一个通用组件 user.js。

我想要实现的是将所有与库相关的文件(如 react、react-dom、lodash 等)捆绑在一个 lib 包中,并将常见的应用程序组件(如 user.js)捆绑在一个通用包中。为了做到这一点,我认为可能有一个选项可以排除我不希望它们进入“通用”文件的文件。如果我使用这个输出,那么长期缓存库包的文件有什么意义,因为每当我在项目中获得一个公共组件时,它们都会进入公共包并且内容哈希会有所不同,但这个库中没有任何变化react、jquery、lodash 等文件。

无论如何,我在构建过程结束时所拥有的一切仍然进入公共捆绑包,而 lib 什么都没有,文件大小为:

app.<hash>.min.js -> 3.05KB
app2.<hash>.min.js -> 3.05KB
lib.<hash>.min.js -> 165 Bytes (has almost nothing!)
common.<hash>.js -> 678 KB

有什么方法可以实现我想要的,或者在类似情况下,生产构建的最佳方法是什么?谢谢!

【问题讨论】:

    标签: javascript reactjs webpack


    【解决方案1】:

    这是因为 CommonsChunkPlugin 的第一个参数是“common”,而应该是“lib”。该插件会选择名称与其第一个参数的值匹配的条目。

    webpack's wiki 中挑选的一个简单示例配置 -

    var webpack = require("webpack");
    
    module.exports = {
      entry: {
        app: "./app.js",
        vendor: ["jquery", "underscore", ...],
      },
      output: {
        filename: "bundle.js"
      },
      plugins: [
        new webpack.optimize.CommonsChunkPlugin(/* chunkName= */"vendor", /* filename= */"vendor.bundle.js")
      ]
    };
    

    请注意,CommonsChunkPlugin 中再次指定了“供应商”条目

    【讨论】:

    • 是的,没错,但是,我希望在那里看到 4 个捆绑包,它们是 app.js 作为自包含组件代码,app2.js 也是 sef 包含组件代码,lib.js “仅有像“react,lodash”这样的库,第4个是“应用程序中的公共资源”,它是我创建的用户组件,而不是库。就像问题的标题一样,我想要实现的是创建两个公共,第一个只是第 3 方,第二个是我自己的子库,我不希望库和公共应用程序组件在同一个包中。谢谢你的回答,但我知道
    • 所以你想要的是这个 -> app.js、app2.js、coomon.js 和 lib.js。在 common,js 中,您想放置所有自己的代码,这些代码在 app 和 app2 中都是通用的吗?请确认。
    • 请试试这个 - new webpack.optimize.CommonsChunkPlugin({name: "common", fileName: "app/common.[chunkhash].js", chunks:[app, app2]}),。这只会采用指定条目块中的通用代码。更多信息here.
    • 您正在使用两个 CommonChunkPlugin 实例,对吗?正如我在回答中指出的那样,一个用于 lib,另一个用于处理两个应用程序中的公共块。
    • 不,但我现在添加了,没关系 :) 非常感谢,你很酷 :)
    【解决方案2】:

    您应该查看 Webpack 的 DLL 插件。

    https://github.com/webpack/webpack/blob/cb3d8e2097503c7245c5dda5b7a6e9d63421a72b/examples/dll/README.md

    使用此插件,您可以将常见的第 3 方供应商依赖项(例如 React 和朋友)捆绑在一个 DLL 中,它本质上只是一个 JSON 清单,与您的需求一起包装在 webpack 上下文中并缓存到磁盘。

    在您的项目代码中,您将拥有依赖于 React 和好友的共享组件,并且您将拥有依赖于您的共享组件以及 React 和好友的应用程序代码。

    您的项目将包含 DLL 参考插件,您可以在此处看到:

    https://github.com/webpack/webpack/blob/cb3d8e2097503c7245c5dda5b7a6e9d63421a72b/examples/dll-user/README.md

    这将确保您的共享组件和应用程序代码从同一个 DLL 包中提取 React 和其他 3rd 方模块。这有助于缩短构建时间以及开发服务器和热模块重新加载的性能。

    【讨论】:

    • 很棒的提示! DLLPlugin 为我节省了很多时间......我希望它有更多的文档记录和更多的推荐。肯定有这么多 webpack 用户使用 >2s 增量编译没有意识到有更好的方法......
    • DLL 运行良好——我们的 10 多秒重新编译时间缩短到 2-3 秒左右。与 HappyPack 结合使用,您的构建速度会非常快。
    猜你喜欢
    • 1970-01-01
    • 2018-06-19
    • 2018-08-07
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2017-09-02
    相关资源
    最近更新 更多