npm 如何使用TypeScript正确使用package.json上的导出和子路径?

plupiseo  于 2023-01-13  发布在  TypeScript
关注(0)|答案(1)|浏览(358)

这是我第一次尝试使用TypeScript创建npm包,我遇到了一些麻烦,可能是因为我误解了文档后面的一些内容。在写这篇文章的时候,我使用的是Node 16.16.0和npm 8.13.2。
首先,我的项目结构看起来像这样。

src/
├─ module1/
│  ├─ index.ts
├─ module2/
│  ├─ index.ts
package.json
tsconfig.json

临时配置json

{
  "compilerOptions": {
    "target": "es2017",
    "module": "commonjs",
    "esModuleInterop": true,
    "declaration": true,
    "outDir": "./lib",
    "strict": true
  },
  "include": ["src"],
  "exclude": ["node_modules", "**/__tests__/*"]
}

包.json

{
  "name": "@owner/mypackage",
  "version": "v1.0.0",
  ...
  "files": [
    "lib/**/*"
  ],
  "type": "module",
  "exports": {
    "./module1": "./lib/module1/index.js",
    "./module2": "./lib/module2/index.js",
    "./package.json": "./package.json"
  }
}

问题是,当发布模块时,它会生成以下结构:

lib/
├─ module1/
│  ├─ index.js
├─ module2/
│  ├─ index.js
package.json

剩下的导入结构如下:

import {Foo} from "@owner/mypackage/lib/module1";

而不是所需的:

import {Foo} from "@owner/mypackage/module1";

我怎样才能实现这种模式呢?如果有的话,我可以改进它或者遵循更好的实践吗?

yxyvkwin

yxyvkwin1#

就我个人而言,在我运行Typescript 4.7+的一个项目中,以下代码起作用了:你所需要的是package.json中的typesVersions属性.(参见http://www. typescriptlang. org/docs/handbook/declaration-files/publishing. html #版本选择-with-类型版本)
我将从上面的文档中抽出这句话作为相关内容:
如果typesVersions中的字段都不匹配,TypeScript将返回到types字段,因此这里TypeScript 3.0和更早版本将被重定向到[... ]/node_modules/package-name/index.d.ts。
这实际上意味着,如果package.json中未定义typesVersions字段,则使用types字段,但当exports具有多个导出路径时,types字段对我们没有帮助。
希望这有帮助!

{
  "exports": {
    "./module1": "./lib/module1/index.js",
    "./module2": "./lib/module2/index.js",
  },
  "typesVersions": {
     "*": {
       "module1": ["lib/module1/index.js"],
       "module2": ["lib/module2/index.js"]
    }
  }
}

相关问题