如何正确使用 package.json 的 exports 进行路径映射? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
sub166
V2EX    程序员

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

  sub166 2023-06-27 10:51:04 +08:00 1542 次点击
这是一个创建于 837 天前的主题,其中的信息可能已经有所发展或是发生改变。

在我的一个 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 无果,所以来请教各位大佬

7 条回复    2023-06-28 09:24:19 +08:00
zhuisui
    1
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
    2
zbinlin  
   2023-06-27 11:45:14 +08:00
tsconfig.json 配置是怎样的
sub166
    3
sub166  
OP
   2023-06-27 11:49:36 +08:00
@zhuisui 抱歉,信息没提供全。两个项目的 ts 都是 5.1.3 ,node16 ,报错的是 ide

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

但是在使用其他的 npm 包的时候,moduleResolution 为 Node 时也不会报错
sub166
    4
sub166  
OP
   2023-06-27 11:54:20 +08:00
@zbinlin 原本是 moduleResolution: Node ,改成 NodeNext 就没有问题了。但是使用其他包时不需要特地修改,很奇怪
zhuisui
    5
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
    6
zhuisui  
   2023-06-27 13:50:18 +08:00   1
之前我没从头到尾看这篇文档 https://www.typescriptlang.org/docs/handbook/esm-node.html
这里面开头就提了,下面的特性都是为 node ECMAScript Module 做的支持,包括使用 moduResolution: NodeNext 和 import conditions 。
不知道你说的别的 npm 包是什么情况,但这儿用了 mjs 显然应该用文档要求的使用方式。
另外,文档要求把 types 放到首行,应该是有特殊目的的。
SmiteChow
    7
SmiteChow  
   2023-06-28 09:24:19 +08:00
为什么要加最后一句废话生成器,给我整笑了
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2669 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 24ms UTC 13:47 PVG 21:47 LAX 06:47 JFK 09:47
Do have faith in what you're doing.
ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86