我正在使用多个入口点的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 。或者在我的设置中包含它的最佳方式是什么?
我是否必须在所有模块中将其作为要求包含在内?
非常感谢你!
答案 0 :(得分:72)
最简单的方法是改变
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就会被加载并作为每个入口点的一部分执行,而你的文件不需要知道它。
这假设main
和services
都加载在同一页面上。如果它们是两个单独的页面,则您需要两个数组中的babel-polyfill
条目。
以上内容适用于Babel 5.对于Babel 6,您需要npm install --save babel-polyfill
并使用babel-polyfill
代替babel/polyfill
。
答案 1 :(得分:7)
开发的替代方案(可能不是生产的最佳设置)是在自己的模块中使用babel-polyfill
:
entry: {
'babel-polyfill': ['babel-polyfill'],
main: './resources/assets/js/main.js',
services: './resources/assets/js/services.js'
}
背景:我在上面的答案中尝试了这个建议并且仍然出现错误:"只允许一个babel-polyfill实例"。我使用的是webpack 2,所以也许这是一个因素。上面的解决方案对我来说很好,因为我正在编写一个可重用的库以包含在更大的应用程序中,并且只是想在库仓库中使用单独的演示包进行测试。但对于完整的应用程序,除非您使用HTTP / 2,否则要求额外的HTTP请求在生产中加载polyfill可能不是一个好主意。