【发布时间】:2017-09-11 20:54:27
【问题描述】:
更新[09/12/2017 16:58 EST]
在此问题的底部添加了为什么我不愿将本机支持的非相对导入与我自己的模块一起使用的原因。
更新[09/12/2017 12:58 EST]:
根据要求,我使下面的文件结构反映了我的实际用例。这是一个嵌套视图模块,请求目录树上某处的实用程序模块。
每个请求
在 TypeScript 和 ES6 中,可以通过以下方式导入自定义模块
// Relative
import { numberUtil } from './number_util';
// OR
// Non-relative
import { numberUtil } from 'number_util';
根据 TypeScript 文档 (link),应该:
... 使用 保证维护您自己的模块的相对导入 它们在运行时的相对位置。
... 导入任何文件时使用非相对路径 您的外部依赖项。
我的问题是我的项目结构是这样的:
project/
|--utils
| |--number_util.ts
|--views
| |--article_page
| |-- editor_view
| |--editor_text_area.ts
当我在 editor_text_area 模块中包含 utils/number_util 时,导入语句如下所示:
import { numberUtil } from './../../../utils/number_util';
这很长且不可读,最糟糕的是,难以维护:每当我需要移动 editor_text_area 时,我将不得不更新这些相对路径,同时我只能使用非相对路径方式
import { numberUtil } from 'utils/number_util';
对于如何最好地进行模块导入以实现最高的可读性和可维护性,是否有人有任何建议?
但是使用非相对方式会带来一个问题(除了官方文档不推荐):如果我安装了一个与我正在导入的模块同名的npm 模块怎么办?在这一点上,它不像上面提到的更丑陋的替代方案那样安全。
【问题讨论】:
-
通常嵌套层次结构太深是架构问题的标志。是什么让它这么深?
-
@loganfsmyth 请查看我更新的代码 sn-p,我包含了一个与我的非常相似的真实用例
-
之前在应用程序中拥有顶级“views”文件夹,我个人觉得正是这个原因令人沮丧。我选择将
editor_view和其他类似的东西移到顶部。它的名称中已经包含view。将它们全部放在名为view的文件夹和特定于页面的文件夹中不会提供任何有意义的逻辑。如果您需要特定于页面的逻辑,例如“article_view 上加载了什么”,导入/导出依赖图已经告诉您。 -
我必须说,我不会完全扁平化您的源层次结构。实际上,我发现在非平凡的项目中进行这种结构化非常有用。只是不要让它变得太深。因此,如果
editor_view实际上对其他视图也有用,但只是article_page需要,您应该将其提升一个级别。
标签: javascript typescript ecmascript-6