已设置type:module仍无法加载web-worker模块,报错import语句非法
解决web-worker包导入时的ES模块语法错误
错误日志
(node:48786) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension. (Use `node --trace-warnings ...` to show where the warning was created) /Users/myUser/Documents/workers-test-demo/node_modules/web-worker/node.js:17 import URL from 'url'; ^^^^^^ SyntaxError: Cannot use import statement outside a module at internalCompileFunction (node:internal/vm:77:18) at wrapSafe (node:internal/modules/cjs/loader:1288:20) at Module._compile (node:internal/modules/cjs/loader:1340:27) at Module._extensions..js (node:internal/modules/cjs/loader:1435:10) at Module.load (node:internal/modules/cjs/loader:1207:32) at Module._load (node:internal/modules/cjs/loader:1023:12) at cjsLoader (node:internal/modules/esm/translators:356:17) at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:305:7) at ModuleJob.run (node:internal/modules/esm/module_job:218:25) at async ModuleLoader.import (node:internal/modules/esm/loader:329:24) Node.js v20.11.0
我的代码
index.js
import Worker from "web-worker"; new Worker("./hello.js"); // 也尝试过添加 { type: "module" };
项目package.json
{ "name": "workers-test-demo", "version": "1.0.0", "description": "", "main": "index.js", "type": "module", "scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "web-worker": "^1.3.0" } }
web-worker包的exports配置
... "exports": { "types": "./index.d.ts", "import": { "bun": "./browser.js", "browser": "./browser.js", "default": "./node.js" }, "module": { "bun": "./browser.js", "browser": "./browser.js", "default": "./node.js" }, "default": { "bun": "./cjs/browser.js", "browser": "./cjs/browser.js", "default": "./cjs/node.js" } }, ...
问题分析与解决
报错核心是web-worker包的node.js文件被Node.js当作CommonJS模块加载,但文件本身使用了ES模块的import语法。虽然项目自身设置了"type": "module",但第三方包的模块类型由其自身的package.json决定——该包根目录的package.json未声明"type": "module",且node.js文件没有.mjs后缀,导致Node.js默认按CommonJS解析,触发语法错误。
可行解决方案
直接导入CommonJS版本
修改导入语句,指定包的CommonJS入口文件:import Worker from "web-worker/cjs/node.js";升级包版本
执行命令更新到最新版本,大概率已修复模块声明问题:npm update web-worker临时修改包配置(仅测试用)
进入node_modules/web-worker目录,在其package.json中添加"type": "module",让Node.js将该包的.js文件识别为ES模块。注意:重新安装依赖后该修改会失效,不推荐用于生产环境。
内容的提问来源于stack exchange,提问作者Luigui1729
相关产品推荐
相关产品推荐

