JavaScript模块化规范主要遵循CommonJS和AMD规范。html
CommonJS规范-服务器端JavaScript规范node
Node.js是一个服务器端JavaScript项目,采用了CommonJS标准实现其模块系统。npm
CommonJS中采用一个全局require方法来加载模块,主要由原生模块module来实现和完成,该模块在启动时已经被加载。json
模块主要分为两类:原生模块,文件模块。api
1.原生模块数组
原生模块也是Node.js中最核心的模块。原生模块在Node.js源代码编译的时候编译进了二进制执行文件,加载的速度最快。浏览器
Node.js中存在许多原生模块,例如:http,net,os,path,fs, module等等,其引用方式为var fs = require('fs');缓存
2.文件模块服务器
文件模块是动态加载的,加载速度比原生模块慢。可是Node.js对原生模块和文件模块都进行了缓存,在第二次require该模块时,是不会有重复开销。网络
文件模块可细分为3类。这三类文件模块以文件后缀来区分,Node.js会根据后缀名来决定加载方法。
.js。经过fs模块同步读取js文件并编译执行。
.node。一般为npm安装的第三方模块。
.json。读取文件,调用JSON.parse解析加载。
虽然Node.js使用require方法引入模块的方式看似简单,但内部的加载却并不简单,且其中的优先级也不同。
AMD规范-浏览器端JavaScript规范
CommonJS中模块存放在本地,使用同步方式加载模块,其加载时间基本至关于磁盘IO时间,这不会存在问题,可是若是环境是浏览器,则文件的加载受制于网络因素,若是网络加载比较慢,则可致使浏览器处于假死状态,所以浏览器端只能采用异步加载模块的方式。
AMD:Asynchronous Module Definition(异步模块定义)。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。全部依赖这个模块的语句,都定义在一个回调函数中,等到加载完成以后,这个回调函数才会运行。
AMD也采用require()语句加载模块,可是不一样于CommonJS,它要求两个参数:require([module], callback);
第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback,则是加载成功以后的回调函数。目前,主要有两个Javascript库实现了AMD规范:require.js和curl.js。
require.js采用AMD规范实现模块加载,其采用define函数来定义。define函数接受两个参数,第一个参数为依赖数组,第二个参数为待定义的模块函数。若是没有依赖模块,则第一个参数也能够省略。
参考:
http://www.infoq.com/cn/articles/nodejs-module-mechanism
http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_definition.html
http://nodejs.org/api/modules.html