为什么要从 Babel 转译中排除 node_modules?

问题描述

我在一个项目中使用 Webpack 和 Babel。我安装了 babel-loader 以便在我的构建过程中包含 Babel。我在网上看到的大部分 babel-loader 示例都使用 webpack 配置文件中的以下配置:

module: {
    rules: [
      {
        test: /\.js$/,exclude: /node_modules/,use: ['babel-loader']
      }
    ]
  }

我的问题是,为什么我们要从 Babel 转译中排除 node_modules?我知道文档说排除它会加快捆绑过程。但是,如果 node_modules 包含我的应用程序运行所需的依赖项,那么 Babel 不应该转换这些依赖项吗?假设我想将我的应用程序转译为使用 ES5 代码,并且 node_modules 包含使用 ES6+ 的库。看来 node_modules 也应该包含在 Babel 处理的文件中。

解决方法

node_modules 中的包可能已经构建、缩小并针对 ES3,Babel 不需要进一步转译它们。

如果您导入一个包并且它在 ES6 中,Webpack 会自动在内部构建一个依赖关系图,并会检测此类包并使用 Babel 将其转换为您想要的目标 (ES5)。

您不想让 Babel 转译所有驻留在 node_modules 文件夹中的文件(可能是数千个文件),这会占用大量资源,需要更长的时间,而且毫无用处。