查了好多资料,发现还是不全,干脆自己理整吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!
- Node.js[5] connect & express简介
- Node.js[4] 第一个模块
- Node.js[3] 瞰俯API (理整中)
- Node.js[2] Hello Node
- Node.js[1] 瞰俯NPM
- Node.js[0] 简介
面前几篇算是node各种基本,这篇向着创立第一个node模块的标目迈进。之前的文章复反说起模块在node中的主要性。正因为有了模块,node才有了扩展性,才会有如此多的node社区员成介入进来,node才能如此迅速地开展。
NPM(Node Packaged Module,以后简称module或模块)是node的内置功能,通过module的式形为node带来更多的API。其实node原生API也是通过模块的式形供给给发开者应用的。
模块?
node实现了commonjs module范规。下面的例子来自Module范规,修改了require输入参数以便能在node中运行,请参照注释别分存保至3个件文中,或者载下整完示例代码:
// 这段代码存保为件文math.js
exports.add =
function
() {
var
sum = 0, i = 0, args =
arguments
, l = args.
length
;
while
(i < l) {
sum += args[i++];
}
return
sum;
};
// 这段代码存保为件文increment.js
var
add = require('./math').add;
exports.increment =
function
(val) {
return
add(val, 1);
};
// 这段代码存保为件文program.js
var
inc = require('./increment').increment;
var
a = 1;
inc(a);
// 2
console.log('a=', inc(a));
模块分类
node中模块可分为核心模块(Core Module)和第三方模块,核心模块是node内置模块,平日存在于node安装路径lib目录下;第三方模块也就是本文论讨并望期创立的模块。
Require & Module path
下面的代码中现出的require是node中载加模块的全局数函,node是如何寻找到对应模块的呢?明简规矩如下:
- 路径为Y的module中应用 require(X)
- 如果是X为核心模块,中命则束结
- 如果X以‘./’、‘/’、‘../’扫尾时,载加第三方模块,中命则束结
- 查找失败抛出异常
这里能看到整完描述:
require(X) from module at path Y
1. If X is a core module,
a.
return
the core module
b. STOP
2. If X begins
with
'./' or '/' or '../'
a. LOAD_AS_FILE(Y + X)
b. LOAD_AS_DIRECTORY(Y + X)
3. LOAD_NODE_MODULES(X, dirname(Y))
4. THROW "
not found
"
LOAD_AS_FILE(X)
1. If X is a file, load X as JavaScript text. STOP
2. If X.js is a file, load X.js as JavaScript text. STOP
3. If X.node is a file, load X.node as binary addon. STOP
LOAD_AS_DIRECTORY(X)
1. If X/
package
.json is a file,
a. Parse X/
package
.json, and look
for
"
main
" field.
b. let M = X + (json main field)
c. LOAD_AS_FILE(M)
2. If X/index.js is a file, load X/index.js as JavaScript text. STOP
3. If X/index.node is a file, load X/index.node as binary addon. STOP
LOAD_NODE_MODULES(X, START)
1. let DIRS=NODE_MODULES_PATHS(START)
2.
for
each DIR
in
DIRS:
a. LOAD_AS_FILE(DIR/X)
b. LOAD_AS_DIRECTORY(DIR/X)
NODE_MODULES_PATHS(START)
1. let PARTS = path split(START)
2. let ROOT = index of first instance of "
node_modules
"
in
PARTS, or 0
3. let I = count of PARTS - 1
4. let DIRS = []
5.
while
I > ROOT,
a.
if
PARTS[I] = "
node_modules
" CONTINUE
c. DIR = path join(PARTS[0 .. I] + "
node_modules
")
b. DIRS = DIRS + DIR
c. let I = I - 1
6.
return
DIRS
模块结构
connect-header是笔者应用express期间写的一个小模块,充足简略且包含了第三方模块的诸多素元,比拟合适作为入门示例。
这里用connect-header作为示例,欢送fork,样同可用下面令命安装:
$ npm install connect-header
件文结构
以下假设之前行执npm install的路径为X,我们看到connect-header被安装在X/node_modules/connect-header;X/node_modules是node安装第三方模块的认默置位;node已不推荐将模块安装至全局路径下,更推荐当地安装,是能可出于移植的虑考。
- lib 模块代码
- header.js 代码写在这里!
- index.js node认默载加模块
- test Unit Test
- header.js
- .npmignore 模块宣布时当地件文忽略列表
- LICENSE 权版声明
- package.json 模块属性声明
- README.md 模块绍介
- test.js UT启动脚本
package.json
模块中最为主要的件文,申了明各种模块别级的属性,或称为元数据。这些元数据部份由npm程序读取,部份是npmjs.org上模块页面的数据源。整完文档请考参npm json,网上找到的一个交互文档也可考参。初次接触package.json可以应用”npm init”,这是个交互式package.json成生工具。
$ npm init
针对connect-header的package.json,我们分析个每字段的义意(见注释):
{
"
name
":"
connect-header
",
//模块称名
"
version
":"
0.0.5
",
//模块本版号
"
description
":"
General header middleware for Connect.
",
"
author
":{
//模块作者息信
"
name
":"
Luics
",
"
":"
luics.king@gmail.com
",
"
url
":"
http://github.com/luics
"
},
"
repository
":{
//模块代码库
"
type
":"
git
",
"
url
":"
https://github.com/luics/connect-header.git
"
},
"
bugs
":{
//Bug提交页面
"
url
":"
http://github.com/luics/connect-header/issues
"
},
"
main
":"
./lib
",
//模块进口
"
dependencies
":{
},
"
devDependencies
":{
//发开赖依模块
"
qunit
":"
*
"
//用于unit test
},
"
scripts
":{
//unit test脚本
"
test
":"
node test
"
},
"
engines
":{
//赖依的node本版
"
node
":"
>= 0.4.0
"
},
"
licenses
":[
//权版息信
{
"
type
":"
MIT
",
"
url
":"
http://www.opensource.org/licenses/MIT
"
}
],
"
keywords
":["
connect
", "
express
", "
header
", "
general
"]
}
README
主要括包模块背景绍介,应用说明,sample代码,资源接连;是其他人懂得模块的主要门路,一般高品质的模块都市有一个结构清晰、绍介尽详的README;npmjs和github上的都持支markdown式格的README,一般件文后缀为mk、markdown。
Unit Test
UT是其他发开者懂得模块的一个窗口,比起README,UT更加亲近模块的实现细节;平日高品质的模块也会有高品质的UT代码;UT的品质可以通过覆盖率等量衡..
模块宣布
下面的令命用于宣布模块:
$ npm publish
初次应用“npm publish”会失败,提示要需先应用“npm adduser”添加一个npmjs.org的号账。以后每次应用“npm publish”要需手动更新package.json的version字段。
更多资源
markdown-util是笔者写的另一个模块,样同比拟简略,用于将markdown源件文成生html件文,并供给了2套皮肤(github、default),持支自定义皮肤模板。更多优良资源然自都在NPM Registry中,后日也会挑出不同类型的典范模块详细分析。
$ npm install markdown-util
组里急招FE实习生,应聘条件请考参此处,作工点地是度百上海研发中央,有趣兴的学同请将简历发给我。
文章结束给大家分享下程序员的一些笑话语录: 真正的程序员喜欢兼卖爆米花,他们利用CPU散发出的热量做爆米花,可以根据米花爆裂的速度听出正在运行什么程序。