node.js
1 模块(module)和包(package)是Node.js最重要的支柱,它通过require函数调用其他的模块,他的模块式基于文件的,机制简单。 2 module是Node.js程序的基本组成部分,file和module一一对应。 3 create module and get module: 4 one file is a module ,Node.js 给我们提供了exports 和 require 这两个对象, 5 exports是模块的公开的接口,require是用于从外部获取一个模块的接口。 6 7 for example: 8 /* 9 *author:e路相扶 10 *filename module.js 11 */ 12 var name; 13 exports.setName=function(thyName){ 14 name=thyName; 15 } 16 exports.sayHello=function(){ 17 console.log('Hello '+name);//连接符和js 18 } 19 /* 20 *author:e路相扶 21 *filename getmodule.js 22 */ 23 var myModule=require('./module'); 24 myModule.setName('e路相扶'); 25 myModule.sayHello(); 26 27 like module.js,exports object take setName ,sayHello as module's access interface. 28 getmodule.js use require object load module,and then direct access exports object . 29 30 31 /* 32 *author:e路相扶 33 *filename loadmodule.js 34 */ 35 var hello1=require('./module'); 36 hello1.setName('e路相扶'); 37 38 var hello2=require('./module'); 39 hello2.setName('e路相扶2'); 40 41 hello1.sayHello();//e路相扶2 42 hello2.sayHello();//e路相扶2 43 44 45 require 不会重复加载模块。hello1,hello2指向的是同一个实例,因此hello1被hello2覆盖 46 47 /* 48 *author:e路相扶 49 *filename hello.js 50 */ 51 function Hello(){ 52 var name; 53 this.setName=function(thyName){ 54 name=thyName; 55 } 56 this.setHello=function(){ 57 console.log('Hello '+name); 58 } 59 } 60 module.exports=Hello; 61 /* 62 *author:e路相扶 63 *filename gethello.js 64 */ 65 var hello=new Hello(); 66 hello.setName('e路相扶'); 67 hell0.sayHello(); 68 69 这两个模块的唯一变化就是使用了module.exports=Hello代替了exports.Hello=Hello,在外部 70 引用该模块的时候,其接口对象就是输出Hello对象的本身,而不是原先的exports。 71 72 exports 本身仅仅是一个普通的空对象{},本质是通过它为模块闭包内部建立一个有限的访问接口。 73 74 warning: 75 不可以通过对expotrs直接赋值代替对module.exports赋值。 76 exports实际上只是和module.exports指向同一个对象的变量。 77 他本身会在模块执行结束后释放,但是module不会,因此只能通过制定的module.exports来改变反问接口。 78 79 80 create package: 81 node.js package 将某个独立的功能封装起来,用于发布,更新,依赖管理和版本控制。 82 node.js的包是一个目录,包含一个Json格式的包说明文件,package.json 83 特征: 84 package.json 必须在包的顶层目录下 85 二进制文件在bin目录下 86 javascript代码在lib目录下 87 文档应该在doc目录下 88 单元测试在test目录下 89 90 作为文件夹的模块: 91 92 /* 93 *author:e路相扶 94 *folder Name somepackage 95 *filename ./index.js 96 */ 97 exports.hello=function(){ 98 console.log('Hello.'); 99 } 100 101 /* 102 *author:e路相扶 103 *filename getPackage.js 104 */ 105 var somePackage=require('./somepackage'); 106 somePackage.hello();//Hello. 107 108 /* 109 *author:e路相扶 110 *folder Name somepackage 111 *filename ./package.json 112 */ 113 { 114 "main":"./lib/interface.js"//将index.js 重命名interface.js,放在lib下,依旧可以使用 115 } 116 117 118 Node.js在调用某个包的时候,会先检查package.json的main字段,将其作为接口模块, 119 假如package.json或者main字段不存在,会尝试寻找index.js或者index.node为接口。 120 121 package.json是CommonJs规定用来描述包的文件,应包含一下字段: 122 name:package name ,唯一,由小写英文字母,数字和下划线组成,不能包含空格 123 description:包的简要说明 124 version:符合语义化版本识别规范的版本字符串 125 keywords:关键字组,通常用于搜索 126 maintainers:维护者数组,每个元素包含name,【email|web】 127 bugs:提交bug的地址,可以是网址或者是电子邮件的地址 128 licenses:许可证数组,每个元素包含type(许可证名称)和url(连接到许可证的文本地址) 129 repositories:仓库托管地址数组,每个元素包含type(仓库类型git),url(仓库地址),[path] 130 dependencies:包的依赖,一个关联数组由包名称和版本号组成。 131 132 for example: 133 { 134 "author": "e路相扶 <zhangjun516@126.com> (http://www.wownepiece.com)", 135 "name": "hello", 136 "description": "A example for write a module", 137 "version": "0.0.1", 138 "repository": { 139 "url": "" 140 }, 141 "main": "hello.js", 142 "engines": { 143 "node": "*" 144 }, 145 "dependencies": {}, 146 "devDependencies": {} 147 } 148 149 npm是Node.js官方提供的包管理工具, 150 151 nmp安装有两种模式:本地模式和全局模式 152 nmp [install/i] [package_name] //默认安装到当前目录的node_modules子目录下 本地模式 153 nmp [install/i] -g [package_name] //全局模式 154 155 require 加载模块时,会尝试搜寻node_modules子目录,因此nmp本地模式安装包可以直接被引用。