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

使用file://依赖库时,peerDependencies为何未按预期工作?

更新:不确定这是否能解决我的问题,但把lib-package发布到npmjs.com并依赖已发布的包之后,代码运行符合预期,详情见下方我的回答。

问题描述

依赖树

依赖树
(注:我不确定^23是否是有效的语义化版本号,但也尝试过^23.2.0,结果没有区别)

除jsdom外,本文涉及的所有包均由我维护。app-package的index.js代码如下:

import { ConfigurableResourceLoader } from 'jsdom-configurable-resource-loader';
import { ResourceLoader } from 'jsdom';
import { myFromFile } from 'lib-package';

console.log(`ConfigurableResourceLoader 是否是 ResourceLoader 的实例?`, ConfigurableResourceLoader instanceof ResourceLoader);
myFromFile(new ConfigurableResourceLoader());

执行该文件时出现如下错误:

ConfigurableResourceLoader 是否是 ResourceLoader 的实例? false
C:\my-projects\jsdom-sandbox\lib-package\node_modules\jsdom\lib\api.js:321
        throw new TypeError("resources must be an instance of ResourceLoader");
              ^

TypeError: resources must be an instance of ResourceLoader
    at resourcesToResourceLoader (C:\my-projects\jsdom-sandbox\lib-package\node_modules\jsdom\lib\api.js:321:15)
    at transformOptions (C:\my-projects\jsdom-sandbox\lib-package\node_modules\jsdom\lib\api.js:263:46)
    at new JSDOM (C:\my-projects\jsdom-sandbox\lib-package\node_modules\jsdom\lib\api.js:34:15)
    at JSDOM.fromFile (C:\my-projects\jsdom-sandbox\lib-package\node_modules\jsdom\lib\api.js:152:12)

我最困惑的是错误信息里的路径:C:\my-projects\jsdom-sandbox\lib-package\node_modules\jsdom\lib\api.js:321:15。按照peerDependency的设计,app-package应该使用自身安装的jsdom,但实际看起来代码在调用lib-package目录下的jsdom。

我猜测这就是导致错误的原因,但不知道问题出在哪里:是我对peer依赖的配置有误,还是file://路径下peer依赖不生效?

完整代码已上传至GitHub仓库的指定分支。

各项目package.json配置

app-package ./package.json

{
  "name": "app-package",
  "version": "0.0.1",
  "description": "一个用于测试jsdom的简单沙箱项目",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "npm run exec && jasmine --config=\"spec/support/jasmine-spec.json\"",
    "exec": "node index.js",
    "lint": "eslint '**/*.(js|ts)' --fix"
  },
  "devDependencies": {
    "@prettier/sync": "^0.3.0",
    "@types/jasmine": "^5.1.4",
    "@types/jquery": "^3.5.29",
    "@types/jsdom": "^21.1.6",
    "eslint": "^8.56.0",
    "eslint-config-prettier": "^9.1.0",
    "eslint-plugin-no-floating-promise": "^1.0.2",
    "eslint-plugin-prettier": "^5.1.3",
    "jasmine": "^5.1.0",
    "jsdom": "^23.2.0",
    "jsdom-configurable-resource-loader": "^0.0.8",
    "lib-package": "file:../lib-package",
    "prettier": "^3.2.2"
  }
}

lib-package ./package.json

{
  "name": "lib-package",
  "version": "0.0.1",
  "description": "一个用于测试jsdom的简单沙箱项目",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "npm run exec && jasmine --config=\"spec/support/jasmine-spec.json\"",
    "exec": "node index.js",
    "lint": "eslint '**/*.(js|ts)' --fix"
  },
  "devDependencies": {
    "@prettier/sync": "^0.3.0",
    "@types/jasmine": "^5.1.4",
    "@types/jquery": "^3.5.29",
    "@types/jsdom": "^21.1.6",
    "eslint": "^8.56.0",
    "eslint-config-prettier": "^9.1.0",
    "eslint-plugin-no-floating-promise": "^1.0.2",
    "eslint-plugin-prettier": "^5.1.3",
    "jasmine": "^5.1.0",
    "prettier": "^3.2.2"
  },
  "peerDependencies": {
    "jsdom": "^23"
  }
}

jsdom-configurable-resource-loader ./package.json

{
  "name": "jsdom-configurable-resource-loader",
  "description": "一个带有资源黑白名单配置选项的JSDOM ResourceLoader",
  "version": "0.0.8",
  "main": "dist/index.js",
  "module": "dist/index.mjs",
  "types": "dist/index.d.ts",
  "license": "MIT",
  "files": [
    "dist"
  ],
  "scripts": {
    "compile-typescript": "tsup-node",
    "build": "tsup-node",
    "test": "jasmine --config=\"spec/support/jasmine-spec.json\"",
    "clean": "rm -rf dist"
  },
  "keywords": [
    "jsdom",
    "resourceloader",
    "resource-loader"
  ],
  "author": {
    "name": "Daniel Kaplan",
    "email": "daniel.kaplan@SleepEasySoftware.com"
  },
  "devDependencies": {
    "@types/jasmine": "5.1.4",
    "@types/jsdom": "21.1.6",
    "@types/sinon": "^17.0.2",
    "@typescript-eslint/eslint-plugin": "6.17.0",
    "eslint": "8.56.0",
    "eslint-config-prettier": "9.1.0",
    "eslint-plugin-prettier": "5.1.2",
    "jasmine": "5.1.0",
    "sinon": "^17.0.1",
    "ts-node": "10.9.2",
    "tslib": "2.6.2",
    "tsup": "8.0.1",
    "typescript": "5.3.3"
  },
  "peerDependencies": {
    "canvas": "2",
    "jsdom": "^23"
  }
}

内容的提问来源于stack exchange,提问作者Daniel Kaplan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:32:33