nodejs深入浅出读书笔记(二)
nodejs的模块化
1.CommonJS 规范
-- CommonJS为JavaScrip定了一个美好的愿景,就是希望它可以在任何地方使用
a.没有模块系统
b.标准库较少。
c.没有标准接口
d.缺乏包管理器
2.CommonJS模块规范
a.模块的引用
var math = require('math') console.log(math.xxxx)
b.模块定义
export.add = function(){
...
}
3.nodeJs模块规范
a.Node依次查找.js、.json、.node的文件
b.本地安装包的方式只需为npm指明package.json文件所在的位置
4.npm钩子
package.json中的scripts命令就是让包在安装或者卸载过程中提供钩子机制
5.npm包的发布
1.npm login || npm adduser 然后按提示操作
2.进入到要上传的文件夹,在package同级目录下面执行npm publish .
注意:npm发的邮件有可能被qq邮箱视为垃圾邮件
6. npm包的安装
npm install xxxx
7. 多人发布包,增加,删除,列出
npm owner ls
npm owner add
npm owner rm
8.分析包
npm list
9.npm包平台的问题
a.上传者的水平不一,所以质量性能方面有待验证
b.包能在服务器端运行,需要考虑安全问题
10.鉴于网络的原因,commonjs为服务器端js指定的规范并不适用于前端
这样就产生了AMD规范,Asynchronous Module Definition 即
异步定义模块,是commondjs的一个延伸
amd规范定义模块的方式
define(function() { var exports = {}; exports.sayHello = function() { alert('Hello from module: ' + module.id); }; return exports; });
11.cmd规范主要由国内的玉伯提出,与amd规范的区别主要在于定义模块和引入依赖的部分。
amd需要在声明时候指定所有的依赖,通过形参传入依赖到模块内容中
define(['dep1', 'dep2'], function (dep1, dep2) { return function () {}; });
cmd 规范更接近commonjs规范的定义,cmd支持动态引入依赖
define(factory); define(function(require, exports, module) { // The module code goes here });
12.兼容多种模块规范
;(function (name, definition) { // 检测下文环境是否为AMD或CMD var hasDefine = typeof define === 'function', // 检查下文环境是否为Node hasExports = typeof module !== 'undefined' && module.exports; if (hasDefine) { // AMD环境或CMD环境 define(definition); } else if (hasExports) { // 定义为通Node模块 module.exports = definition(); } else { // 将模块的执行结果挂在window变量中,在浏览器中this指向window this[name] = definition(); } })('hello', function () { var hello = function () {}; return hello; });