使用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
相关产品推荐
相关产品推荐

