F. *_*ler 4 javascript architecture dependencies circular-dependency typescript
想象一下以下设置:
有一个 api,其中包含一个文件夹foo
和bar
. 这些文件夹将所有公共内容导出到本地文件夹index.ts
,本地文件夹将通过重新导出公共内容export * from [...]
以使其更加方便。
在我的示例中,存在循环依赖,因为foo.ts
需要一部分bar
,反之亦然 -我完全理解为什么会出现这种情况。
请参阅下面的屏幕截图:
如何使用 TypeScript 在具有数百个类、函数、常量、类型、枚举等的环境中有效地解决此问题?我想我需要某种帮助文件来解决共性。
即使我创建了某种foobar
需要的文件夹foo
,bar
然后将所有内容导出到一个大导出文件中,它可能很快就会变得混乱。如果我只需要bar
或仅需要怎么办foo
?命名导出是否足够好?
我也想避免将来出现问题,所以我正在寻找一个可靠的解决方案。调用优先级不是我在这里尝试解决的主要问题。更多的是关于如何以智能的方式设置依赖关系。
我想分别使用 foo 和 bar,它们应该能够彼此共享函数/类型/枚举/接口等。
可以在这里找到一个非常简单的代码片段:
你的例子似乎很通用,所以我尝试描述一些一般的经验法则,但它们可能在某种程度上是固执己见的。
foo
消除bar
它的最简单方法是将所有循环依赖单元提取到单独的模块/目录中,例如foobar
。你提到了这个解决方案,但是依赖的方向应该是不同的。和foo
都bar
应该要求foobar
提供提取的共享代码。这样您仍然可以单独导入foo
(bar
暂时导入foobar
)。functions/types/enums/interfaces
您提到的每一个 - 如果两者都使用某些东西foo
,bar
那么它应该放置在单独的模块/目录中。functions/types/enums/interfaces
- 我会考虑使用此类名称作为最后的手段(例如,作为目录树中叶子目录的名称),因为它们传达的信息通常是不相关的。更好的方法是围绕业务域概念而不是与实现细节相关的名称来组织(并置)代码。这提高了代码的可发现性并降低了代码组织的脆弱性。例如代替<sourcesRoot>/api/functions/getUser.ts
<sourcesRoot>/api/functions/getPosts.ts
<sourcesRoot>/api/enums/UserRole.ts
<sourcesRoot>/api/types/User.ts
<sourcesRoot>/api/types/Post.ts
<sourcesRoot>/api/index.ts
Run Code Online (Sandbox Code Playgroud)
...考虑使用:
<sourcesRoot>/users/api/getUser.ts
<sourcesRoot>/users/model/User.ts
<sourcesRoot>/users/model/UserRole.ts
<sourcesRoot>/users/index.ts
<sourcesRoot>/posts/api/getPosts.ts
<sourcesRoot>/posts/model/Post.ts
<sourcesRoot>/posts/index.ts
Run Code Online (Sandbox Code Playgroud)
foo
小bar
。尝试从单独的目录中提取一些子域/区域/上下文foo
或将bar
其提取到单独的目录中。这应该会生成较小的index.ts
文件。 归档时间: |
|
查看次数: |
10514 次 |
最近记录: |