文本將會(huì)介紹如何構(gòu)建并發(fā)布自己編寫的npm包嬉愧,這里假定你的npm環(huán)境已經(jīng)搭建完成搀崭,我們就直接切入主題
注冊(cè)賬號(hào)
想要在Npm上發(fā)布自己的軟件包权她,就必須先在npm官網(wǎng)上注冊(cè)一個(gè)賬號(hào)
注冊(cè)地址
注冊(cè)完成后隘膘,我們就可以在命令行中登錄剛剛注冊(cè)的賬號(hào)了:
$ npm login
Username: falm
Password:
Email: (this IS public) xxx@gmail.com
Logged in as falm on https://registry.npmjs.org/.
OK登錄成功铐伴。
初始化
在這里我們開始構(gòu)建Npm包撮奏,本文的例子是一個(gè) 過去時(shí)間的計(jì)算工具 比如:
2..days.ago() #=> 返回兩天前的時(shí)間
好的,那么接下來就開始創(chuàng)建包目錄
$ mkdir number-timeago && cd number-timeago
$ npm init
這里執(zhí)行 npm init 命令之后当宴,會(huì)讓你填寫關(guān)于包的信息畜吊,只要跟著提示填寫就可以
name: (number-timeago) number-timeago # 填寫包名
version: (1.0.0) # 版本號(hào)
description: numeric time ago like rails ( 2..days.ago() ) # 描述
entry point: (index.js) number.timeago.js # 入口文件名
test command:
git repository: https://github.com/falm/number-timeago.git # git倉(cāng)庫(kù)地址
keywords: time,ago,numeric # 關(guān)鍵字
author: falm # 作者
license: (ISC) MIT # 許可證
然后就會(huì)生成,Npm包的描述文件 package.json
# package.json
{
"name": "number-timeago",
"version": "1.0.0",
"description": "numeric time ago like rails ( 2..days.ago() )",
"main": "number.timeago.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/falm/number-timeago.git"
},
"keywords": [
"time",
"ago",
"numeric"
],
"author": "falm",
"license": "MIT",
"bugs": {
"url": "https://github.com/falm/number-timeago/issues"
},
"homepage": "https://github.com/falm/number-timeago#readme"
}
主文件
這里我們將包的主代碼户矢,存放到 number.timeago.js 中玲献,
(function (NumberTimeAgo) {
if (typeof module === 'object' && typeof module.exports === 'object') {
module.exports = NumberTimeAgo; # node CommonJS
} else if (typeof define === 'function' && define.amd) {
define(['number_time_ago'], NumberTimeAgo); # AMD
} else {
NumberTimeAgo(); # 直接引用
}
})(function () {
# .....
});
入口文件,主要是一個(gè)自調(diào)用函數(shù)梯浪,核心的代碼捌年,作為閉包通過參數(shù)傳入。
npm 使用CommonJS規(guī)范挂洛,模塊化代碼礼预,所以這里將核心函數(shù)賦值給 module.exports。
除此之外虏劲,還要考慮逆瑞,有直接在瀏覽器中使用主文件,或是用AMD加載文件的情況伙单,代碼中也予以了支持获高。
測(cè)試
沒有測(cè)試的Npm包,是不健全的吻育,沒法給人安全感念秧,如果在生產(chǎn)項(xiàng)目中使用的話,說不定布疼,那天你就崩潰了摊趾,所以我們構(gòu)建的npm包也要有測(cè)試币狠。
這里使用 mocha 和 chai 兩個(gè)test工具進(jìn)行測(cè)試(選用它們是個(gè)人偏好,你也可以使用其他的測(cè)試框架)
安裝:
$ npm install mocha --save-dev
$ npm install chai --save-dev
安裝時(shí)砾层,使用npm的 --save-dev選項(xiàng)漩绵,將會(huì)把代碼安裝到./node_modules下,并且會(huì)在package.json中注冊(cè)開發(fā)模式依賴肛炮,這樣其他人下載你的代碼后止吐,運(yùn)行 ** npm install ** 就可以運(yùn)行測(cè)試了。
"devDependencies": {
"chai": "^3.5.0",
"mocha": "^2.4.5"
}
接下來創(chuàng)建測(cè)試文件侨糟。
$ mkdir test && touch test/number.timeago.js
測(cè)試代碼:
var expect = require('chai').expect;
require('../number.timeago.js')();
describe('NumberTimeAgo', function(){
describe('#number-time', function(){
it('seconds', function(){
expect(60..seconds).to.eq(1000*60);
})
it('days', function () {
expect(2..days).to.eq(48..hours);
});
});
describe('#time-ago', function(){
it('ago()', function(){
actualDay = 3..days.ago().getDay();
expectDay = new Date(new Date() - 3..days).getDay();
expect(actualDay).to.eq(expectDay);
}) ;
});
});
上面的測(cè)試代碼這里就不解釋了碍扔,接下來我們需要將測(cè)試命令添加到 ** package.json ** 中:
"scripts": {
"test": "node ./node_modules/.bin/mocha test"
},
在 scripts/test 節(jié)點(diǎn)中添加好命令后,我們就可以是用 npm test 運(yùn)行測(cè)試代碼了秕重。
$ npm test
> node ./node_modules/.bin/mocha test
NumberTimeAgo
#number-time
? seconds
? days
#time-ago
? ago()
3 passing (12ms)
Good不同,測(cè)試用例全部通過了。
發(fā)布
這應(yīng)該是本文中最簡(jiǎn)單的一步了溶耘,基于一開始我們已經(jīng)登錄了Npm 賬號(hào)二拐,所以執(zhí)行一條命令:
npm publish
搞定。
結(jié)尾
本文中Npm包的github地址: number-timeago