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

Yos*_*shi 6 javascript npm typescript package.json

这是我第一次尝试使用 TypeScript 创建 npm 包,并且遇到了一些麻烦,可能是因为我误解了文档中的某些内容。\n在撰写本文时,我正在使用 Node 16.16.0 和 npm 8.13.2这。

\n

首先,我的项目结构如下所示。

\n
src/\n\xe2\x94\x9c\xe2\x94\x80 module1/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 index.ts\n\xe2\x94\x9c\xe2\x94\x80 module2/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 index.ts\npackage.json\ntsconfig.json\n
Run Code Online (Sandbox Code Playgroud)\n

tsconfig.json

\n
{\n  "compilerOptions": {\n    "target": "es2017",\n    "module": "commonjs",\n    "esModuleInterop": true,\n    "declaration": true,\n    "outDir": "./lib",\n    "strict": true\n  },\n  "include": ["src"],\n  "exclude": ["node_modules", "**/__tests__/*"]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

包.json

\n
{\n  "name": "@owner/mypackage",\n  "version": "v1.0.0",\n  ...\n  "files": [\n    "lib/**/*"\n  ],\n  "type": "module",\n  "exports": {\n    "./module1": "./lib/module1/index.js",\n    "./module2": "./lib/module2/index.js",\n    "./package.json": "./package.json"\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
lib/\n\xe2\x94\x9c\xe2\x94\x80 module1/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 index.js\n\xe2\x94\x9c\xe2\x94\x80 module2/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 index.js\npackage.json\n
Run Code Online (Sandbox Code Playgroud)\n

留给我以下导入结构:

\n
import {Foo} from "@owner/mypackage/lib/module1";\n
Run Code Online (Sandbox Code Playgroud)\n

而不是所需的:

\n
import {Foo} from "@owner/mypackage/module1";\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

yka*_*aru 2

就我个人而言,在我运行Typescript 4.7+ 的项目中,以下内容有效:您需要的是typesVersionsin 的属性package.json。(参见https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html#version-selection-with-typesversions

我将从上面的文档中引用这句话作为相关内容:

好吧,如果 typesVersions 中的任何字段均未匹配,则 TypeScript 会回退到types 字段,因此此处 TypeScript 3.0 及更早版本将被重定向到 [...]/node_modules/package-name/index.d.ts。

这本质上意味着,如果typesVersions中未定义该字段package.jsontypes则使用该字段,但是types当 . 具有多个导出路径时,该字段对我们没有帮助exports

希望这可以帮助!

{
  "exports": {
    "./module1": "./lib/module1/index.js",
    "./module2": "./lib/module2/index.js",
  },
  "typesVersions": {
     "*": {
       "module1": ["lib/module1/index.js"],
       "module2": ["lib/module2/index.js"]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)