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本地模式安装包可以直接被引用。