【问题标题】:Why is Babel 7 not compiling node_modules files?为什么 Babel 7 不编译 node_modules 文件?
【发布时间】:2019-07-14 06:55:34
【问题描述】:

我在 IE11 SCRIPT1002 中有错误:语法错误(类语法问题)。 我的简单代码有 2 行:

import { struct } from 'superstruct';
console.log('finished');

我不希望我的 babel7 将类编译成 ES5 代码

我试过写 .babelrc 文件:

 {
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "ie": "11"
        }
      }
    ]
  ]
}

https://babeljs.io/docs/en/babel-plugin-transform-classes 也没有修复

更新: 我试过使用 @babel/plugin-preset-es2015 来转换 ES5 代码中的类,但是这个包在 babel7 中被弃用了

请帮帮我

【问题讨论】:

  • 你是否也安装了@babel/core
  • 如果你不需要,你可以排除所有节点模块除了 qs 或包含编译
  • "@babel/core": "^7.0.0 and { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules___(hardcode)____/ } 但是它没有帮助
  • 你是直接通过 babel 编译,还是在 webpack 中使用?如果您运行babel input.js > output.js,您可以使用上面的配置发布输出吗? (babel-cli)(顺便说一句,很高兴我在工作中不再需要支持 IE)
  • @zloctb 我更新了我的答案,更详细地解释了如何使用 webpack 和 babel.config.js 解决这个问题。如果您正在使用其他东西,请告诉我们!

标签: javascript node.js ecmascript-6 babeljs


【解决方案1】:

为了在 Babel 7 中转换 node_modules 和子包,您需要使用 babel.config.js 文件而不是 .babelrc 文件。

请参阅此 issue commentproject-wide configuration 上的 babel 文档。具体

Babel 7.x 中的新功能,Babel 具有“根”目录的概念,默认为当前工作目录。对于项目范围的配置,Babel 会自动在这个根目录中搜索“babel.config.js”。

...

因为项目范围的配置文件与配置文件的物理位置是分开的,所以它们非常适合必须广泛应用的配置,甚至允许插件和预设轻松应用于 node_modules 或符号链接包中的文件,这些文件是传统上在 Babel 6.x 中配置非常痛苦。

简而言之,.babelrc 用于本地项目文件转换(不包括node_modules),而babel.config.js 应被视为项目范围,并且在捆绑时将应用于包依赖项(node_modules) .这有点令人困惑,但希望对您有所帮助!

编辑

这里有更多关于使用 webpack 构建示例文件的完整项目配置的信息。请注意,如果您在此处使用.babelrc 而不是babel.config.js,它将不起作用。运行webpack-cli 会生成一个不使用class 关键字的脚本script.out.js

脚本.js
import { struct } from 'superstruct';
console.log('finished');
babel.config.js
module.exports = {
    "presets": [
        [
            "@babel/preset-env",
            {
                    "targets": {
                    "ie": "11"
                }
            }
        ]
    ]
};
webpack.config.js
module.exports = {
    entry: './script.js',
    output: {
        path: __dirname,
        filename: 'script.out.js',
    },
    module: {
        rules: [ {
            test: /\.m?js$/,
            use: {
                loader: 'babel-loader'
            }
        } ]
    }
}
包依赖
"@babel/core": "^7.3.4",
"@babel/preset-env": "^7.3.4",
"babel-loader": "^8.0.5",
"superstruct": "^0.6.0",
"webpack-cli": "^3.2.3"

【讨论】:

  • 嗨,你能提供一些有效的 NodeJS 代码来说明如何做到这一点吗?简单地运行ransform 不起作用:babel.transform
  • 这种新行为真的很愚蠢。这意味着依赖项不能再告诉他们的父项目如何编译它们,这鼓励库作者发布 ES5 而不是源代码。这是一个巨大的倒退。
  • 怎么退步了?你需要什么来指定它应该如何被转译?我很感兴趣。消费应用程序最清楚他们需要定位什么,并控制你的库应该如何被转译。我错过了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 2019-12-08
  • 2019-09-04
  • 2019-08-25
  • 2015-11-30
  • 1970-01-01
  • 2017-09-26
相关资源
最近更新 更多