You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Node.js至16后Webpack处理node_modules模块解析失败求助

module: {
rules: [
{
test: /(?!:spec).tsx?$/,
loader: 'ts-loader',
exclude: /.d.ts$/,
},
{
test: /.d.ts$/,
loader: 'ignore-loader',
},
{
test: /.mjs$/,
type: "javascript/auto"
},
{
test: /.js$/,
loader: 'babel-loader',
},

],

},
...

添加`babel-loader`后报错仍未消失,请问为何会在`node_modules/dist`层级失败?该如何解决?

## 原因分析
- **Babel默认跳过node_modules目录**:你配置了`babel-loader`处理`.js`文件,但Babel默认会排除所有`node_modules`下的文件,导致`@sailplane/injector`里的可选链操作符(`?.`)没被转译。虽然Node.js 16原生支持`?.`,但如果Webpack打包时的目标环境配置不对,或者依赖本身发布的是未转译的ES模块代码,就会触发解析错误。
- **Webpack规则未覆盖目标依赖**:当前`babel-loader`规则没有明确包含`@sailplane/injector`,导致该依赖的文件没有经过Babel转译就被Webpack处理。

## 解决方案
### 1. 修改Babel配置,让其处理指定依赖
在你的Babel配置文件(`.babelrc`、`babel.config.json`或项目中的`babel.config.js`)中,将`@sailplane/injector`加入`include`列表,确保Babel转译该依赖的代码:
```json
{
  "presets": [
    ["@babel/preset-env", {
      "targets": {
        "node": "16"
      }
    }]
  ],
  "include": [
    "./src/**/*",
    "./node_modules/@sailplane/injector/**/*"
  ]
}

2. 调整Webpack的babel-loader规则

修改Webpack配置中的babel-loader规则,排除除@sailplane/injector之外的node_modules文件,确保该依赖被Babel处理:

{
  test: /\.js$/,
  loader: 'babel-loader',
  // 只排除不包含@sailplane/injector的node_modules目录
  exclude: /node_modules\/(?!@sailplane\/injector)/,
}

3. 配置Webpack目标环境

在Webpack配置文件顶部添加target: 'node16',让Webpack知晓当前目标是支持?.语法的Node.js 16,避免不必要的转译检查:

module.exports = {
  target: 'node16',
  // 其他原有配置...
};

4. 清理并重新安装依赖

删除旧的依赖文件和锁文件,重新安装适配Node.js 16的依赖版本:

rm -rf node_modules package-lock.json
npm install

内容的提问来源于stack exchange,提问作者Nikita Polevoi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:20:34