【问题标题】:Webpack: how to bundle entries to multiple common chunks with CommonsChunkPlugin?Webpack:如何使用 CommonsChunkPlugin 将条目捆绑到多个公共块?
【发布时间】:2016-03-10 05:24:29
【问题描述】:

假设我有两个页面Page1Page2,它们都使用一些库(供应商),如jquerybackbone,我想将其提取为单个文件,然后我想要共享模块(排除供应商)要提取到另一个文件中,这是 webpack 配置:

function listFiles(srcpath) {
    return fs.readdirSync(srcpath).filter(function (file) {
        return fs.statSync(path.join(srcpath, file)).isDirectory();
    });
}
var createEntry = function (src) {
    var dest = {
        vendor: ["backbone", "underscore"]
    };
    var files = listFiles(src);
    files.forEach(function (dir) {
        var name = dir;
        dest[name] = src + "/" + dir + "/entry.js";
    });
    return dest;
};

//each sub directory contains a `entry.js` as the entry point for the page
var entries = createEntry("./app/pages");//    {vender:['jquery','backbone'],page1:'src/page1/entry.js',page2:'src/page2/entry.js'    }

var config = {
    resolve: {
        root: path.resolve('./app/'),
        extensions: ['', '.js']
    },

    plugins: [
        new webpack.optimize.CommonsChunkPlugin("vendor", "vendor.js", Infinity),
        new webpack.optimize.CommonsChunkPlugin({
            name: 'common',
            filename: 'common.js',
            minChunks: 2
        })
    ],
    entry: entries,
    output: {
        path: './../main/webapp/static/dist',
        filename: '[name].js',
        publicPath: '/static/dist'
    }
};
module.exports = config;

但是使用上面的配置:

common.js 包含 webpack 运行时,

page1.js包含page1指定模块和共享模块

page2.js包含page2个指定模块和共享模块

这意味着page1.jspage2.js 包含太多重复代码。

然后我尝试更改配置:

var entries = createEntry("./app/pages");
var chunks = [];
for (var k in entries) {
    if (k === 'vendor')
        continue;
    chunks.push(k);
}


new webpack.optimize.CommonsChunkPlugin("vendor", "vendor.js", Infinity),
new webpack.optimize.CommonsChunkPlugin({
    name: 'common',
    filename: 'common.js',
    minChunks: 2,
    chunks:chunks
}),

然后

common.js 包含 webpack 运行时和供应商库,以及共享模块

vendor.js 包含 webpack 运行时和供应商库。

page1.js包含第1页指定的模块

page2.js 包含 page2 指定模块

似乎越来越近了,但common.js 不应包含供应商

有什么问题吗?

【问题讨论】:

    标签: javascript webpack


    【解决方案1】:

    如果您想要多个通用块包,则必须为每个通用包指定所有块详细信息,如 in the example 所示:

    var config = {
    
        entry: {
            vendor: ["backbone", "underscore"],
            common: "./app/pages/common/entry.js",
            page1: "./app/pages/page1/entry.js",
            page2: "./app/pages/page2/entry.js"
        },
    
        plugins: [
            new webpack.optimize.CommonsChunkPlugin({
                name: "vendor",
                chunks: ["vendor"]
            }),
            new webpack.optimize.CommonsChunkPlugin({
                name: "common",
                chunks: ["common"]
            })        
        ]
    };
    

    请注意,CommonsChunkPluginchunks 选项指的是您定位的条目的名称。由于您想将 vendorcommon 分开,您必须明确表示您只希望 vendor 进入 vendor common-chunk 和 common 相同。

    【讨论】:

    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 2017-05-08
    • 2018-05-21
    • 2017-07-12
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多