node.js|对于模块化简单介绍

概念
把代码从上而下一一整理成许多板块,使代码能够组合、拆分和更换且不影响正常的实现运行。

好处
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来导出需要暴露的接口。
  • 优点:
    1. 简单容易使用
    2. 服务器端模块便于复用
  • 缺点:
    1. 同步加载方式不适合在浏览器环境中使用,同步意味着阻塞加载,浏览器资源是异步加载的
    2. 不能非阻塞的并行加载多个模块
2.AMD(异步加载模块)
  • 采用异步方式加载模块,模块的加载不影响后面语句的运行。所有依赖模块的语句,都定义在一个回调函数中,等到加载完成之后,回调函数才执行。
  • 加载模块require([module], callback); 第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback是加载成功之后的回调函。
  • 优点:
    1. 适合在浏览器环境中异步加载模块
    2. 可以并行加载多个模块
  • 缺点:
    1. 提高了开发成本,代码的阅读和书写比较困难,模块定义方式的语义不顺畅
    2. 不符合通用的模块化思维方式,是一种妥协的实现
3.CMD规范(异步加载模块)
  • CMD规范和AMD很相似,简单,并与CommonJS和Node.js的 Modules 规范保持了很大的兼容性;在CMD规范中,一个模块就是一个文件。
  • 定义模块使用全局函数define,其接收 factory 参数,factory 可以是一个函数,也可以是一个对象或字符串;
  • factory 是一个函数,有三个参数,function(require, exports, module):
    1. require 是一个方法,接受模块标识作为唯一参数,用来获取其他模块提供的接口:require(id)
    2. exports 是一个对象,用来向外提供模块接口
    3. module 是一个对象,上面存储了与当前模块相关联的一些属性和方法
  • 优点:
  1. 依赖就近,延迟执行
  2. 可以很容易在 Node.js 中运行
  • 缺点:
  1. 依赖 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 规范,成为浏览器和服务器通用的模块解决方案。
  • 【node.js|对于模块化简单介绍】ES6 模块设计思想:尽量的静态化、使得编译时就能确定模块的依赖关系,以及输入和输出的变量(CommonJS和AMD模块,都只能在运行时确定这些东西)。
  • 优点:
  1. 容易进行静态分析
  2. 面向未来的 EcmaScript 标准
  • 缺点:
  1. 原生浏览器端还没有实现该标准
  2. 全新的命令字,新版的 Node.js才支持。

    推荐阅读