如何强制在MJS项目中导入YJS的MJS模块而非CJS模块
强制YJS在MJS项目中使用ES模块而非CommonJS
我的项目采用MJS风格,通过import * as Y from "yjs"导入版本为"yjs": "^13.6.23"的YJS模块,但报错信息显示实际加载的是YJS的CJS代码(路径指向yjs.cjs),具体错误如下:
│ Caught error while handling a Yjs update TypeError: Cannot read properties of undefined (reading 'splice') │ │ at splitItem (/home/node/app/node_modules/yjs/dist/yjs.cjs:9606:22) │ │ at getItemCleanEnd (/home/node/app/node_modules/yjs/dist/yjs.cjs:3007:34) │ │ at Item.getMissing (/home/node/app/node_modules/yjs/dist/yjs.cjs:9892:19) │ │ at integrateStructs (/home/node/app/node_modules/yjs/dist/yjs.cjs:1615:35) │ │ at /home/node/app/node_modules/yjs/dist/yjs.cjs:1698:25 │ │ at transact (/home/node/app/node_modules/yjs/dist/yjs.cjs:3444:14) │ │ at readUpdateV2 (/home/node/app/node_modules/yjs/dist/yjs.cjs:1686:3) │ │ at applyUpdateV2 (/home/node/app/node_modules/yjs/dist/yjs.cjs:1781:3) │ │ at Object.applyUpdate (/home/node/app/node_modules/yjs/dist/yjs.cjs:1795:58) │ │ at readSyncStep2 (/home/node/app/node_modules/y-protocols/dist/sync.cjs:107:18)
YJS的dist目录同时包含CJS和MJS版本,请问能否强制项目使用YJS的MJS代码?以下是我的项目package.json内容:
{ "name": "texhub-broadcast", "version": "1.0.29", "description": "", "main": "./dist/app.js", "module": "./dist/app.js", "types": "./dist/app.d.ts", "type": "module", "exports": { "./dist/websocket/conn/socket_io_client_provider": "./dist/websocket/conn/socket_io_client_provider.js", ".": { "import": "./dist/app.js" } }, "files": [ "dist/*" ], "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "lint": "eslint --fix", "dev": "export NODE_ENV=dev && ts-node -r tsconfig-paths/register src/app.ts", "build": "tspc" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@socket.io/admin-ui": "^0.5.1", "dotenv": "^16.4.7", "esm-module-alias": "^2.2.1", "express": "^4.21.2", "flatted": "^3.3.2", "globals": "^15.14.0", "jsonwebtoken": "^9.0.2", "level": "^9.0.0", "leveldown": "^6.1.1", "levelup": "^5.1.1", "lib0": "^0.2.99", "lodash": "^4.17.21", "log4js": "^6.9.1", "meilisearch": "^0.35.1", "module-alias": "^2.2.3", "pg": "^8.13.3", "prom-client": "^14.2.0", "redis": "^4.7.0", "socket.io": "^4.8.1", "socket.io-client": "^4.8.1", "uuid": "^11.1.0", "ws": "^8.18.0", "y-leveldb": "^0.1.2", "y-protocols": "^1.0.6", "y-websocket": "^1.5.0", "yjs": "^13.6.23" }, "devDependencies": { "@types/express": "^5.0.0", "@types/jsonwebtoken": "^9.0.8", "@types/lodash": "^4.17.15", "@types/node": "^22.13.8", "@types/pg": "^8.11.11", "@types/ws": "^8.5.14", "@typescript-eslint/eslint-plugin": "^8.22.0", "@typescript-eslint/parser": "^8.22.0", "eslint": "^9.19.0", "ts-node": "^10.9.2", "ts-patch": "^3.3.0", "tsc-alias": "^1.8.10", "tsconfig-paths": "^4.2.0", "typescript": "^5.7.3", "typescript-transform-paths": "^3.5.3", "vite": "^6.0.11", "vite-node": "^3.0.4", "vitest": "^3.0.4" } }
解决方案
方案1:通过package.json的overrides强制指定YJS的ES模块入口
在项目的package.json中添加overrides字段,直接指定YJS的MJS文件作为导入入口:
"overrides": { "yjs": { ".": { "import": "./dist/yjs.mjs" } } }
这个配置会覆盖YJS自身的模块解析逻辑,让Node.js在使用import语法时强制加载指定的MJS文件。
方案2:直接导入YJS的MJS文件
修改你的导入语句,跳过模块解析过程,直接指向YJS的MJS版本:
import * as Y from "yjs/dist/yjs.mjs";
这是最直接的方式,无需修改package.json配置。
方案3:同步修正依赖链中的CJS引用
从报错信息来看,y-protocols也在使用CJS版本,可能需要同步对其进行强制配置:
"overrides": { "yjs": { ".": { "import": "./dist/yjs.mjs" } }, "y-protocols": { ".": { "import": "./dist/y-protocols.mjs" } } }
确保整个依赖链都使用ES模块版本,避免混合加载导致的兼容性问题。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

