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
相关产品推荐
相关产品推荐

