You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:15:54