在打字稿库项目中组织 NPM 模块导出的最佳实践?

Posted

技术标签:

【中文标题】在打字稿库项目中组织 NPM 模块导出的最佳实践?【英文标题】:Best practice in organizing NPM module exports in a typescript library project? 【发布时间】:2020-12-04 19:56:44 【问题描述】:

我正在使用 Typescript 编写一个库包,以发布到 npm 注册表,以便其他各种项目可以使用它。

我已按照publishing doc 确保--declaration 选项对于tsc 是正确的,以便在*.d.ts 文件中也导出类型定义。

我现在的问题是,这些导出分散在各个文件夹中,我的包的消费者正在像下面这样导入它们。

import  FooType  from 'my-test-pacakge/dist/src/foo/types';
import  BarInterface  from 'my-test-package/dist/src/foo/bar';

我想知道这是否可以接受,因为它看起来很乱。我应该编写自己的声明文件以更简洁地组织它们吗?

已有类似问题的答案建议exporting the API through a general index.ts file。这对我来说听起来很合理,但我只是想知道直接从 dist 文件夹导入是否被认为是不好的做法?

【问题讨论】:

【参考方案1】:

大多数包更喜欢从 1 个导出点导出,这样您的库的用户就不需要知道任何关于您包的目录结构的信息。

import  FooType, BarInterface  from 'my-test-package'.

一个额外的好处是,您可以在不影响最终用户的情况下重新构建包的内部结构,并且它清楚地描述了您打算由包的用户使用哪些项目,以及哪些项目是包的内部.

所以是的,我同意这是最佳做法。

有些包有额外的命名空间,我想到了mysql2 包,它有两个主要的导出:

import  Connection  from 'mysql2';
import  Connection  from 'mysql2/promise';

但请注意,这里没有像 dist 这样的东西。 dist 对最终用户没有意义。

【讨论】:

非常感谢!这无疑强化了我这样做的想法。我还遇到了这个博客,它以非常简洁的方式谈论了相同的主题。 betterstack.dev/blog/…

以上是关于在打字稿库项目中组织 NPM 模块导出的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

禁用 VSCODE 中默认打字稿库的智能感知

如何在没有“dist”的情况下在 NPM 上发布 TypeScript 模块?

NPM 模块 + TypeScript 最佳实践

库的打字稿声明文件找不到模块

集中webpack配置多个项目 - 最佳实践?

vue项目的一些最佳实践提炼和经验总结