Node REPL中package.json加载时机及ES模块导入报错问题
Node.js REPL中package.json的加载时机问题
问题场景
在Node REPL中执行以下代码:
process.chdri('M://source/MySite') let queries = await import('./src/graphql/queries.js')
执行后触发语法错误:
export const getCompanySingleTable = /* GraphQL */ ` ^^^^^^ Uncaught SyntaxError: Unexpected token 'export'
已知目标目录M://source/MySite下的package.json已配置:
"type": "module"
推测报错原因是package.json未被识别为当前目录的配置文件,核心疑问:package.json的加载时机是在REPL启动时查找,还是在执行动态导入操作时查找?
核心结论与解释
Node.js中package.json的type字段(决定模块系统类型)是在REPL启动时就读取并确定的,后续在REPL中通过process.chdir()切换工作目录,不会重新加载新目录下的package.json配置。
具体原因:
- REPL启动时,会扫描当前启动目录的package.json,根据
type字段设置默认的模块解析规则(默认是CommonJS,若type: module则为ES模块)。 - 当你在REPL中切换目录后,Node不会重新检测新目录的package.json,所以动态导入ES模块文件时,依然会以启动时的CommonJS规则解析,自然无法识别
export语法,导致报错。
解决办法
- 直接在目标目录
M://source/MySite下启动REPL:打开终端进入该目录后执行node命令,启动时就会读取该目录的package.json,自动启用ES模块模式,动态导入可正常执行。 - 强制以ES模块模式启动REPL:执行
node --input-type=module命令启动REPL,此时无论当前目录是否有package.json,都会以ES模块规则解析代码,export语法可正常识别。
内容的提问来源于stack exchange,提问作者Jamie Marshall
相关产品推荐
相关产品推荐

