如何正确使用 package.json 的 exports 进行路径映射?

2023-06-27 10:51:04 +08:00
 sub166

在我的一个 npm 包a中,目录结构如下:

dist
├── another.cjs
├── another.d.ts
├── another.mjs
├── index.cjs
├── index.d.ts
├── index.mjs
└── types.d.ts

apackage.json:

{
  "name": "a",
  "version": "1.0.0",
  "main": "dist/index.cjs",
  "module": "dist/index.mjs",
  "types": "dist/index.d.ts",
  "exports": {
    ".": {
      "import": "./dist/index.mjs",
      "require": "./dist/index.cjs",
      "types": "./dist/index.d.ts"
    },
    "./another": {
      "import": "./dist/another.mjs",
      "require": "./dist/another.cjs",
      "types": "./dist/another.d.ts"
    },
    "./types": "./dist/types.d.ts"
  },
  "files": [
    "dist"
  ],
  ...
}

在另一个项目中通过

import test from 'a/another'

调用 a ,然后报错:

Cannot find module 'a/another' or its corresponding type declarations.ts(2307)

查询 chatgpt 无果,所以来请教各位大佬

1097 次点击
所在节点    程序员
7 条回复
zhuisui
2023-06-27 11:39:37 +08:00
写法是不是有问题,参照 https://www.typescriptlang.org/docs/handbook/esm-node.html#packagejson-exports-imports-and-self-referencing types 写错了吧,不确定能不能用。
另外,是 IDE 报的错,还是 tsc ,还是什么程序?
ts 版本支持不,要 4.7 吧,node 版本支持不?
zbinlin
2023-06-27 11:45:14 +08:00
tsconfig.json 配置是怎样的
sub166
2023-06-27 11:49:36 +08:00
@zhuisui 抱歉,信息没提供全。两个项目的 ts 都是 5.1.3 ,node16 ,报错的是 ide

后面我查了 StackOverflow ,大部分的解决方案是把 tsconfig 的 moduleResolution 改成 NodeNext

但是在使用其他的 npm 包的时候,moduleResolution 为 Node 时也不会报错
sub166
2023-06-27 11:54:20 +08:00
@zbinlin 原本是 moduleResolution: Node ,改成 NodeNext 就没有问题了。但是使用其他包时不需要特地修改,很奇怪
zhuisui
2023-06-27 13:42:08 +08:00
IDE 报错了难道 tsc 没报错?有时候可能是 IDE 的问题。
另外,我倒是没用过 exports 的 typings ,我只用过 typesVersions
至于,

> moduleResolution: 'node16' or 'nodenext' for Node.js’ ECMAScript Module Support from TypeScript 4.7 onwards

exports 是 node16 的特性,用 nodenext 也合理吧。
zhuisui
2023-06-27 13:50:18 +08:00
之前我没从头到尾看这篇文档 https://www.typescriptlang.org/docs/handbook/esm-node.html
这里面开头就提了,下面的特性都是为 node ECMAScript Module 做的支持,包括使用 moduResolution: NodeNext 和 import conditions 。
不知道你说的别的 npm 包是什么情况,但这儿用了 mjs 显然应该用文档要求的使用方式。
另外,文档要求把 types 放到首行,应该是有特殊目的的。
SmiteChow
2023-06-28 09:24:19 +08:00
为什么要加最后一句废话生成器,给我整笑了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/951993

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX