Puppeteer配置文件导入顺序导致Node.js模块执行报错求助
Node.js ESM环境下导入顺序引发的ERR_INTERNAL_ASSERTION错误解析
问题场景
环境配置:
- macOS 14.5
- Node.js v20.14.0
- package.json
type设为module - Puppeteer v22.11.0
相关文件内容验证:
$ jq -r '.type' package.json module $ jq -r '.devDependencies.puppeteer' package.json 22.11.0
// puppeteer.config.cjs // 空配置文件
当按以下顺序导入模块时:
// test.js import puppeteer from "puppeteer"; import puppeteerConfig from "./puppeteer.config.cjs"; console.log("i am a puppet");
执行node test.js触发内部断言错误:
$ node test.js node:internal/assert:14 throw new ERR_INTERNAL_ASSERTION(message); ^ Error [ERR_INTERNAL_ASSERTION]: This is caused by either a bug in Node.js or incorrect usage of Node.js internals. Please open an issue with this stack trace at https://github.com/nodejs/node/issues at assert (node:internal/assert:14:11) at cjsLoader (node:internal/modules/esm/translators:347:7) at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:297:7) at ModuleJob.run (node:internal/modules/esm/module_job:222:25) at async ModuleLoader.import (node:internal/modules/esm/loader:316:24) at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:123:5) { code: 'ERR_INTERNAL_ASSERTION' }
但调换导入顺序后错误消失:
// test.js import puppeteerConfig from "./puppeteer.config.cjs"; import puppeteer from "puppeteer"; console.log("i am a puppet");
执行结果正常:
$ node test.js i am a puppet
原因分析
该错误属于Node.js ESM与CJS模块交互时的内部竞态bug:
- Puppeteer导入时会触发一系列内部模块加载逻辑,可能修改了ESM加载器的内部状态
- 后续加载本地CJS模块时,ESM加载器的内部断言检查失败,触发
ERR_INTERNAL_ASSERTION - 先加载CJS模块时,加载器先完成CJS到ESM的转换处理,此时再加载Puppeteer不会干扰加载器的内部状态,因此不会触发错误
解决方案
- 固定导入顺序:优先导入本地CJS模块,再导入Puppeteer
- 统一模块格式:将
puppeteer.config.cjs重命名为puppeteer.config.mjs,改用ESM格式,避免CJS与ESM的加载冲突 - 升级Node.js版本:后续Node.js版本可能修复了该内部断言bug,升级到较新版本可尝试解决问题
内容的提问来源于stack exchange,提问作者Mr.
相关产品推荐
相关产品推荐

