npm 现在如何在package.json中使用“exports”来嵌套子模块和typescript

ndasle7k  于 2022-11-24  发布在  TypeScript
关注(0)|答案(4)|浏览(599)

最新更新(2022年6月6日):TS 4.7 supports "exports"传输标准

tl;dr

// package.json
"type": "module"

// tsconfig.json
"module": "node12" // or "nodenext"

更新:TS 4.5 does not support "exports"(另请参阅this问题):

...对Node.js 12的支持已经推迟到未来的版本,现在只在夜间版本中作为实验性标志提供。这不是一个容易的决定,但我们的团队考虑了生态系统准备情况和如何/何时使用该特性的一般指导。

**[2022-04-01]**该功能在TS 4.6中仍不可用。

原始问题:

我希望利用NodeJS/package.json的新特性“导出”,以便我可以执行以下操作:

"exports": {
  ".": "./dist/index.js",
  "./foo": "./dist/path/to/foo.js"
}

用户可以执行以下操作:

import { foo } from 'my-package/foo';

Typescript 4.5应该支持“exports”字段,但它似乎不起作用。我正在使用TS 4.5.2构建一个简单的包,并且我正在使用TS 4.5.2的项目中使用该包。我已经查看了其他SOquestionsthis github thread以及this bug report,但似乎无法在这个问题上找到共识,以及它是否应该在今天起作用。
注1:我仍然可以使用更详细的语法导入:

import { foo } from 'my-package/dist/path/to/foo.js';

注2:我也尝试过导出的对象表示法,但没有效果:

"exports": {
  ".": { "require": "./dist/index.js", "import": "./dist/index.js" },
  "./foo": { "require": "./dist/path/to/foo.js", "import": "./dist/path/to/foo.js" }
}

个问题:

1.这个特性现在可以在typescript项目中使用了吗?如果没有,我只想知道。
1.如果对#1的回答是肯定的,我遗漏了什么?tsconfig的细节对源项目和使用项目都很有用。TS编译器抱怨node12/nodenext被用于modulemoduleResolution字段(我肯定使用的是TS 4.5.2)。

htrmnn0y

htrmnn0y1#

我一直在寻找使用嵌套文件夹的设计系统包,我们在Pipefy创建,经过深入研究,我找到了如何做到这一点。
该包导出React组件,我们使用import { Button } from '@mypackage/design-system;导入它们
稍后,我们在设计系统库中添加了标记,如ColorsSpacingFonts,但我们不想从索引中导入所有内容,这样做效率不高。
经过一些详尽的研究,我发现了如何使用TypeScript导出嵌套文件夹。
要像这样使用TypeScript库,您应该使用package.json文件中的typesVersions
在这里我这样使用它

"typesVersions": {
    "*": {
      "index": [
        "lib/components/index.d.ts"
      ],
      "tokens": [
        "lib/tokens/index.d.ts"
      ]
    }
  },

这对我来说就像一种魅力,对你也一样!

swvgeqrz

swvgeqrz2#

在不知道您遇到了什么错误,或者TypeScript在其他方面似乎不为您工作(不知道您为什么不想分享这样重要的信息)的情况下,我可以告诉您的exports节似乎缺少类型信息。通常,如果您的.d.ts文件位于各自的.js文件旁边,您的exports节将如下所示:

"exports": {
  ".": {
    "types": "./dist/index.d.ts",
    "default": "./dist/index.js"
  },
  "./foo": {
    "types": "./dist/path/to/foo.d.ts",
    "default": "./dist/path/to/foo.js"
  }
}
u59ebvdq

u59ebvdq3#

我张贴我自己的答案,因为有很多关于这个主题的困惑。

NodeJS自v12.7.0(2019年7月)起支持导出

当我在2021年12月提出这个问题时,NodeJS支持exports字段已经有将近2.5年了,因此我们可以合理地假设Typescript支持它。

当我问这个问题时,Typescript不支援exports字段。

当我问这个问题时(2021年12月),package.json中的exports字段不被当时的Typescript版本(v4.5)支持,这让我特别困惑,因为TS 4.5测试版声明支持package.json导出。

Typescript 4.7(2022年6月)终于支持package.json导出

经过大量的测试和相当多的保密工作,typescript终于支持package.json的exports字段。

在package.json中使用typesVersions不是解决方案

一些人建议使用typesVersions--但这是一个完全独立的特性,只针对typescript(在这里阅读更多信息)。package.json中的exports字段被任何npm包支持-- typescript或不支持。

您需要什么才能使其正常工作

  • 您的 typescript 项目必须使用TS v4.7或更高版本
  • 您的tsconfig应该使用moduleResolutionnodenode16nodenext中的一个或多个。
  • 如果使用的module的值为CommonJSES2015ES6ES2020ESNEXT,则不必设置moduleResultion
nxowjjhe

nxowjjhe4#

如果使用"moduleResolution": "NodeNext"(或"Node16")而不是广泛使用的"moduleResolution": "Node",TypeScript只考虑package.json中的导出Map。(我猜"moduleResolution"默认为与"module"相同的值,但很难找到这方面的文档?
请参阅:https://www.typescriptlang.org/docs/handbook/esm-node.html
然而,许多TS库(包括微软自己的许多库)现在在"moduleResolution": "NodeNext"上有错误,因为像没有显式文件扩展名的相对导入这样的事情。

相关问题