对于模块化简单介绍
Posted AI_huihui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于模块化简单介绍相关的知识,希望对你有一定的参考价值。
概念
把代码从上而下一一整理成许多板块,使代码能够组合、拆分和更换且不影响正常的实现运行。
好处
a . 可维护性
1、灵活架构,焦点分离
2、方便模块间组合、分解
3、方便单个模块功能调试、升级
4、多人协作互不干扰
b . 可复用性
c . 可实现按需加载
缺点:
性能损耗
1、系统分层,调用链会很长
2、模块间发送消息会很耗性能
node.js中模块的分类
内置模块:fs、path、http等
自定义模块: 我们创建的每一个.js后缀的文件都是自定义模块
第三方模块:第三方开发的模块,并不是官方提供,使用前要先下载
注意:
1.在使用require加载其他模块后会执行被加载模块代码
2.再使用require加载用户自定义模块期间可以省略.js后缀名
模块作用域
与函数的作用域相似,在自定义模块中所定义的变量、方法等只能再当前模块内才能够进行访问,外部文件不能访问,这种叫做模块作用域
好处:防止全局变量污染,文件依赖等问题
模块化规范
⚫ 使用什么样的语法格式来引用模块
⚫ 在模块中使用什么样的语法格式向外暴露成员
1.CommonJS规范(同步加载模块)
- 允许模块通过require方法来同步加载所要依赖的其他模块,然后通过exports或module.exports来导出需要暴露的接口。
-
优点:
- 简单容易使用
- 服务器端模块便于复用
-
缺点:
- 同步加载方式不适合在浏览器环境中使用,同步意味着阻塞加载,浏览器资源是异步加载的
- 不能非阻塞的并行加载多个模块
2.AMD(异步加载模块)
- 采用异步方式加载模块,模块的加载不影响后面语句的运行。所有依赖模块的语句,都定义在一个回调函数中,等到加载完成之后,回调函数才执行。
- 加载模块
require([module], callback);
第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback是加载成功之后的回调函。 -
优点:
- 适合在浏览器环境中异步加载模块
- 可以并行加载多个模块
-
缺点:
- 提高了开发成本,代码的阅读和书写比较困难,模块定义方式的语义不顺畅
- 不符合通用的模块化思维方式,是一种妥协的实现
3.CMD规范(异步加载模块)
- CMD规范和AMD很相似,简单,并与CommonJS和Node.js的 Modules 规范保持了很大的兼容性;在CMD规范中,一个模块就是一个文件。
- 定义模块使用全局函数define,其接收 factory 参数,factory 可以是一个函数,也可以是一个对象或字符串;
-
factory 是一个函数,有三个参数,function(require, exports, module):
- require 是一个方法,接受模块标识作为唯一参数,用来获取其他模块提供的接口:require(id)
- exports 是一个对象,用来向外提供模块接口
- module 是一个对象,上面存储了与当前模块相关联的一些属性和方法
- 优点:
- 依赖就近,延迟执行
- 可以很容易在 Node.js 中运行
- 缺点:
- 依赖 SPM 打包,模块的加载逻辑偏重
- 实现代表库
sea.js
:SeaJS对模块的态度是懒执行, SeaJS只会在真正需要使用(依赖)模块时才执行该模块
4.UMD
- UMD是AMD和CommonJS的糅合
- AMD 以浏览器第一原则发展异步加载模块。
- CommonJS 模块以服务器第一原则发展,选择同步加载,它的模块无需包装。
- UMD先判断是否支持Node.js的模块(exports)是否存在,存在则使用Node.js模块模式;在判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。
5.ES6模块化
- ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。
-
ES6 模块设计思想:尽量的静态化、使得编译时就能确定模块的依赖关系,以及输入和输出的变量(CommonJS和AMD模块,都只能在运行时确定这些东西)。
- 优点:
- 容易进行静态分析
- 面向未来的 EcmaScript 标准
- 缺点:
- 原生浏览器端还没有实现该标准
- 全新的命令字,新版的 Node.js才支持。
以上是关于对于模块化简单介绍的主要内容,如果未能解决你的问题,请参考以下文章
如何使用模块化代码片段中的LeakCanary检测内存泄漏?