Babel不会从'node_modules'转换导入的模块

Nik*_*taK 7 javascript babel webpack

我在从中转译导入的模块时遇到问题node_modules。Babel出于某种原因不会转载从中导入的模块node_modules,而是转载从中导入的模块src

这是一个示例存储库:https : //github.com/NikitaKA/babeltest

main.js

// result code contains const and let, but it shouldn't. :(
Run Code Online (Sandbox Code Playgroud)

index.js

import qs from 'query-string; // not transpiled
import lib from './lib' // transpiled

const query = qs.parse(window.location.search);
Run Code Online (Sandbox Code Playgroud)

webpack.config.js

const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'main.js'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: "babel-loader"
        }
      }
    ]
  }
};
Run Code Online (Sandbox Code Playgroud)

.babelrc

{
  "presets": [
    ["@babel/preset-env", {
      "modules": false,
      "targets": {
        "chrome": 39
      }
    }],
    ["@babel/preset-stage-1", {
      "modules": false,
      "decoratorsLegacy": true,
      "pipelineProposal": "minimal"
    }]
  ],
  "plugins": [
    "transform-es2015-constants",
    "@babel/plugin-transform-block-scoping",
    "@babel/plugin-transform-runtime"
  ]
}
Run Code Online (Sandbox Code Playgroud)

Raf*_*den 10

这种情况下的解决方案是再次转译模块,这可以通过修改excludewebpack 配置中的属性来完成:

{
  test: /\.js$/,
  exclude: /node_modules\/(?!(es6-module|another-es6-module)\/).*/,
},
Run Code Online (Sandbox Code Playgroud)

模块es6-moduleanother-es6-module将不再被 webpack 忽略,并将与您的其余源代码一起转译。

请参阅webpack 项目上GitHub 问题

测试webpack@3.12.0babel-core@6.26.3babel-core@6.26.3


AKX*_*AKX 5

扩展我的评论:

您真的不希望全部移植node_modules-这将花费很长时间,并且大多数代码中应该已经有ES5(除非它们实际上是ES6模块,在这种情况下,ES6入口点如"module"package.json表现)。

query-string@6.x 不是,它在自述文件中这样说:

此模块针对Node.js 6或更高版本以及最新版本的Chrome,Firefox和Safari。如果要支持较旧的浏览器,请使用版本5 :npm install query-string@5

  • 无论如何,有没有办法从`node_modules`转换模块? (4认同)
  • 来自[webpack第2031期](https://github.com/webpack/webpack/issues/2031#issuecomment-219040479):`{测试:/\.js$/,排除:/ node_modules \ /(?!(MY -MODULE | ANOTHER-ONE)\ /)。* /,},` (3认同)
  • 据我了解 OP _want_ 转译 node_modules (或至少是特定的不符合标准的模块)。您自己提到模块“应该已经是 ES5”(关键字“应该”)。所以有时模块没有正确打包,我们可能需要手动转换它们......你的回答没有回答这个问题 (3认同)
  • 我明白你的意思了。你是对的,我不应该转译分布式模块,特别是如果有支持旧浏览器的旧版本的版本(我没有检查,我的错)。但是我觉得奇怪的是你不能将现代库编译成 ES5,如果没有旧版本怎么办?就我而言,有必要在旧浏览器下编译项目,幸运的是它只是项目中的一个外部库,并且具有 ES5 模拟 :)。 (2认同)