Node.js 16.16.0配置ES模块后仍报错,是Bug还是操作问题?
这大概率不是Node.js 16.16.0的Bug,更可能是操作细节没到位导致的,以下是常见的排查方向:
工作目录与package.json不匹配
Node.js是从执行node命令时的当前工作目录去查找package.json的,而非目标文件所在的目录。比如你在项目根目录外执行node ./my-project/some/file.js,此时Node会在你当前的外部目录找package.json(找不到就默认用CommonJS),完全不会识别项目根目录里的配置。
解决:先cd到package.json所在的项目根目录,再执行node some/path/file.js;或者用--input-type=module参数强制指定模块类型:node --input-type=module some/path/file.js目标文件不在package.json的目录层级内
如果你的目标文件是package.json所在目录的同级或上级文件,Node也不会读取这个package.json的配置。比如package.json在./project,而你运行的是./file.js(和project同级),此时Node不会识别project里的package.json。
解决:把文件移到package.json的子目录下,或者用--input-type=module参数临时指定。命令行参数干扰
检查运行命令时是否加了--require、--experimental-loader这类可能强制切换到CommonJS模式的参数,比如node --require some-commonjs-plugin.js some/path/file.js,这类参数会影响模块解析逻辑。
解决:去掉这类参数后重新运行。文件扩展名异常
虽然配置了"type": "module"后.js文件会被当作ES模块,但如果你的文件扩展名不是.js(比如写成.jss、.txt),或者文件名拼写错误,Node会按默认规则解析。
解决:确保文件扩展名是.js,且文件名正确。缓存残留
极少数情况下Node的模块解析缓存可能导致异常,试试删除项目的node_modules/.cache目录(如果存在),或者重启终端后重新执行命令。
内容的提问来源于stack exchange,提问作者machineghost

