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)待学习:
官方教程:
其他教程: