從0開始發(fā)布一個無依賴胸私、高質(zhì)量的 npm 包

作者: 吳勝斌

www.simbawu.com/article/search/12


寫在前面


沒有發(fā)布過npm包的同學(xué),可能會對NPM對開發(fā)有一種蜜汁敬畏,覺得這是一個很高大上的東西线召。甚至有次面試,面試官問我有沒有發(fā)過npm包多矮,當(dāng)時只用過還沒寫過缓淹,我想應(yīng)該挺難的哈打,就小聲說了沒有,然后就讓我回去了o(╯□╰)o讯壶。


其實料仗,在現(xiàn)在的我看來,npm包就是一個我們平時經(jīng)常寫的一個export出來的模塊而已伏蚊,只不過跟其它業(yè)務(wù)代碼耦合性低立轧,具有較高的獨立性。


當(dāng)然搜贤,要發(fā)布一個npm包笨腥,除了寫的模塊組件外恬口,還需要做一些基礎(chǔ)的包裝工作。下面我就以最近開發(fā)的「DigitalKeyboard 數(shù)字鍵盤 NPM」?為例胜卤,一一列出具體步驟:


1、寫基礎(chǔ)模塊代碼赁项;

2葛躏、注冊npm賬號;

3肤舞、配置package.json紫新;

4、配置webpack李剖;

5芒率、添加單元測試;

6篙顺、完善README.md偶芍;

7、發(fā)布


1德玫、2匪蟀、3足可以完成一個npm,4宰僧、5材彪、6是為了開發(fā)一個高質(zhì)量的npm。


開始


