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

Node.js从10升级到18后遇__WEBPACK_DEFAULT_EXPORT__初始化前访问错误求助

Node.js 10 升级至 18 后 Webpack 循环引用初始化错误问题

项目从Node.js 10升级至Node.js 18,已完成依赖包升级并解决多数问题,但卡在以下错误:

webpack://fas-backend/./src/express/routes/products/product.model.js?:3
/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
                                         ^

ReferenceError: Cannot access '__WEBPACK_DEFAULT_EXPORT__' before initialization
    at Module.default (webpack://fas-backend/./src/express/routes/products/product.model.js?:3:42)
    at eval (webpack://fas-backend/./src/express/routes/projectProducts/projectProducts.model.js?:38:66)
    at ./src/express/routes/projectProducts/projectProducts.model.js (C:\Excersys\FASAPI3\dist\server.js:2059:1)
    at __webpack_require__ (C:\Excersys\FASAPI3\dist\server.js:2963:41)
    at eval (webpack://fas-backend/./src/express/routes/products/product.model.js?:30:97)
    at ./src/express/routes/products/product.model.js (C:\Excersys\FASAPI3\dist\server.js:1549:1)
    at __webpack_require__ (C:\Excersys\FASAPI3\dist\server.js:2963:41)
    at eval (webpack://fas-backend/./src/express/routes/operation/operation.helper.js?:7:81)
    at ./src/express/routes/operation/operation.helper.js (C:\Excersys\FASAPI3\dist\server.js:1239:1)
    at __webpack_require__ (C:\Excersys\FASAPI3\dist\server.js:2963:41)

Node.js v18.12.1

项目配置文件

package.json

{  
  "name": "******",  
  "version": "******",  
  "description": "*********",  
  "main": "index.js",  
  "scripts": {    
    "start": "set NODE_OPTIONS=--openssl-legacy-provider && node dist/server.js",    
    "buildDev": "set NODE_OPTIONS=--openssl-legacy-provider && webpack --mode development --config webpack.dev.config.js --watch",    
    "devBuild": "set NODE_OPTIONS=--openssl-legacy-provider && webpack --mode development --config webpack.dev.config.js",    
    "buildProd": "webpack --mode production --config webpack.prod.config.js",    
    "deploy-fas": "cp .fas.env .env && npm run buildProd && gcloud config set project faslive-51622 && gcloud app deploy",    
    "deploy-mexmax": "cp .mexmax.env .env && npm run buildProd && gcloud config set project mexmax-backend && gcloud app deploy",    
    "deploy-westgate": "cp .westgate.env .env && npm run buildProd && gcloud config set project westgate-1504085677899 && gcloud app deploy",    
    "deploy-westgate-dev": "cp .westgate.dev.env .env && npm run devBuild && gcloud config set project westgatedash-dev && gcloud app deploy",    
    "deploy-nova": "cp .fwd.env .env && npm run buildProd && gcloud config set project fwd-api-286114 && gcloud app deploy"  
  },  
  "nodemonConfig": {    
    "ignore": [      
      "src",      
      "node_modules"    
    ],    
    "delay": "2500"  
  },  
  "author": "",  
  "license": "ISC",  
  "dependencies": {    
    "@elastic/elasticsearch": "~8.5.0",    
    "@google-cloud/tasks": "^3.0.5",    
    "@google/maps": "^1.1.0",    
    "@sendgrid/mail": "^7.7.0",    
    "amazon-mws": "0.0.30",    
    "axios": "^1.2.1",    
    "body-parser": "^1.18.3",    
    "circular-dependency-plugin": "^5.2.2",    
    "cors": "^2.8.4",    
    "cross-env": "^7.0.3",    
    "dotenv-webpack": "^8.0.1",    
    "ebay-api": "^7.1.3",    
    "express": "4.18.2",    
    "express-validation": "^1.0.2",    
    "faker": "^6.6.6",    
    "firebase": "^9.15.0",    
    "form-data": "^4.0.0",    
    "http-status": "^1.3.2",    
    "https": "^1.0.0",    
    "icontact-api": "^0.3.0",    
    "joi": "^14.3.1",    
    "json-2-csv": "^3.7.8",    
    "jsonwebtoken": "^8.5.1",    
    "jwt-decode": "^3.1.2",    
    "lodash": "^4.17.20",    
    "luxon": "^3.0.1",    
    "magento-api-rest": "^2.0.3",    
    "morgan": "^1.9.1",    
    "mysql2": "^2.3.3",    
    "node-async-loop": "^1.2.2",    
    "node-constantcontact": "^2.0.0",    
    "oauth-1.0a": "^2.2.6",    
    "parse-url": "^8.1.0",    
    "payload-validator": "^1.0.4",    
    "randomstring": "^1.2.2",    
    "request": "^2.88.0",    
    "request-promise": "^4.2.4",    
    "sass-loader": "13.2.0",    
    "sequelize": "^6.27.0",    
    "streamifier": "^0.1.1",    
    "throttled-queue": "^2.1.4",    
    "uuid": "^9.0.0",    
    "xhr2": "^0.2.0",    
    "xml-js": "^1.6.11",    
    "xml2js": "^0.4.23",    
    "xmlbuilder": "^15.1.1"  
  },  
  "devDependencies": {    
    "@babel/cli": "^7.6.2",    
    "@babel/core": "^7.5.5",    
    "@babel/preset-env": "^7.6.2",    
    "babel-core": "^6.26.3",    
    "babel-eslint": "^10.1.0",    
    "babel-loader": "^9.1.0",    
    "eslint": "^8.29.0",    
    "eslint-config-airbnb-base": "^15.0.0",    
    "eslint-loader": "^4.0.2",    
    "eslint-plugin-import": "^2.18.2",    
    "nodemon": "^2.0.20",    
    "nodemon-webpack-plugin": "^4.3.1",    
    "terser-webpack-plugin": "^5.3.6",    
    "webpack": "^5.75.0",    
    "webpack-cli": "^5.0.1",    
    "webpack-node-externals": "^3.0.0"  
  }
}

Webpack配置文件

const path = require('path');
const Dotenv = require('dotenv-webpack');
const webpack = require('webpack'); // eslint-disable-line no-unused-vars
const nodeExternals = require('webpack-node-externals');
const NodemonPlugin = require('nodemon-webpack-plugin');

module.exports = (env, argv) => ({
  entry: {
    server: './src/index.js',
  },
  output: {
    path: path.join(__dirname, 'dist'),
    publicPath: '/',
    filename: '[name].js',
  },
  mode: argv.mode,
  target: 'node',
  node: {
    __dirname: false,
    __filename: false,
  },
  externals: [nodeExternals()],
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
        },
      },
    ],
  },
  plugins: [
    new NodemonPlugin(),
    new Dotenv(),
  ],
});

