Webpack: пакет поставщика не импортируется в основной вывод - PullRequest
0 голосов
/ 04 ноября 2018

Я борюсь с тем, что похоже на общую ошибку Webpack после попытки оптимизировать мой исходный код.

Если у меня есть следующие файлы в ./src:

├── main.js
├── moduleA.js
└── moduleB.js
main.js imports and uses ModuleA.

moduleA.js imports and uses ModuleB

ModuleA.js and ModuleB.js both import flatten-array from node_modules

Я ожидаю, что если я попытаюсь оптимизировать свой пакет (см. Ниже), он выведет два файла:

1. index.js
2. vendors~main.index.js

Попытка выполнить выходной пакет index.js приводит к:

/******/        modules[moduleId].call(module.exports, module,
module.exports, __webpack_require__);
                                 ^

TypeError: Cannot read property 'call' of undefined

Несмотря на то, что файлы сгенерированы, index.js не отображается для поставщиков импорта ~ main.index.js. Тем не менее, он прекрасно работает при удалении оптимизации (и Javascript поставщиков)

Это правильное предположение? Как я могу заставить это работать так?

Хотя это пакет для Node, есть веские причины, по которым я хотел бы экспортировать файл поставщиков.

Сопровождающее репозиторий Git для воспроизведения доступно здесь:

https://github.com/supasympa/webpack-vendors-issue

Файлы:

main.js

const  moduleA  = require('./moduleA');

moduleA.log('log from main.js');

moduleA.js

const moduleB = require('./moduleB');
const flatten = require('array-flatten');

module.exports.log = function(msg){
    moduleB.log('logging from moduleA.js');
    console.log(`ModuleA logging: ${msg}`);
    console.log(`flattened: ${flatten([[1,2,3],[4,5],[6,7]])}`)
};

moduleB.js

const flatten = require('array-flatten');

module.exports.log = function(msg){
    console.log(`ModuleB logging: ${msg}`);
    console.log(`flattened: ${flatten([[1,2,3],[4,5],[6,7]])}`)
};

webpack.config.js

const CleanWebpackPlugin = require('clean-webpack-plugin');

    module.exports = {
        module: {
            rules: [{
                include: [path.resolve(__dirname, 'src')],
                loader: 'babel-loader',

                options: {
                    plugins: ['syntax-dynamic-import'],

                    presets: [['env', {
                        'modules': 'commonjs'
                    }]]
                },

                test: /\.js$/
            }]
        },

        entry: './src/main',
        target: 'node',

        output: {
            filename: 'index.js',
            path: path.resolve(__dirname, 'dist')
        },

        mode: 'development',

        optimization: {
            splitChunks: {
                cacheGroups: {
                    vendors: {
                        priority: -10,
                        test: /[\\/]node_modules[\\/]/,
                        enforce: true
                    },
                },
                // concatenateModules: false,
                chunks: 'all',
                minChunks: 1,
                minSize: 0,
                name: true
            }
        },

        plugins: [
            new CleanWebpackPlugin(['dist']),
        ]
    };

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Оказывается, это еще не реализовано вне браузера, в Webpack.

https://github.com/webpack/webpack/issues/8330

https://github.com/webpack/webpack/issues/8161

https://github.com/webpack/webpack/issues/8156

0 голосов
/ 05 ноября 2018

Определяя, chunks: 'all',, вы явно берете все начальные записи и асинхронный импорт (по умолчанию это только асинхронные блоки по требованию) и указываете упаковщик для создания из этого нового чанка / файла вендора.

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

Один из способов явно контролировать, что входит в файлы ввода, - это шаблон: https://github.com/webpack/webpack/tree/master/examples/two-explicit-vendor-chunks

...