如何使用 babel-loader 转换 node_modules 模块?

Posted

技术标签:

【中文标题】如何使用 babel-loader 转换 node_modules 模块?【英文标题】:How to transpile node_modules modules with babel-loader? 【发布时间】:2019-05-31 07:04:08 【问题描述】:

问题:我想为旧版浏览器 (>= IE10) 的网站构建捆绑文件。

当我使用babel-loader 转译带有babel 7.x 的代码时,我转译的代码在旧Internet Explorer 11 上引发错误,因为似乎node_modules 模块默认不会再转译?

问题:如果我的所有 node_module 模块还没有被包作者转译,我该如何确保它们都被转译?

webpack.config.js 使用 babel-loader

// webpack.config.js
rules: [
    
        test: /\.(js|jsx)$/,
        use: [
            
                loader: 'babel-loader',
            ,
        ],
        exclude: [],
    ,
],

babelrc.js 配置使用 babel 7.x

// .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 的配置文件,参见 here。

因此,在将 babel 配置文件从“.babel.rc”重命名为“babel.config.js”后,我可以在here 描述的“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)\/).*/, 
    ,
],

问题:感觉像是变通方法,但没有更方便的方法来处理此类问题吗?我只是假装在不久的将来会有越来越多未转换的包(在this discussion 之后),我们是否总是必须手动将包名称放入 webpacks 的exclude 规则中?

【问题讨论】:

您可以确保不向exclude: [] 选项添加任何内容。 @PlayMa256:你的意思是在webpack.config.js?我已经尝试过了,但它并没有改变任何东西。将exclude: [] 添加到.babelrc.js 配置相同,没有变化。 看看这个github.com/webpack/webpack/issues/2031 好的,这是 babel 的问题。我的 babel 配置被命名为 ´.babel.rc` 并且在游戏中的某处 babel 将查找 babel 配置文件的默认设置更改为 babel.config.js,请参见此处:babeljs.io/docs/en/options#configfile。因此,重命名配置文件后,exclude: /node_modules\/(?!(MY_MODULE |ANOTHER-ONE)\/).*/, 解决方案现在可以正常工作了。 谢谢!!!特别是这个页面帮助了我babeljs.io/docs/en/config-files#6x-vs-7x-babelrc-loading 【参考方案1】:

问题:感觉像是变通方法,但没有更方便的方法吗? 处理此类问题的方法?我只是假装会有越来越多 在不久的将来外面的未改造的包裹(遵循这个 讨论),我们是否总是需要手动输入包名 为它在 webpacks 的排除规则中??

您可以使用are-you-es5 等模块自动创建异常列表或测试:https://www.npmjs.com/package/are-you-es5

如果指向您的node_moduleseslint-plugin-compat 之类的内容可能会警告您出现问题:https://www.npmjs.com/package/eslint-plugin-compat

虽然它并不完美。我认为在一般的生产环境中,您应该在添加它们之前了解您添加的包,或者如果 IE11 对您的项目至关重要,则可以进行一些自动化测试来捕获浏览器错误。

我知道这并不总是可能的,但我强烈建议将 IE11 及以下版本推向一些较低级别的支持。在使用现代 JS 时,仍然很难维护 IE11 及以下版本。

【讨论】:

以上是关于如何使用 babel-loader 转换 node_modules 模块?的主要内容,如果未能解决你的问题,请参考以下文章

使用 vue-cli 设置时如何从 babel-loader 中排除特定文件?

带有 babel 的 webpack 显示错误模块构建失败(来自 ./node_modules/babel-loader/lib/index.js):

Gatsby - 错误:找不到模块 '..\node_modules\gatsby\dist\utils\babel-loader.js'

.38-浅析webpack源码之babel-loader转换js文件

模块构建失败(来自./node_modules/babel-loader/lib/index.js):错误:找不到模块'babel-preset-react'

什么是 node-libs-browser,为什么在我安装 babel-loader 时会安装它