我今天如何在 package.json 中使用“exports”来嵌套子模块和打字稿

Posted

技术标签:

【中文标题】我今天如何在 package.json 中使用“exports”来嵌套子模块和打字稿【英文标题】:How can I use "exports" in package.json today for nested submodules and typescript 【发布时间】:2022-01-14 16:22:13 【问题描述】:

我想利用 NodeJS/package.json 的新 "exports" 功能,以便我可以执行以下操作:

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

用户可以执行以下操作:

import  foo  from 'my-package/foo';

Typescript 4.5 应该 support the "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" 

问题:

    这个功能现在可以用于 typescript 项目了吗?如果没有,我只想知道。 如果#1 是,我错过了什么?关于 tsconfig 的细节对于源项目和消费项目都很有用。 TS 编译器抱怨 node12/nodenext 被用于 modulemoduleResolution 字段(我肯定使用 TS 4.5.2)。

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我认为很明显我可以使用文件路径导入,但不能使用我的“导出”的缩短版本。没有错误给你,它只是不起作用。此外,这些类型不是必需的,因为 TS 会在我在问题中引用的文档中提到的代码文件旁边查找 .d.ts 文件:devblogs.microsoft.com/typescript/…。无论如何,我试了一下,没有骰子。

以上是关于我今天如何在 package.json 中使用“exports”来嵌套子模块和打字稿的主要内容,如果未能解决你的问题,请参考以下文章

在使用Docker构建节点应用程序映像时如何摆脱package-lock.json警告?

在 NodeJs 微服务架构中,我应该为每个服务使用 package.json 吗?

如何在 package.json 中使用 $npm_config_?

如何在 package.json 中动态选择包管理器

如何在 package.json 中选择“模块”而不是“主”文件

在 VS Code 中,我收到此错误,“无法加载模块。尝试从 package.json' 加载更漂亮的