一、JS规范缺陷
1.没有模块系统;
2.标准库较少;
3.没有标准接口;
4.缺乏包管理系统。
二、CommonJS的模块规范
1.模块引用:require()方法
var math=require('math'); //require方法引入一个模块的API到当前上下文中。
2.模块定义:exports对象、module对象
(1)exports对象:用于导出当前模块的方法或者自变量,并且它是唯一导出的出口。
(2)module对象:代表模块自身。在Node中,一个文件就是一个模块,将方法挂载在exports对象上作为属性即可定义导出的方式。
//math.js
exports.add=function(){
var sum=0, i=0, args=arguments, l=args.length;
while(i<1){
usm+=args[i++];
}
return sum;
};
//index.js
var math=require('math');
exports.increment=function(val){
return math.add(val,+);
}
3.模块标识:即传递给require方法的参数,必须是符合小驼峰命名的字符串,或者以.、…开头的相对路径,或者绝对路径。它可以没有文件名后缀.js。
三、CommonJS的模块实现
(1)模块的分类:
- 核心模块:在Node源代码的编译过程中,编译进了二进制执行文件。在Node进程启动时,部分核心模块就被直接加载进内存中,省略掉了文件定位和编译执行这两个步骤。所以它的加载速度最快。
- 文件模块:在运行时动态加载,需要完整的路径分析、文件定位、编译执行过程,速度比核心模块慢。文件模块通常调用核心模块、由第三方编写。
(2)过程:路径分析->文件定位->编译执行
四、AMD(异步模块定义)
模块定义
define(id?,dependencies?,factory);
//id和依赖dependencies是可选的,factory的内容就是实际代码的内容。
例如,
define(function(){
var exports={};
exports.sayHello=function(){
alert('Hello from module:'+module.id);
};
return exports;//内容通过返回的方式实现导出
});
五、CMD规范
与AMD规范的主要区别在于定义模块和依赖引入的部分。AMD需要在声明模块的时候指定所有的依赖,通过形参传递依赖到模块内容中。
例如,
define(['dep1','dep2'],function(dep1,dep2){
return function(){};
});
在依赖部分,CMD支持动态引入
define(function(require,exports,module){
//模块代码内容
});
六、包与NPM
1.概念:将模块联系起来的一种机制。
2.CommonJS的包规范的定义:
(1)包结构
包应该包含如下这些文件:package.json、bin、lib、doc、test
(2)包描述文件
用于表达非代码相关的信息,是一个JSON格式的文件——package.json
3.NPM常用功能
(1)查看帮助
$ npm -v //查看当前npm版本
$ npm //查看帮助引导说明
(2)安装依赖包
$ npm install express -g //全局安装express模块
$ npm install <folder> //从本地安装,尖括号内的目录为package.json文件所在位置
$ npm install underscore --registry=http://registry.url //从镜像源安装
(3)NPM钩子命令
package.json中scripts字段就是让包在安装或者卸载等过程中提供钩子机制。
示例,
"scripts":{
"preinstall":"preinstall.js",
"install":"install.js",
"uninstall":"uninstall.js",
"test":"test.js"
}
在以上字段中执行npm install package时,preinstall指向的脚本将会被加载执行,然后install指向的脚本会被执行。
在执行npm uninstall package时,uninstall指向的脚本也许会做一些清理工作。
当在一个具体的包目录下执行npm test时,将会运行test指向的脚本。
(4)发布包
编写模块->初始化包描述文件npm init->注册仓库账号->上传包npm publish folder->安装包->管理包权限
(5)分析包
可以为你分析出当前路径下能够通过模块路径找到的所有包,并生成依赖树。
$ npm ls
4.NPM潜在问题:采纳模块时要考虑包质量和安全问题。
——阅读《深入浅出node.js》第二章