構(gòu)建發(fā)布自己的npm package

文本將會(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è)試币狠。
這里使用 mochachai 兩個(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凳兵,一起剝皮案震驚了整個(gè)濱河市卓鹿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌留荔,老刑警劉巖吟孙,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異聚蝶,居然都是意外死亡杰妓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門碘勉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巷挥,“玉大人,你說我怎么就攤上這事验靡”侗觯” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵胜嗓,是天一觀的道長(zhǎng)高职。 經(jīng)常有香客問我,道長(zhǎng)辞州,這世上最難降的妖魔是什么怔锌? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上埃元,老公的妹妹穿的比我還像新娘涝涤。我一直安慰自己,他們只是感情好岛杀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布阔拳。 她就那樣靜靜地躺著,像睡著了一般类嗤。 火紅的嫁衣襯著肌膚如雪糊肠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天土浸,我揣著相機(jī)與錄音罪针,去河邊找鬼彭羹。 笑死黄伊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的派殷。 我是一名探鬼主播还最,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼毡惜!你這毒婦竟也來了拓轻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤经伙,失蹤者是張志新(化名)和其女友劉穎扶叉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帕膜,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枣氧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垮刹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片达吞。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荒典,靈堂內(nèi)的尸體忽然破棺而出酪劫,到底是詐尸還是另有隱情,我是刑警寧澤寺董,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布覆糟,位于F島的核電站,受9級(jí)特大地震影響遮咖,放射性物質(zhì)發(fā)生泄漏搪桂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望踢械。 院中可真熱鬧酗电,春花似錦、人聲如沸内列。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)话瞧。三九已至嫩与,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間交排,已是汗流浹背划滋。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留埃篓,地道東北人处坪。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像架专,于是被迫代替她去往敵國(guó)和親同窘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,742評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理部脚,服務(wù)發(fā)現(xiàn)想邦,斷路器,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • 什么是 NPM npm之于Node委刘,就像pip之于Python,gem之于Ruby,composer之于PHP丧没。 ...
    ihoey閱讀 6,249評(píng)論 2 36
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評(píng)論 6 342
  • 這一周,挑戰(zhàn)升級(jí)锡移。 按照我自己制定的計(jì)劃呕童,從今天開始要每天看兩章了。一開始是建議按頁(yè)數(shù)來算的罩抗,可是停在章節(jié)中間拉庵,不...
    水輕揚(yáng)閱讀 296評(píng)論 0 0