我们的库需要同时适用于使用 ESM 模块和 CommonJS 的项目。因此,我们使用 3 种不同的配置构建它:ESM、node16 和 types。
此设置适用于带有节点的 JavaScript 项目。适用于 CommonJS 和 ESM(将
"type": "module"
放入 package.json 时)。
但是,当尝试在 Typescript 项目中使用该库时,我收到以下错误
Cannot find module '@ltonetwork/lto' or its corresponding type declarations.
这个设置有什么问题吗?
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "lib/esm",
"module": "ESNext",
"moduleResolution": "bundler"
}
}
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "lib/cjs",
"module": "node16",
"moduleResolution": "node16"
}
}
.d.ts
文件){
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "lib/types",
"declaration": true,
"module": "node16",
"moduleResolution": "node16",
"emitDeclarationOnly": true
}
}
在 package.json 中,我使用
exports
来指定要加载哪个文件
"exports": {
".": {
"types": "./lib/types/index.d.ts",
"require": "./lib/cjs/index.js",
"import": "./lib/esm/index.js",
"default": "./lib/esm/index.js"
},
"./accounts": {
"types": "./lib/types/accounts/index.d.ts",
"require": "./lib/cjs/accounts/index.js",
"import": "./lib/esm/accounts/index.js",
"default": "./lib/esm/accounts/index.js"
},
"./types": "./lib/types/index.d.ts",
"./constants": "./lib/constants.js",
"./package.json": "./package.json"
},
问题似乎在于 TypeScript 配置无法正确识别包的模块分辨率。您应该将 TypeScript 配置中的 moduleResolution 调整为 node。
试试这个:
ESM
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "lib/esm",
"module": "ESNext",
"moduleResolution": "node"
}
}
CommonJS
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "lib/cjs",
"module": "node16",
"moduleResolution": "node"
}
}
类型(.d.ts 文件)
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "lib/types",
"declaration": true,
"module": "node16",
"moduleResolution": "node",
"emitDeclarationOnly": true
}
}