模块和命名空间
曾经在TypeScript中,命名空间叫做内部模块,模块叫做外部模块,说明两者存在着不少相似之处。那么这两者组织代码结构的方法在使用场景上有何区别和联系呢?
定义
模块
从 ES6开始,JS引入了模块的概念,TS随之沿用。两个模块之间的关系是通过文件级别上的imports和exports关键词建立的,所以每个源代码文件都可以理解为一个模块。当导入其他模块时,会通过模块加载器(CommonJS等)在执行模块代码前去查找并执行这个模块的所有依赖。
命名空间
命名空间是位于全局命名空间下的一个普通的带有名字的JS对象,和模块最大的不同在于其是可以跨文件的。当使用时我们通常通过—outFile编译选项将所有全局命名空间的类型编译到一个文件(即模块)中再引入到项目中。所以从广义上来讲,命名空间可以看作在一个将会被用到全局的模块下的内部模块,该内部模块里的内容可以按需分散到各个文件中。
使用策略
- 不应该对模块使用命名空间,因为命名空间是为了在全局对逻辑上相关的对象和类型进行分组,然而模块文件本身就已经是一个分组。
- 由于命名空间下的内容需要通过全局名称去访问,为了简化操作可以通过import a = a.b的语法为指定内容创建别名。
- 如果需要让命名空间内的接口和类可以在命名空间外部访问,需要使用export,相对的,内部的实现细节不应该被export。
- 将同一命名空间内容分割到多个文件时,由于其存在依赖关系,我们应该使用三斜线引用标签告诉编译器文件之间的关联。
- 命名空间相对于模块的优势在于不必声明依赖,想用时记住空间名称即可,非常方便快捷。相对的劣势就在于不方便管理,当项目变大时不易查找和维护分散在各个文件中的命名空间代码。所以通常情况下,我们使用模块去组织代码,但针对于变动较小又频繁使用的代码内容更适合使用命名空间去降低维护成本,提升开发体验。
-- EOF --
添加在分类「
前端开发
」下,并被添加
「TypeScript」
标签。