分享好友 站长动态首页 网站导航

通用 TypeScript 项目结构与实践经验

网友发布 2022-10-26 20:27 · 头闻号编程技术

据说是 30 万行 Typescript 项目实践干货?
在多年的 Typescript 项目开发过程中,我们曾多次改变项目结构以适应新增的项目拆分需求,最终形成了现有的通用项目结构。这篇文章将会介绍这种通用的项目结构以及部分与之相关的实践经验。

项目包(package)结构不管项目简单还是复杂,通常都是由一个或多个包组成。

首先我们讨论单一包的项目结构,举个例子:# 源文件src/ library/.eslintrc.jstsconfig.jsonindex.ts program/.eslintrc.jstsconfig.jsonmain.tstest/ .eslintrc.js tsconfig.json some.test.tsprettier.config.jstsconfig.jsonpackage.json# 构建产物bld/ library/index.js program/main.js.bld-cache/ test/some.test.js首先:

构建产物部分:多包项目结构很多时候,一个包已经无法满足我们,不过多包项目以我们的做法来讲,和单包项目是类似的:packages/ gateway/src/program/ .eslintrc.js tsconfig.json main.tspackage.json server/src/program/scripts/package.json web/src/ program/ service-worker/package.json shared/src/library/package.jsonprettier.config.jstsconfig.jsonpackage.json相对单包项目来说,多包项目额外提供了一级(或多级)目录进行项目组织,也方便更精细的包依赖管理,不过依然共用了同一个 prettier 配置。依赖管理方面我们使用了 yarn workspace,包发布使用了 lerna。yarn workspace 会自动为包创建 node_modules 下的符号链接,便于其他包引入。另外推荐一个使用 yarn 的必备工具 yarn-deduplicate,基本上已经进入了我们解决类型冲突等多种问题的标准处理方式中,强烈建议加入 CI。

模块组织对于 Typescript 源文件,我们将无前缀的文件看作是将导出给域外(以文件夹分隔)使用的文件或可供域外使用的入口文件,将以 @ 开头的文件作为域内自有的不进行导出的文件。举个例子:src/library/ utils/index.tsstring.tsobject.ts internal.ts feature.ts index.ts以上文件在我们的约定中,所有内容都会被导出。具体来说,library/utils/index.ts 文件内容如下:

export

*

from

'./string'

;

export

*

from

'./object'

;

library/index.ts 内容如下:

export

*

from

'./utils'

;

export

*

from

'./feature'

;

export

*

from

'./internal'

;

如果为 utils 文件夹和 internal.ts 文件加上 @ 前缀:src/library/ @utils/index.tsstring.tsobject.ts @internal.ts feature.ts index.ts则对应的 library/index.ts 内容则应为:

export

*

from

'./feature'

;

这一方案在实践中适应性挺好,不过有时某个巨型模块或者整个包中,需要导出的内容数量众多,为了避免名称冲突,需要导出的内容避免不了各种前缀。为了改善这个问题,我们开始实验性地使用 namespace 方案作为补充。

在创建 index.ts 文件地同时,如果创建 namespace.ts 文件,则原有 index.ts 文件的内容将加入 namespace.ts 中,而 index.ts 文件内容则变为:

export

*

as

AwesomeNamespace

from

'./namespace'

;

为了方便,我们编写了一个叫 scoped-modules 的 eslint 规则,增加了以上规则的验证和自动修复。 完很多细节限于篇幅和避免失焦没有展开,有兴趣的同学欢迎在评论区留下问题~Photo by Joel Filipe on Unsplash
Makeflow(makeflow.com)让团队经验可以像文档一样详细地记录在流程中,指导和验证工作实践。每一次经验的迭代都可以通过任务的执行自然“推送”到整个团队,消除工作流程从想法到实践、从实践到改进之间的多种障碍。大到产品迭代管理,小到监控报警处置:记录、实践、再记录,把每一次进步写入团队基因——延续、变化、可复制。

免责声明:本平台仅供信息发布交流之途,请谨慎判断信息真伪。如遇虚假诈骗信息,请立即举报

举报
反对 0
打赏 0
更多相关文章

评论

0

收藏

点赞