为什么在使用babel-loader时要排除node_modules?

32

在该网站上大多数问题都是如何排除node_modules,但是我想知道我们为什么要排除node_modules

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'app.bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/,
        options: {
          presets: ['@babel/preset-env']
        }
      }
    ]
  }
};

有人能解释一下为什么要排除 node_modules 吗?


转译代码并不便宜,通常大多数npm模块已经可以在不进行转译的情况下运行。因此,让每个文件都经过Babel转译是不必要的(而且会很慢)。 - Felix Kling
相关链接:https://dev59.com/Z10a5IYBdhLWcg3w-87a#52509974 - jmargolisvt
1个回答

20
简而言之,转码是一个昂贵的过程,许多项目导入了数千行(如果不是数十万行)需要babel运行的代码。如前所述,您的node_modules应该已经可以运行,不需要进行转码。有简单的方法来排除您的node_modules但转换需要它的任何代码。请参阅https://github.com/babel/babel-loader/issues/171
我看到有很多争论关于是否开发人员应该消耗应用程序的工作来转换库或是库开发者的责任。大多数情况下,转译是为了浏览器支持而完成的,而库创建者不知道您需要支持哪些浏览器,因此他们最终要么转译,要么不转译,留给您处理。如果他们转码成ES5,那就很好,如果没有,通常比较容易找出哪些库会引起问题并自己进行转译。

4
正如后文所述,"Your node_modules should already be runnable without transpiling" 未必完全正确,因为取决于目标浏览器的版本,可能需要对导入的模块进行转译和/或添加 polyfills。请注意保持语句原意,使其更易懂。 - Alf Eaton
我的意思是说,开发人员应该尽职尽责地将代码转换为类似于ES5的东西,但并不总是这样。我认为我在这一点上表达得不够清楚。感谢您的澄清。 - Austin Mehmet
1
如果我们无论如何都进行转译,会有问题吗? 在我的情况下,使用webpack和babel loader时,如果我转译node_modules,一些用法会出现问题。 - gaurav5430
1
如果是一个传统的应用程序,当我们需要转译node_modules/中的模块时,我们怎么知道?需要阅读所有package.json依赖文档吗?还是我可以通过静态解析器运行我的webpack入口对象来实现呢? - Coty Embry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接