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

 

posted @ 2013-07-04 11:18  尹少爷  阅读(1036)  评论(0编辑  收藏  举报