Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 网页包排除CommonChunkPlugin的条目_Javascript_Reactjs_Webpack - Fatal编程技术网

Javascript 网页包排除CommonChunkPlugin的条目

Javascript 网页包排除CommonChunkPlugin的条目,javascript,reactjs,webpack,Javascript,Reactjs,Webpack,我正在尝试设置网页包生产配置。一切看起来都很好。然而,我意识到在使用commons chunk插件时,它像预期的那样覆盖了所有公共文件。我想做的是,分离公共库模块和公共应用程序模块。我的配置文件是: module.exports = { entry: { lib: ["react", "react-dom"], app: "./ui-v2/app/app.js", app2: "./ui-v2/app/app2.js" }, output: { pat

我正在尝试设置网页包生产配置。一切看起来都很好。然而,我意识到在使用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
app..min.js->3.05KB
app2..min.js->3.05KB
lib..min.js->165字节(几乎没有!)
公共..js->678 KB

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

这是因为CommonChunkPlugin的第一个参数是“common”,应该是“lib”。插件将获取名称与其第一个参数值匹配的条目

从中选取一个简单的配置示例-


请注意,CommonChunkPlugin中再次指定了“供应商”条目。您应该查看Webpack的DLL插件

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

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

您的项目将包含DLL引用插件,如您在此处所见:


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

yepp,没错,但是,我希望看到4个捆绑包,其中app.js是自包含的组件代码,app2.js也是包含sef的组件代码,lib.js“只有“react,lodash”之类的库,第4个是”应用程序中的commons“这是我创建的用户组件,而不是库。正如问题的标题所示,我想要实现的是创建两个公共空间,第一个只是第三方,第二个是我自己的子库,我不希望库和通用应用程序组件在同一个捆绑包中。谢谢你的回答,但我知道你想要的是->app.js、app2.js、coomon.js和lib.js。在common,js中,你想把所有你自己的代码都放在app和app2中?请确认。请尝试此-
新网页包。优化.commonChunkPlugin({name:“common”,fileName:“app/common.[chunkhash].js”,chunks:[app,app2]}),
。这将只在指定的条目块中使用公共代码。更多信息。您正在使用两个CommonChunkPlugin实例,对吗?一个用于lib,正如我在回答中所指出的,另一个用于处理两个应用程序中的公共块。不,但我现在添加了,没关系。男士:)非常感谢,你很酷:)很棒的提示!DLLPlugin为我节省了这么多时间…我希望它能有更多的文档记录和推荐。一定有太多的网页用户使用了>2s的增量编译,但他们没有意识到有更好的方法…DLL工作得很好--我们已经将10多秒的重新编译时间缩短到了2-3秒左右。与HappyPack相结合,您的构建将非常快速。
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")
  ]
};