Подтвердить что ты не робот

Извлечение общих кусков среди множества конфигураций компилятора в webpack?

Я пытаюсь использовать параметр multi-compiler в webpack и следую example в своем github. Однако я не могу понять, как я могу разделить общий код среди множества конфигураций.

Например, у меня могут быть одинаковые библиотеки поставщиков, используемые в разных наборах конфигураций. Я хотел бы, чтобы эти общие коды были объединены в один общий файл.

Я попробовал следующее, но в итоге создал отдельные пакеты записи vendors для каждой конфигурации компиляции.

var path = require("path");
var webpack = require("webpack");
module.exports = [
    {
        name: "app-mod1",
        entry: {
            vendors: ['jquery', 'react', 'react-dom'],
            pageA: ['./mod1/pageA'],
            pageB: ['./mod1/pageB']
        },
        output: {
            path: path.join(__dirname, "/mod1/js"),
            filename: "[name].bundle.js"
        },
        plugins: [
            new webpack.optimize.CommonsChunkPlugin({
                names: ['vendors'],
                minChunks: Infinity
            })
        ]
    },
    {
        name: "app-mod2",
        entry: {
            vendors: ['lodash', 'react', 'react-dom'],
            pageA: ['./mod2/pageA'],
            pageB: ['./mod2/pageB']
        },
        output: {
            path: path.join(__dirname, "/mod2/js"),
            filename: "[name].bundle.js"
        },
        plugins: [
            new webpack.optimize.CommonsChunkPlugin({
                names: ['vendors'],
                minChunks: Infinity
            })
        ]
    }
];

Так как реакция, реакция-достояние разделяются между двумя компиляциями, я намерен их объединить в виде одного файла, который может быть общим, вместо того, чтобы создавать один и тот же комплект для каждой компиляции.

Как я могу извлечь общие куски из нескольких конфигураций компилятора?

4b9b3361

Ответ 1

Краткий ответ

Вы не можете выполнять эту работу так, как хотите.

TL; DR

@Carven, я боюсь, что вы не можете достичь своей цели с помощью MultiCompiler Webpack, MultiCompiler не предназначен для выполнения этой работы, по крайней мере для близкой функции.

Смотрите исходный код для запуска экземпляра MultiCompiler, он фактически инициирует отдельные экземпляры Compiler. Этот компилятор не имеет общих данных.

См. также источник запуска экземпляра MultiCompiler, экземпляр компиляторов также запускается отдельно без совместного использования данных.

Единственное, что разделяют эти компиляторы - это экземпляр Stats, который они создают, и объединяются в MultiStats.

Кстати, в в примере, о котором вы говорили, нет никакой информации о том, что некоторые модули разделяются между несколькими компиляторами.

Alternative

Как описано в @Tzook-Bar-Noy, IMHO, вы должны использовать muti-записи для создания пакета MPA (многостраничное приложение).

Другое значение, которое стоит упомянуть

Я заметил, что библиотека под названием webpack-multi-configurator использует функцию мультикомпилятора. Но я не думаю, что он будет обмениваться общими частями.

Ответ 2

Я узнал об этом сейчас, и эта тема кажется довольно трудной для понимания в документах webpack. Мне удалось создать что-то, что работает, поскольку оно создало 2 отдельных файла и извлекло общие зависимости к другому файлу.

Вот мой конфигуратор webpack:

{
    entry: {

        pageA: "./first/first",
        pageB: "./second/second"
    },
    output: {
        path: path.join(__dirname, "js"),
        filename: "[name].js"
    },
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            names: ["vendor", "common"],
        })
    ]
};

вывод этого будет:

./js/
    common.js
    vendor.js
    pageA.js
    pageB.js

Я создал репо с примером, над которым я работал: https://github.com/tzookb/webpack-common-vendor-chunks

когда я открываю новый html файл, я загружаю эти файлы:

 first page:
     common.js
     vendor.js
     pageA.js

 sec page:
     common.js
     vendor.js
     pageB.js