更新:我不知道这是否回答了我的问题,但是当我将
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(`Is ConfigurableResourceLoader an instance of ResourceLoader?`, ConfigurableResourceLoader instanceof ResourceLoader);
myFromFile(new ConfigurableResourceLoader());
当我执行此文件时,出现错误并显示以下消息:
Is ConfigurableResourceLoader an instance of 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
的。
我假设这首先导致了错误消息,但我不知道我做错了什么。我是否错误地使用了对等依赖项,或者当通过“file://...”依赖包时它们不起作用?
我在 github 上构建了这些项目,以便其他人检查整个代码库:https://github.com/DanKaplanSES/jsdom-sandbox/tree/lib-has-peer-dependency-and-lib-is-file -依赖-所以
这是这些项目的package.json文件。
{
"name": "app-package",
"version": "0.0.1",
"description": "A simple sandbox for playing around with 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"
}
}
{
"name": "lib-package",
"version": "0.0.1",
"description": "A simple sandbox for playing around with 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"
}
}
{
"name": "jsdom-configurable-resource-loader",
"description": "A JSDOM ResourceLoader with configuration options to whitelist and blacklist resources.",
"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": "[email protected]"
},
"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"
}
}
默认情况下,
npm install
将为file:
协议依赖项创建符号链接。 npm install --install-links
将把它们安装为常规依赖项而不是链接,这将解决问题。
我有一种感觉,这里发生的事情比我意识到的要多。如果我的链接使用对等依赖项,那么我需要
--install-links
才能获得预期的行为,这感觉有点随意。可能是我在 Windows 上进行开发的事实在这里发挥了作用:也许 Linux 会按照最初问题中的预期工作。不管怎样,这至少是解决问题的多种方法之一,所以我将其发布为答案。