在TypeScript的npm包中导入子文件夹

10
我将为npm创建一个包,但我希望它以以下方式被导入:
import myPackage from 'my-package';
import { subFunction1, subFunction2 } from 'my-package/subfunctions';

尝试使用我创建的包时,它可以正确加载根文件,但对于子文件夹会产生以下错误:

无法找到模块“my-package/subfunctions”

我当前发布到npm的文件夹结构如下:
index.js
index.d.ts
subfunctions/
  sub-function-1.js
  sub-function-1.d.ts
  sub-function-2.js
  sub-function-2.d.ts
  index.js
  index.d.ts

我的package.json文件中的类型声明如下:

"types": [
  "./dist/index.d.ts",
  "./dist/subfunctions/index.d.ts",
],

以下是文件 index.d.ts(1)和 subfunctions/index.d.ts(2)的内容: (1)
import myCode from './lib/my-code';
export default myCode;

(2)

export { subFunction1 } from './sub-function-1';
export { subFunction2 } from './sub-function-2';

我该如何从这个子文件夹中导入呢?

从其他的package.json文件来看,它们通常会创建一个子文件夹,比如叫做lib。然后在文件中加入"main": "dist/index.js"。所以如果你把你的代码移动到一个名为lib的目录下,并修改package.json文件,这样行得通吗? - Keith
@Keith,我不明白。我的当前package.json文件中有“main:“dist/index.js””。 - Gabriel Siedler
1
我有完全相同的问题。@GabrielSiedler,你找到了什么解决方法吗? - Emech
1个回答

0

我知道这是一个非常老的问题,但我想分享一下我的答案。看起来在package.json中有一个更新的字段"exports"(自Node.js 12+,约2019年开始支持),它被提供作为"main"的替代方案,可能正是你(和其他遇到同样问题的人)正在寻找的。

虽然我自己没有测试过,但"exports"支持"子路径导出", 允许您从与主要代码不同的路径导出子模块代码:

{
  "main": "./index.js",
  "exports": {
    ".": "./index.js",
    "./subFunctions": "./src/subFunctions/index.js"
  }
}

从导入的角度来看,这将会得到你想要的结果:

import myPackage from "my-package";
import subFunctions from "my-package/subFunctions";

或者大概是(文档上不太清楚,所以我不确定,但这很有道理):

import myPackage from "my-package";
import { subFunction1, subFunction2 } from "my-package/subFunctions";

假设 src/subFunctions/index.js 具有匹配的命名导出。

如果有任何误导之处,敬请谅解,因为我只是从文档中获取这些信息(几天前在偶然情况下偶然发现了这个问题),但如果它能够正常工作,希望这能帮助到某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接