解决方案

这个错误核心是循环依赖:从调用栈可见product.model.js和projectProducts.model.js互相引用,Node.js 18对模块初始化的校验比Node.js 10严格,导致之前隐藏的循环依赖问题触发初始化错误。

1. 解除循环依赖

  • 定位两个文件的互相引用点:比如A导入B的默认导出,B同时导入A的默认导出。
  • 重构代码:将共同逻辑抽为独立工具文件,或者延迟导入(在函数内部而非模块顶部导入):
    // 替换模块顶部的import语句
    function fetchProductData() {
      const Product = require('./product.model').default;
      // 后续业务逻辑
    }
    

2. 升级并优化Babel配置

  • 升级@babel/preset-env到适配Node.js 18的版本:
    npm install @babel/preset-env@^7.20.0 --save-dev
    
  • 在项目根目录创建babel.config.json:
    {
      "presets": [
        ["@babel/preset-env", {
          "targets": { "node": "18" },
          "useBuiltIns": "usage",
          "corejs": "3.20"
        }]
      ]
    }
    
  • 安装core-js:
    npm install core-js@3 --save
    
  • 卸载冲突的旧版babel-core:
    npm uninstall babel-core
    

3. 增强Webpack循环依赖检测

  • 在Webpack配置中启用CircularDependencyPlugin,提前发现所有循环依赖:
    const CircularDependencyPlugin = require('circular-dependency-plugin');
    
    module.exports = (env, argv) => ({
      // ...其他配置
      plugins: [
        new CircularDependencyPlugin({
          exclude: /node_modules/,
          include: /src/,
          failOnError: false, // 先设为false查看所有循环依赖,再逐个修复
          allowAsyncCycles: false,
          cwd: process.cwd(),
        }),
        new NodemonPlugin(),
        new Dotenv(),
      ],
    });
    
  • 将Webpack的target改为node18(Webpack 5支持该写法,更精准适配Node.js版本):
    target: 'node18',
    

4. 统一模块导出规范

  • 检查所有模块,避免混用CommonJS(module.exports)和ES模块(export default)语法,保持导出方式一致。

内容的提问来源于stack exchange,提问作者MT AC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:35:25