老旧js文件在vscode中报referenceerror,根本原因在于node.js模块系统升级:当package.json设"type": "module"时,所有.js文件被强制按esm解析,导致require、__dirname等commonjs变量不可用;code runner默认用浏览器环境执行也会触发同类错误。

为什么老旧 JS 文件在 VSCode 里跑出 ReferenceError
不是代码写错了,而是 Node.js 默认行为变了:ES6 模块(import/export)和 CommonJS(require)混用、this 指向变化、全局变量(如 __dirname、__filename)在 ESM 下不可用,都会让老脚本直接崩。VSCode 只是执行环境的“窗口”,真正报错的是 Node.js 运行时。
检查 package.json 的 "type" 字段是否误设为 module
这是最隐蔽也最常踩的坑。如果你的项目根目录有 package.json,且里面写了 "type": "module",那所有 .js 文件都会被 Node 当成 ES 模块处理——此时 require 就会报 ReferenceError: require is not defined,连 __dirname 都拿不到。
- 删掉
"type": "module"行,或改成"type": "commonjs" - 如果必须保留 ESM,老文件后缀要改成
.cjs,并在package.json中显式指定"type": "module"仅对特定子目录生效(不推荐,兼容成本高) - 临时绕过:终端里用
node --require ./polyfill.cjs script.js注入兼容层(需自己写 polyfill)
老旧代码依赖的全局变量(__dirname / __filename)失效
ESM 下没有 __dirname 和 __filename,但老脚本里满屏都是 require('./config/' + __dirname) 这类写法。Node.js 不报语法错误,一运行就 ReferenceError: __dirname is not defined。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 快速修复:在文件顶部加两行(仅适用于 CommonJS 环境):
import { fileURLToPath } from 'url';<br>import { dirname } from 'path';<br>const __filename = fileURLToPath(import.meta.url);<br>const __dirname = dirname(__filename); - 注意:这段代码不能放在 ESM 文件开头以外的位置,也不能和
require混用;如果用了"type": "module",就必须用这套写法 - 更稳妥的做法:把整个项目降级到 CommonJS,删掉
"type": "module",统一用.js后缀 +require
Code Runner 插件默认用浏览器环境执行 JS
右键选 “Run Code” 却报 ReferenceError: require is not defined 或 ReferenceError: document is not defined?这不是 Node 装错了,是 Code Runner 把你的脚本当 HTML 里的 inline script 执行了。
- 别用右键 → “Run Code”,改用右键 → “Run Current File in Node.js”(需安装 Code Runner 后手动启用该选项)
- 或者,在 VSCode 终端里手动执行:
node script.js—— 这才是真实 Node 环境 - 永久修正:打开 Code Runner 设置,搜
executorMap,找到javascript对应项,改成"node"而不是"node -e"或"open"
真正麻烦的不是报错本身,而是同一份代码在不同 Node 版本下表现不一致:v14 能跑的 v18 就挂,因为 V8 引擎对作用域和模块解析更严格了。别急着改代码,先确认执行路径、package.json 类型、插件行为这三点,90% 的“未定义变量”都卡在这儿。










