我使用WebPack CommonsChunkPlugin提取重复代码并减少JavaScript代码大小。我有两个html页面和两个条目。此外,我还添加了ReactJs、供应商条目。到目前为止,在webpack.config.js中我们有:
var path = require("path");
var webpack = require('webpack');
var BundleTracker = require('webpack-bundle-tracker');
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
context: __dirname,
entry: {
react: ["react", "react-dom"],
home: './assets/js/home.jsx',
about: './assets/js/about.jsx',
},
output: {
path: path.resolve('./assets/bundles/'),
filename: "[name].js",
},
plugins: [
new BundleTracker({filename: './webpack-stats.json'}),
new webpack.optimize.CommonsChunkPlugin({
name: 'react',
minChunks: Infinity
}),
new BundleAnalyzerPlugin(),
],
module: {
rules: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
plugins: [["lodash", { "id": ["semantic-ui-react"] }]],
presets: ["es2015", "react"]
}
},
],
},
resolve: {
modules: ['node_modules', 'bower_components'],
extensions: ['*', '.js', '.jsx']
},
};此配置结果使用webpack-bundle-analyzer

正如你所看到的,有一些重复的代码,一些在红色区域,另一些在绿色区域。我想将这些js代码从家中提取出来,并将其打包到一个单独的包中。为了提取红色区域代码,即库,我在webpack配置中添加了以下行:
new webpack.optimize.CommonsChunkPlugin({
name: 'lodash',
minChunks: function(module, count) {
return module.context.indexOf('node_modules/lodash') >= 0;
}
}), 但是它并没有像预期的那样工作,同时寄存库代码仍然在家里和关于捆绑包中,webpack还创建了一个名为协调性的包,它几乎是空的,并且不包含js库。
知道怎么修吗?提取绿色代码如何?
发布于 2017-08-02 21:23:51
我通过在插件中添加一个公共块来解决这个问题。所以最后webpack的配置是:
var path = require("path");
var webpack = require('webpack');
var BundleTracker = require('webpack-bundle-tracker');
module.exports = {
context: __dirname,
entry: {
react: ["react", "react-dom"],
home: './assets/js/home.jsx',
about: './assets/js/about.jsx',
},
output: {
path: path.resolve('./assets/bundles/'),
filename: "[name].js",
},
plugins: [
new BundleTracker({filename: './webpack-stats.json'}),
new webpack.optimize.CommonsChunkPlugin({
name: 'react',
filename: '[name].js',
minChunks: Infinity,
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'common',
chunks: ['home', 'about'],
filename: '[name].js',
}),
],
module: {
rules: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
plugins: [
["lodash", { "id": ["semantic-ui-react"] }]
],
presets: ["es2015", "react"]
}
},
],
},
resolve: {
modules: ['node_modules', 'bower_components'],
extensions: ['*', '.js', '.jsx']
},
};现在,bundle分析器的输出如下:

如图中所示,公共语义-ui反应库和存档库现在只是一个公共的包,不再重复了。
发布于 2017-08-02 02:40:03
您的问题是,您在每个.js/.jsx文件中导入第三方库,而不是以前在公共文件(通常称为vendor.js)中导入它。
如果您有一个导入所有依赖项的文件,并且将它作为条目并包含到CommonsChunkPlugin中,webpack将不再将您的库包含在最后的包中(home.js和about.js)。这种技术被称为webpack文档中的代码分裂。
vendor.js (或适合您的名称)
import 'react';
import 'react-dom';
import 'lodash';
import 'semantic-ui-react';
//... all your npm packageswebpack.config.js
var webpack = require('webpack');
var path = require('path');
module.exports = {
context: __dirname,
entry: {
vendor: './assets/js/vendor.js,
home: './assets/js/home.jsx',
about: './assets/js/about.jsx',
},
output: {
path: path.resolve('./assets/bundles/'),
filename: '[name].js',
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: Infinity
}),
],
//Rest of Your config ...
};index.html
<body>
<!-- AFTER YOUR HTML CODE -->
<script type="text/javascript" src="/assets/bundles/vendor.js"></script>
<script type="text/javascript" src="/assets/bundles/home.js"></script>
<script type="text/javascript" src="/assets/bundles/about.js"></script>
</body>
查看webpack代码拆分文档:
https://stackoverflow.com/questions/45447873
复制相似问题