CommonJS规范

一 简介

09年,Ryan Dahl创造了node.js项目,将js用于服务器端编程。这标志"JS模块化编程"正式诞生。因为浏览器环境下,没有模块也不是特别大的问题,毕竟网页程序的复杂性有限;但在服务器端,一定要有模块,与操作系统和其他应用程序互动,否则根本没法编程。

Node应用由模块组成,采用CommonJS模块规范。其模块系统,就参照CommonJS规范实现。

根据该规范,每个文件就是一个模块,有自己的作用域。在一个文件里定义的变量、函数、类,都是私有的,对其他文件不可见

1用途

(1)适用场景

Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以CommonJS规范比较适用。

2优缺点及对比

(1)优点

(2)缺点

(3) 特点与对比

module.exports导出模块,require()加载导出的模块

所有代码都运行在模块作用域,不会污染全局作用域。

模块可以多次加载,但只会在第一次加载时运行一次,然后运行结果就被缓存,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。

模块加载的顺序,按照其在代码中出现的顺序。

和AMD的对比

CommonJS规范加载模块是同步的,只有加载完成,才能执行后面的操作

AMD规范则可以异步加载模块,允许指定回调函数

Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以CommonJS规范比较适用。

浏览器环境,要从服务器端加载模块,就必须采用非同步模式,因此浏览器端一般采用AMD规范

(4) CommonJS 模块的加载原理

CommonJS 的一个模块,就是一个脚本文件。require命令第一次加载该脚本,就会执行整个脚本,然后在内存生成一个对象。


{
  id: '...',
  exports: { ... },
  loaded: true,
  ...
}

以后需要用到这个模块的时候,就会到exports属性上面取值。即使再次执行require命令,也不会再次执行该模块,而是到缓存之中取值

也就是说,CommonJS 模块无论加载多少次,都只会在第一次加载时运行一次,以后再加载,就返回第一次运行的结果,除非手动清除系统缓存

二 基本概念与技术重点整理

(1)CommonJS模块基础

每个文件就是一个模块,有自己的作用域。在一个文件里定义的变量、函数、类,都是私有的,对其他文件不可见。

如果想在多个文件分享变量,必须定义为global对象的属性。如:

global.warning = true;

此写法不推荐。

每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外接口。加载某个模块,其实是加载该模块的module.exports属性。

例如:下面代码通过module.exports导出模块变量x和函数addX。

var x = 5;
var addX = function (value) {
  return value + x;
};
module.exports.x = x;
module.exports.addX = addX;

在CommonJS中,有一个全局性方法require(),用于加载模块。 通过下面代码(require)加载导出的模块

var example = require('./example.js');

console.log(example.x); // 5
console.log(example.addX(1)); // 6

(2)CommonJS module对象

三 使用实践及案例

四 资源与参考

1官网

2文档

3源码

4教程

(1)已学习:

CommonJS规范(阮一峰) http://javascript.ruanyifeng.com/nodejs/module.html

(2)学习中:

(3)待学习:

官方教程:

其他教程:

5工具与资源

results matching ""

    No results matching ""