问题:我想为一个支持较老的浏览器(>=IE10)的网站建立捆绑文件。
使用 babel 7.x
以及 babel-loader
转译时,我的转译代码在旧版 Internet Explorer 11 上出现错误,因为似乎默认情况下 node_modules
模块不会再被转译了?
node_module
模块都被转译了呢?
webpack.config.js 使用 babel-loader
// webpack.config.js
rules: [
{
test: /\.(js|jsx)$/,
use: [
{
loader: 'babel-loader',
},
],
exclude: [],
},
],
使用Babel 7.x的babelrc.js配置
// .babelrc.js
module.exports = function(api) {
const presets = [
[
'@babel/preset-env',
{
useBuiltIns: 'usage',
ignoreBrowserslistConfig: true,
targets: {
node: 8,
browsers: [
'last 3 versions',
'> 1% in DE',
'Explorer >= 10',
],
},
},
],
'@babel/preset-react',
];
const plugins = [
// ...
];
return {
presets,
plugins,
};
};
更新 1:
这是一个 babel 的问题。我的 babel 配置文件命名为 .babel.rc
,而 babel 7 的默认设置是寻找名为 babel.config.js
的配置文件,请参见此处。
因此,将 babel 配置文件从´.babel.rc´重命名为´babel.config.js´后,我可以在我的´webpack.config.js´中应用解决方案,如此处所述,以转换未转换的´node_modules´包的解决方案类似于以下内容:
// webpack.config.js
rules: [
{
test: /\.(js|jsx)$/,
use: [
{
loader: 'babel-loader',
},
],
// Exclude the untransformed packages from the exclude rule here
exclude: /node_modules\/(?!(MY_MODULE|ANOTHER-ONE)\/).*/,
},
],
问题:感觉这只是一种变通方法,但没有更方便的处理这些问题的方式吗?我认为在不久的将来会有越来越多未转换的包(参考此讨论),我们总是需要手动将包名称放入 webpack 的exclude
规则中吗?
exclude: []
选项中添加任何内容。 - PlayMa256webpack.config.js
中吗?我已经尝试过了,但没有任何变化。同样,在.babelrc.js
配置中添加exclude: []
也没有变化。 - Michael.babel.rc
,但是在某个时候,babel 更改了查找 babel 配置文件的默认设置为babel.config.js
,请参考此处链接:https://babeljs.io/docs/en/options#configfile。因此,在重命名配置文件后,exclude: /node_modules\/(?!(MY_MODULE |ANOTHER-ONE)\/).*/,
解决方案现在可以正常工作了。 - Michael