【发布时间】: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