使用多个入口点包含 babel polyfill 的最佳方法是什么

What is the best way to include babel polyfill using multiple entry points

我正在使用使用多个入口点的 webpack 配置:

var fs = require('fs');
var webpack = require('webpack');
var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common.[hash].js');

module.exports = {
    cache: true,
    entry: {
        main: './resources/assets/js/main.js',
        services: './resources/assets/js/services.js'
    },
    output: {
        path: './public/assets/web/js',
        filename: '[name].[hash].js',
        publicPath: '/assets/web/js/',
        chunkFilename: '[id].[chunkhash].js'
    },
    resolve: {
        modulesDirectories: ['node_modules', 'web_modules', 'modules']
    },
    module: {
        loaders: [{
            test: /\.js$/,
            exclude: [/node_modules/, /web_modules/],
            loader: 'babel-loader',
            query: {
                stage: 0
            }
        }]
    },
    plugins: [commonsPlugin,
        new webpack.ProvidePlugin({
            jQuery: 'jquery',
            $: 'jquery',
            'window.jQuery': 'jquery'
        }),
        function() {
            this.plugin('done', function(stats) {
                fs.writeFile('./cache.json', JSON.stringify({
                    hash: stats.hash
                }));
            });
        }
    ]
};

有什么方法可以在我的 webpack 配置中包含 babel polyfill 吗?或者将其包含在我的设置中的最佳方式是什么?

我是否必须将它作为要求包含在我的所有模块中?

非常感谢您!

最简单的方法是更改​​

main: './resources/assets/js/main.js',
services: './resources/assets/js/services.js'

成为

main: ['babel-polyfill', './resources/assets/js/main.js'],
services: ['./resources/assets/js/services.js']

以便 polyfill 作为每个入口点的一部分加载和执行,而您的文件不需要知道它。

这假设 mainservices 都加载到同一页面上。如果它们是两个单独的页面,您需要在两个数组中都有 babel-polyfill 条目。

备注

以上适用于 Babel 5。对于 Babel 6,您需要 npm install --save babel-polyfill 并使用 babel-polyfill 而不是 babel/polyfill

开发的另一种选择(可能不是生产的最佳设置)是在其自己的模块中包含 babel-polyfill

entry: {
    'babel-polyfill': ['babel-polyfill'],
    main: './resources/assets/js/main.js',
    services: './resources/assets/js/services.js'
}

背景:我尝试了上面答案中的建议,但仍然出现错误:"Only one instance of babel-polyfill is allowed"。我正在使用 webpack 2,所以这可能是一个因素。上面的解决方案对我来说很好,因为我正在编写一个可重用的库以包含在更大的应用程序中,并且只想在库回购中有一个单独的演示包用于测试目的。但是对于一个完整的应用程序,除非您使用 HTTP/2.

,否则要求额外的 HTTP 请求在生产环境中加载 polyfill 可能不是一个好主意。