具體代碼移步github(https://github.com/simbawus/DigitalKeyboard)琴儿,請反手?給個 ★ Star ^_~段化。完整目錄結(jié)構(gòu)如下:

├── LICENSE

├── README.md

├── build

│ ? └── Keyboard.js

├── config

│ ? └── webpack

│ ? ? ? ├── webpack.base.config.js

│ ? ? ? ├── webpack.config.js

│ ? ? ? ├── webpack.dev.config.js

│ ? ? ? └── webpack.prod.config.js

├── index.html

├── package.json

├── src

│ ? ├── Keyboard.js

│ ? ├── Keyboard.scss

│ ? └── main.js

├── test

│ ? └── Keyboard.test.js

└── yarn.lock

基礎(chǔ)模塊代碼


現(xiàn)在只需要看src目錄下的三個文件。其中造成,main.js 主要是對將要開發(fā)模塊的引用显熏,只需存在于開發(fā)階段,同時作為此階段webpack的入口文件晒屎,核心代碼在Keyboard.js喘蟆。


這里缓升,主要用的是ES6的class和export default,Keyboard的核心思想就是點擊哪個鍵就對外輸出什么內(nèi)容蕴轨,實現(xiàn)也比較簡單港谊,大家都能看得懂,這里就不展開講了尺棋,具體可以看github 源碼封锉。


注冊npm賬號


這一步也不用說,大家直接去官網(wǎng)注冊就好了膘螟。


配置package.json

{

"name": "digital-keyboard",

"version": "1.0.0",

"main": "build/Keyboard.js",

"repository": "https://github.com/simbawus/DigitalKeyboard.git",

"author": "simbawu ",

"description": "DigitalKeyboard Component",

"keywords": [

"DigitalKeyboard",

"Digital",

"Keyboard",

]

}


此時的配置文件也比較簡單成福,只需配置npm包名,準備用的名字現(xiàn)在npm搜索一下荆残,已經(jīng)存在的就不能用了奴艾;版本號version,每次發(fā)布版本號都需要更新内斯,不然發(fā)布不成功蕴潦;對外export的文件路徑,這里我用的是webpack打包后的文件俘闯,如果不用webpack潭苞,直接引用src/Keyboard.js也可以,只不過要做模塊化方式兼容真朗,這個后面說此疹。也可以放上項目所在github地址及作者名,description和keywords比較利于SEO遮婶,不過這些都不是必需項蝗碎。


到這里,一個npm包就開發(fā)完成了旗扑,直接發(fā)布即可使用蹦骑。但是,略顯粗糙:代碼壓縮臀防、單元測試眠菇、readme都沒寫,別人不知道怎么用也不敢用袱衷。下面一步步完善琼锋。

配置webpack


這里用的是最新版的webpack4,官方提供production和development兩種開發(fā)模式祟昭,并分別做了默認壓縮處理,非常適合這里怖侦。有兩點要特別說明下:


libraryTarget: 'umd'

umd有的同學(xué)可能不是太熟悉篡悟,但是cmd谜叹、amd大家應(yīng)該都知道,分別應(yīng)用于服務(wù)端和瀏覽器端的模塊方案搬葬。umd就是前面提到的模塊化方式兼容荷腊。感興趣可以參考我的另一篇文章JavaScript Module 設(shè)計解析及總結(jié)。

production和development的entry不一樣:

development的entry是main.js急凰,而production的entry是Keyboard.js女仰。前面說過,開發(fā)階段需要有對模塊的引用抡锈,但是正式發(fā)布就不需要了疾忍,所以要分別配置。


其他就不展開講了床三,我的webpack配置結(jié)構(gòu)很清晰一罩,歡迎大家直接copy。

├── webpack.base.config.js

├── webpack.config.js

├── webpack.dev.config.js

└── webpack.prod.config.js

添加單元測試


1撇簿、mocha:測試框架聂渊;

2、chai:斷言庫四瘫,斷言通俗來講就是判斷代碼結(jié)果對不對汉嗽;

3、jsdom:node端是沒有js dom對象的找蜜,比如window饼暑、document等等,所以需要這個庫提供锹杈;

4撵孤、istanbul:代碼覆蓋率計算工具;

5竭望、coveralls:統(tǒng)計上面的代碼測試覆蓋率工具邪码;

6、travis-ci:自動集成咬清,比如master代碼push到github上之后闭专,travis-ci就會自動進行自動化測試。


這里介紹下jsdom的用法旧烧,當(dāng)時按照幾個文檔來都跑不通:

const {JSDOM} = require('jsdom');

const {window} = new JSDOM(`

數(shù)字鍵盤

`);

propagateToGlobal(window);

function propagateToGlobal(window) {

for (let key in window) {

if (!window.hasOwnProperty(key)) continue;

if (key in global) continue;

global[key] = window[key];

}

}


首先引入jsdom影钉,然后構(gòu)造一個document,并引入其中的window對象然后一一賦值給node的global對象掘剪。其實也很簡單平委,只不過第一次接觸,而且找的文檔寫的也不清楚夺谁,所以花了點時間廉赔。其他幾個文檔都還不錯肉微,可以看看文檔再看看我是怎么用的。此時的package.json就很很豐富了蜡塌,可以執(zhí)行yarn test和yarn cover看看測試是否通過及測試覆蓋率碉纳。


完善README.md


一個好的readme是決定用戶用不用你項目的關(guān)鍵因素,所以要多花點心思馏艾,千萬不能忽略劳曹。

1、標題:直觀的描述這個項目是干什么的琅摩。

2铁孵、徽章:

4、分別表示是否構(gòu)建成功迫吐、代碼測試覆蓋率库菲、npm版本號、下載量志膀、開源證書熙宇,看起來逼格滿滿有木有。推薦去shields io?添加溉浙,生成一次烫止,之后會自動更新,不過需要等npm發(fā)布后才能搜到戳稽。

5馆蠕、配圖:要讓用戶直觀的看到這個組件長什么樣,是否滿足他的需求惊奇。

6互躬、API介紹:不能讓用戶猜。

7颂郎、使用示例:盡量降低使用門檻吼渡。

發(fā)布

#先登錄NPM賬號:

npm login

#會依次讓你輸入用戶名、密碼乓序、和郵箱

Username: simbawu

Password:

Email: (this IS public) wsbin610@163.com

#登錄成功會出現(xiàn)以下提示信息:

Logged in as simbawu on https://registry.npmjs.org/.

#執(zhí)行發(fā)布命令:

npm publish

#發(fā)布成功后會出現(xiàn)以下提示信息:

+ digital-keyboard@1.0.0

#這里digital-keyboard是我的NPM包名寺酪,1.0.0是包的版本號


接下來,我們可以在npm官網(wǎng)替劈,通過搜索包名或者在個人中心看到剛剛發(fā)布的包寄雀。

感興趣的小伙伴,可以關(guān)注公眾號【grain先森】陨献,回復(fù)關(guān)鍵詞 “vue”盒犹,獲取更多資料,更多關(guān)鍵詞玩法期待你的探索~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市阿趁,隨后出現(xiàn)的幾起案子膜蛔,更是在濱河造成了極大的恐慌,老刑警劉巖脖阵,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異墅茉,居然都是意外死亡命黔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門就斤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悍募,“玉大人,你說我怎么就攤上這事洋机∽寡纾” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵绷旗,是天一觀的道長喜鼓。 經(jīng)常有香客問我,道長衔肢,這世上最難降的妖魔是什么庄岖? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮角骤,結(jié)果婚禮上隅忿,老公的妹妹穿的比我還像新娘。我一直安慰自己邦尊,他們只是感情好背桐,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝉揍,像睡著了一般链峭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疑苫,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天熏版,我揣著相機與錄音,去河邊找鬼捍掺。 笑死撼短,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挺勿。 我是一名探鬼主播曲横,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了禾嫉?” 一聲冷哼從身側(cè)響起灾杰,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熙参,沒想到半個月后艳吠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡孽椰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年昭娩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黍匾。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡栏渺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锐涯,到底是詐尸還是另有隱情磕诊,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布纹腌,位于F島的核電站霎终,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏壶笼。R本人自食惡果不足惜神僵,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望覆劈。 院中可真熱鬧保礼,春花似錦、人聲如沸责语。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坤候。三九已至胁赢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間白筹,已是汗流浹背智末。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留徒河,地道東北人系馆。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像顽照,于是被迫代替她去往敵國和親由蘑。 傳聞我的和親對象是個殘疾皇子闽寡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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