首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WebPack CommonsChunkPlugin提取重复的javascript代码

使用WebPack CommonsChunkPlugin提取重复的javascript代码
EN

Stack Overflow用户
提问于 2017-08-01 21:20:06
回答 2查看 2.6K关注 0票数 10

我使用WebPack CommonsChunkPlugin提取重复代码并减少JavaScript代码大小。我有两个html页面和两个条目。此外,我还添加了ReactJs、供应商条目。到目前为止,在webpack.config.js中我们有:

代码语言:javascript
复制
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配置中添加了以下行:

代码语言:javascript
复制
new webpack.optimize.CommonsChunkPlugin({
    name: 'lodash',
    minChunks: function(module, count) {
        return module.context.indexOf('node_modules/lodash') >= 0;
    }
}), 

但是它并没有像预期的那样工作,同时寄存库代码仍然在家里和关于捆绑包中,webpack还创建了一个名为协调性的包,它几乎是空的,并且不包含js库。

知道怎么修吗?提取绿色代码如何?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-02 21:23:51

我通过在插件中添加一个公共块来解决这个问题。所以最后webpack的配置是:

代码语言:javascript
复制
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反应库和存档库现在只是一个公共的包,不再重复了。

票数 1
EN

Stack Overflow用户

发布于 2017-08-02 02:40:03

您的问题是,您在每个.js/.jsx文件中导入第三方库,而不是以前在公共文件(通常称为vendor.js)中导入它。

如果您有一个导入所有依赖项的文件,并且将它作为条目并包含到CommonsChunkPlugin中,webpack将不再将您的库包含在最后的包中(home.jsabout.js)。这种技术被称为webpack文档中的代码分裂

vendor.js (或适合您的名称)

代码语言:javascript
复制
import 'react';
import 'react-dom';
import 'lodash';
import 'semantic-ui-react';
//... all your npm packages

webpack.config.js

代码语言:javascript
复制
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

代码语言:javascript
复制
<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代码拆分文档:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45447873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档