具有多个入口点的TypeScript包

ezykj2lf  于 2023-03-19  发布在  TypeScript
关注(0)|答案(2)|浏览(126)

公开节点包模块的标准方法是在index.ts中列出它们,如下所示:

export * from './module1';
export * from './module2';

然而,这会立即加载两个模块的内容。我希望有一个不在index.ts文件中导出的模块,因为它需要安装一些可选的依赖项。
我遵循了以下指南:https://blog.mozilla.org/data/2021/04/07/this-week-in-glean-publishing-glean-js/
我的包裹

"exports": {
    ".": {
      "import": "./dist/es/index.js",
      "require": "./dist/cjs/index.js"
    },
    "./module2": {
      "import": "./dist/es/module2.js",
      "require": "./dist/cjs/module2.js"
    }
  },
  "typesVersions": {
    "*": {
      ".": [
        "./dist/types/index.d.ts"
      ],
      "./module2": [
        "./dist/types/module2.d.ts"
      ]
    }
  },
// fallback for older Node versions:
  "module": "dist/es/index.js",
  "main": "dist/cjs/index.js",
  "types": "dist/types/index.d.ts",

在我构建了这个项目(使用tsc,分别用于CJS和ESM)之后,输出目录结构如下所示:

- dist
  - cjs
    - index.js
    - module2.js
  - es
    - index.js
    - module2.js
  - types
    - index.d.ts
    - module2.d.ts

但是,当我发布这个包并将其安装在客户端项目中时,module2不起作用。

import {sayHello} from 'ts-exports-test';
import {sayGoodbye} from 'ts-exports-test/module2';

console.log(sayHello());
console.log(sayGoodbye());

我用ts-node运行它,得到错误:

src/index.ts:2:26 - error TS2307: Cannot find module 'ts-exports-test/module2' or its corresponding type declarations.

注意:对于使用TS4.5的客户端,类型路径可以在“exports”部分声明,这样就不需要“typesVersions”了。但这是将来的事。

2ic8powd

2ic8powd1#

如果您在typesVersion中定义路径,它就可以工作,如下所示:

"typesVersions": {
    "*": {
      "*": [
        "dist/types/index.d.ts"
      ],
      "module2": [
        "dist/types/module2.d.ts"
      ]
    }
  }

不确定它遵循什么约定,但看起来像../这样的路径是无效的。
您可以检查存储库https://github.com/diedu89/ts-export-import-test

jjhzyzn0

jjhzyzn02#

2022年,TypeScript 4.9及更高版本

exports的优先级高于typesVersions
以前,TypeScript在通过--moduleResolution node16下的package.json进行解析时,错误地将typesVersions字段的优先级设置为高于exports字段。如果此更改影响您的库,您可能需要在package.jsonexports字段中添加types@版本选择器。执行此操作的正确方法是现在使用exports字段-

{
      "type": "module",
      "exports": {
          ".": {
              "import": "./dist/es/index.js",
              "require": "./dist/cjs/index.js",
              "types": "./dist/types/index.d.ts"  ✅
          },
          "module2" {
              "import": "./dist/es/module2.js",
              "require": "./dist/cjs/index.js",
              "types": "./dist/types/module2.ts"  ✅
          }
      }
  }

相关问题