最新更新(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的项目中使用该包。我已经查看了其他SO、questions和this 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
被用于module
或moduleResolution
字段(我肯定使用的是TS 4.5.2)。
4条答案
按热度按时间htrmnn0y1#
我一直在寻找使用嵌套文件夹的设计系统包,我们在Pipefy创建,经过深入研究,我找到了如何做到这一点。
该包导出React组件,我们使用
import { Button } from '@mypackage/design-system;
导入它们稍后,我们在设计系统库中添加了标记,如
Colors
、Spacing
和Fonts
,但我们不想从索引中导入所有内容,这样做效率不高。经过一些详尽的研究,我发现了如何使用TypeScript导出嵌套文件夹。
要像这样使用TypeScript库,您应该使用
package.json
文件中的typesVersions
。在这里我这样使用它
这对我来说就像一种魅力,对你也一样!
swvgeqrz2#
在不知道您遇到了什么错误,或者TypeScript在其他方面似乎不为您工作(不知道您为什么不想分享这样重要的信息)的情况下,我可以告诉您的
exports
节似乎缺少类型信息。通常,如果您的.d.ts文件位于各自的.js文件旁边,您的exports节将如下所示: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或不支持。您需要什么才能使其正常工作
moduleResolution
:node
、node16
或nodenext
中的一个或多个。module
的值为CommonJS
、ES2015
、ES6
、ES2020
或ESNEXT
,则不必设置moduleResultion
nxowjjhe4#
如果使用
"moduleResolution": "NodeNext"
(或"Node16"
)而不是广泛使用的"moduleResolution": "Node"
,TypeScript只考虑package.json
中的导出Map。(我猜"moduleResolution"
默认为与"module"
相同的值,但很难找到这方面的文档?请参阅:https://www.typescriptlang.org/docs/handbook/esm-node.html
然而,许多TS库(包括微软自己的许多库)现在在
"moduleResolution": "NodeNext"
上有错误,因为像没有显式文件扩展名的相对导入这样的事情。