Как настроить веб-пакет - libraryTarget + splitChunks + требуемый в borwser - PullRequest
1 голос
/ 28 мая 2019

Я пишу библиотеки для веб-страниц в JS и "компилирую" их с помощью Webpack.Мне нужно импортировать / требовать (например, requirejs) эту библиотеку на страницах, которые находятся в отдельных проектах Webpack.Lib может быть размещен по двум отдельным путям - один относительный, а второй абсолютный.Как мне настроить веб-пакеты для экспорта библиотек, которые можно импортировать / требовать в другом проекте?

Я пробовал umd, amd, window, this и т. Д. LibraryTarget, и во всех случаях ответ на require не определен или выдает ошибку.

Моя конфигурация веб-пакета libs:

const HtmlWebPackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');

let glob = require('glob'),
    entryObject = glob.sync('./src/js/*.js').reduce(
        function (entries, entry) {
            let matchForRename = /^\.\/src\/(.+)\.js$/g.exec(entry);

            if (matchForRename !== null && typeof matchForRename[1] !== 'undefined') {
                let entryName = matchForRename[1];

                if (typeof entries[entryName] !== 'undefined') {
                    entries[entryName].push(entry);
                } else {
                    entries[entryName] = [entry];
                }

            }

            return entries;
        }, {}
    );

module.exports = env => {
    return {
        devtool: env.production === 'true' ? false : 'eval-source-map',
        target: 'web',
        entry: entryObject,
        output: {
            chunkFilename: '[name].js',
            publicPath: 'dist/',
            libraryTarget: 'umd',
        },
        optimization: {
            splitChunks: {
                chunks: 'all',
                maxInitialRequests: Infinity,
                minSize: 0,
                cacheGroups: {
                    vendor: {
                        test: /[\\/]node_modules[\\/]/,
                        name(module) {
                            // get the name. E.g. node_modules/packageName/not/this/part.js
                            // or node_modules/packageName
                            const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];

                            // npm package names are URL-safe, but some servers don't like @ symbols
                            return `js/npm/${packageName.replace('@', '')}`;
                        },
                    }
                },
            }
        },
        module: {
            rules: [{
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                },
            }, ]
        },
        plugins: [
            new CleanWebpackPlugin(),
            new CopyWebpackPlugin([{
                from: 'src/php',
                to: 'php'
            }], {
                copyUnmodified: true
            })
        ]
    }
};

В проекте веб-страницы я пробовал что-то вроде этого (с requirejs):

window.require.config({
    baseUrl: '../../libs/',
    paths: {
        prod: 'http://example.com/libs/'
    }
});

window.require(['js/main'], function (main) {
        console.log(main);
    },
    function (err) {
        window.require(['prod/js/main'],
            function (main) {
                console.log(main);
            });
    }
);

или только через веб-пакет:

import('../../libs/js/main.js').then(function (main) {
            console.log('ok');
        })
        .catch(function (error) {});
    try {
        require(['../../libs/js/main.js'], function (main) {
            console.log(main);
        }, function (error) {});
    } catch (error) {}
    try {
        define('../../libs/js/main.js', [], function () {
            console.log('ok');
        }, function (error) {
            console.log('error');
        });
    } catch (error) {}
    try {
        define(['../../libs/js/main.js'], function () {
            console.log('ok');
        }, function (error) {
            console.log('error');
        });
    } catch (error) {}
    try {
        define('main', ['../../libs/js/main.js'], function () {
            console.log('ok');
        }, function (error) {
            console.log('error');
        });
    } catch (error) {}

Если я не использую опцию оптимизации в libs webpack conf, requirejs работает нормально, но если используется оптимизация requirejs retrun undefined: /.

...