带有导出的 NPM 包不会在打字稿中加载

问题描述 投票:0回答:1

我们的库需要同时适用于使用 ESM 模块和 CommonJS 的项目。因此,我们使用 3 种不同的配置构建它:ESM、node16 和 types。

此设置适用于带有节点的 JavaScript 项目。适用于 CommonJS 和 ESM(将

"type": "module"
放入 package.json 时)。

但是,当尝试在 Typescript 项目中使用该库时,我收到以下错误

Cannot find module '@ltonetwork/lto' or its corresponding type declarations.

这个设置有什么问题吗?


TypeScript 配置

ESM
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "lib/esm",
    "module": "ESNext",
    "moduleResolution": "bundler"
  }
}
CommonJS
{
  "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

在 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"
  },
node.js typescript npm es6-modules commonjs
1个回答
0
投票

问题似乎在于 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
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.