如何發佈一個完整Node.js Module

来源:https://www.cnblogs.com/KingJaja/archive/2018/12/09/9697427.html
-Advertisement-
Play Games

本文會透過以下幾個段落,讓各位一步一步學習如何寫一個自已的Node.js Module並且發佈到npm package上 Node.js Module 結構 我們先建立一個 NodeModuleDemo 的資料夾 ,接下來利用 npm init 進行初始化 (這裡不用特別設置,一路按 Enter 到 ...


 

本文會透過以下幾個段落,讓各位一步一步學習如何寫一個自已的Node.js Module並且發佈到npm package上

Node.js Module 結構

我們先建立一個 NodeModuleDemo 的資料夾 ,接下來利用 npm init 進行初始化

(這裡不用特別設置,一路按 Enter 到底即可)

Tips. 這裡可以簡單的利用VSCode 熱鍵 Ctrl + ` 開啟命令視窗image

初始化完成的畫面如上

接下來我們會先建立好相關的資料夾用來分類我們的程式碼

其中 lib 資料夾是我們要寫的原始程式碼,test 資料夾則專門放我們的測試程式

最後 benchmark 資料夾裡面是用來做我們效能測試的程式

因我們這次會利用 ES6 的 Class 語法來寫我們的模組程式,所以這裡也需要加入 babel 的設定

再來為了讓我們的程式碼可以有統一的風格,我們也會加入 eslint 的設定

( babel 與 eslint 我通常會裝成全域的package ,各位可以自已選擇要安裝的目標)

先來安裝 babel 與 eslint 吧!

image

安裝完後,可以像上圖中,透過 –version 來確認安裝的狀況

這裡可以看到我們的 babel 版本為 6.26.0 而 eslint 則為 5.7.0

再來我們下一步先建立 babel 的設定檔,檔名為 .babelrc 放置在我們的根目錄下

內容直接設為

{

"presets": ["env"]

}

eslint 的部分則更簡單了,只需要在命令視窗輸入 eslint –init 選擇想要的範本即可,在我們的練習中,我們選擇

standard 。最後會自動在根目錄產出 .eslintrc.js 檔 ,相關的操作如下圖 (黃字標示處)

image

最後,因為我們希望 eslint 只檢查我們 lib 主程式目錄,所以這裡需要加入一個 .eslintignore 檔

將我們的 test 、benchmark 及輸出的 dist 資料夾做排除的動作,話不多說請看下圖

image

整個 Node.js Module 的目錄架構會像下圖這樣 ( formatter 、output 、index.js 可以先建立起來)

image

再來我們就開始動手寫我們的模組程式吧!

我們這次要做一個很簡單的文字轉換程式,輸出效果大致如下

image

首先我們先來寫做轉換的主程式,大致如下

export default class MyTextOutput {

constructor (formatter = null) {

  this.formatter = formatter

}

getResult (text) {

  if (!this.formatter) {

    throw new Error('Text Formatter is required')

  }

   let result = this.formatter.getFormatterText(text)

    return result

}

}

首先 MyTextOutput 類需要在建立時指定要用的 formatter , 最後再透過 getResult 取得轉換後的內容

而這裡我們就簡單的寫一個 SimpleFormatter 做到一個簡易的轉換效果

export default class SimpleFormatter {

getFormatterText (text) {

let trans = {

'a': 'Ä',

'b': 'ß',

'c': 'Ć'

}

let outPutTxt = ''

for (let index = 0; index < text.length; index++) {

      const ele = text[index]

    outPutTxt += trans[ele.toLowerCase()]

}

    return outPutTxt

}

}

 

加入測試

在我們完成程式之後,通常會寫一段測試程式來保護你的程式。 當然,如果是採用 TDD 開發方式的話,則是先寫完你的測試程式,再寫你的主程式。但我們這裡先不介紹 TDD , 單純的來介紹一下你的測試程式該怎麼寫

在寫我們的測試程式之前,我們需要先安裝相關的套件,在這個範例中我們會用到 mocha 與 chai 這兩個套件

安裝方式如下圖

image

再來就是我們的測試程式了,我們這次會簡單的寫兩個案例

一個是忘記指定要使用的formatter 另一個則是我們輸入文字 abc 應該要出現我們預期的結果

完整的案例如下

image

要運行上述的測試案例 我們需要在 package.json 裡添加相關的 script ,參考下圖

image

接下來運行 npm run test 時便可自動的進行測試案例執行

image

3.加入typing.d.ts

這裡加入 typing 檔其實是為了讓使用者用 VSCode 在開發時,能夠擁有 Intellisense 的效果

在這裡我們透過微軟提供的 dts-gen 來產生 typeing 檔案。首先我們需要先安裝 dts-gen 這個套件

接下來比較麻煩的是,依照文件上說明,我們需要先透過 npm 安裝我們的套件,才可以產生 typing 檔

npm install -g dts-gen
npm install –g nodedemomodule
dts-gen --dt --name nodedemomodule --template module

不過在我實作的過程中發現到, dts-gen  在產生的時候會少掉主程式的定義,變成我們主程式這個部分需要手動加入。最後產生出來的 typing 檔如下。其中 MyTextOutput 這裡面的定義是我手動加入的

image

再來就是在 package.json 設定發佈時要將 typing 檔上傳

這猚可以看到我們的 typing 檔檔名是叫 index.d.ts ,並且是放在根目錄底下

原因是 VSCode 這裡在搜尋 typing 檔時,預設會從根目錄開始搜尋,並且優先比對 index.d.ts

image

最後的效果圖如下,可以看到 getFormatterText 是一個方法,並且相關參數的說明跟我們  typing 檔一樣

image

從下圖可以見到在還沒加入 typing 檔時,是不會有上面這樣的效果的

image

4.加入Code Coverage

接下來我們要做的是 Code Coverage 的設定 , Code Coverage 其實是用來呈現你目前 測試案例完整的程度

幫助你瞭解是否測試已經足夠,還有那些方法測試不足

在這個部分我們為了能容易結合 TravisCI ,採用 nyc 與 coveralls 這兩個套件

npm install nyc –D

npm install coveralls –D

接下來我們設定一 package.json 裡面執行的命令

image

最後簡單執行

npm run coveralls

就會在目錄底下看到 .nyc_ouput 資料夾產生

再來呢! 我們需要到 https://coveralls.io/sign-in 這個網站進行註冊與設定的動作

因為我這裡直接選擇 github 登入。所以可以看到我在 ADD REPO 這裡,可以很容易選擇我想要呈現 code coverage 數據的 REPO

image

image

我們在這裡找到練習用的這個 REPO (如果在裡面沒有看到預計要使用的 REPO 的話,右上角有一個 SYNC REPOS 按下去後會進行同步的動作)

接下來只要按一下 REPO 前面的那個 OFF 圖示,讓他變成 ON 就行了

image

再來我們需要移到 TravicsCI 做相關的設定,這樣 coveralls 才能收到相關的數據

5.結合TravisCI 自動編譯與呈現Code Testing coverage

同樣的,我們需要先在 TravisCI 上註冊一組我們的帳號,這裡為了求方便我一樣使用 GitHub 登入

一進來的畫面如下,因為我先前已經有使用 TravisCI 來建置我的 REPO ,所以會看到有一個專案叫 HtmlSEO

image

但我們這次要建立我們練習用的專案來讓 TravisCI 做自動建置,所以我們選一下圖中紅框處的 + 號

接下來直接搜尋我們要使用的 REPO ,這裡就是我練習用的 nodedemomodule 了。

並把 REPO 旁邊的 X 按下去,成功後就會呈現打勾的狀態

(如果沒有出現想使用的 REPO 在左方有一個 Sync account 按下去後就會同步重整了)

image

最後回到我們的專案底下設定 TravisCI 專用的設定檔  .travis.yml ,這個檔案一般也都會放在根目錄底下

設定完成的圖如下

image

可以看到,我們首先要告知 TravisCI 我們的建置環境是 node_js 與 nodejs 的版本為 8

再來則是需要安裝那些要全域執行的套件,最後就是常用的 npm install 還原我們專案所使用到的套件

安裝完成後則進行建置的動作,最後再額外產生我們的 code coverage 檔案

當這個檔案設定完成後,就可以進行 git commit 與 push 的動作!
接下來就可以看到 TravisCI 幫忙你做建置的畫面囉!

下圖就是 TravisCI 發現 REPO 有更新時自動觸發建置的畫面

image

最後當 npm run coveralls 執行完成時 ,回到 coervalls.io 就可以看到我們的 code coverage 比率了 (如下圖)

image

coveralls.io 上的 code coverage 結果

image

最後你可以利用以下這幾個連結,放在你的 README 裡讓其它人知道你這個套件的狀態

<a href=https://badge.fury.io/js/{換成你的套件名稱}>

<img src="https://badge.fury.io/js/{換成你的套件名稱}.svg" alt="npm version" height="18">

</a>

<a href="https://travis-ci.org/{換成你的travisCI帳號}/{換成你的套件名稱}">

<img src="https://travis-ci.org/{換成你的travisCI帳號}/{換成你的套件名稱}.svg?branch=master" alt="Travis CI" />

</a>

<a href='https://coveralls.io/github/{換成你的github帳號}/{換成你的套件名稱}?branch=master'>

<img src='https://coveralls.io/repos/github/{換成你的github帳號}/{換成你的套件名稱}/badge.svg?branch=master' alt='Coverage Status' />

</a>

成功的話就會看到下麵這樣的圖示

image

以上就是一個比較完成發佈 node module 的流程了!其它像 React 、 Vue 、Angular 其實都大同小異

如果有任何問題再請留言讓我知道

謝謝大家


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 阿裡雲限時紅包領取,雲產品通用紅包,可疊加官網常規優惠,最高1888 內部鏈接 https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=up4l93vp ...
  • 一、庫操作 二、表操作 1,存儲引擎 存儲引擎就是表的類型,MySQL中根據不同的存儲引擎會有不同的處理機制,存儲引擎的概念是MySQL裡面才有的。 1.1,MySQL的一個整個工作流程 1.2,存儲引擎的分類 在cmd中輸入show engines可以查看所有的引擎,輸入show variable ...
  • 問題:新安裝的資料庫,訪問的時候後臺報錯找不表,發現是數據查詢語句對大小寫敏感. 1.關閉MySQL服務 2.在服務運行目錄找到my.ini或者my.cnf文件 打開文件, 3.找到[mysqld]在下麵增加一行 4.lower_case_table_names=1 (0:大小寫敏感;1:大小寫不敏 ...
  • 1. 資料庫表 1.1 員工表 1.2 部門表 1.3 工作表 1.4 位置表 2. 基礎查詢(select) 2.1 查詢單個欄位 2.2 查詢多個欄位 2.3 查詢所有欄位 2.4 查詢常量值、表達式 2.5 查詢函數 2.6 起別名(如果查詢的欄位有重名,可以使用起別名區分,別名中有特殊符號, ...
  • 從六號開始搞Flutter,到今天寫這篇blog已經過了4天時間,文檔初步瀏覽了一遍,寫下了這個demo。demo源碼分享在github上,現在對flutter有種說不出的喜歡了。大家一起搞吧! 廢話不多說,開始不如正題: 一:單擊,雙擊,長按->傳動的手勢效果,另外這裡用來Fluttertoast ...
  • 流程介紹 1. 使用 網路框架進行 請求,獲得 數據 //一個封裝好的工具類的靜態方法 public static void sendOkHttpRequest(final String address, final okhttp3.Callback callback) { OkHttpClient ...
  • 文章鏈接: "https://mp.weixin.qq.com/s/1gkMtLu0BTXOUOj6isDjUw" 日常android開發過程中,會遇到編輯框輸入內容彈出軟鍵盤,往往會出現鍵盤遮擋內容,或者出現頁面整體上移的,或多或少在體驗上都不是很優雅,今天提供個方法是自行控制頁面上移距離,竟可能 ...
  • 用react也有段時間了, 是時候看看人家源碼了. 看源碼之前看到官方文檔有這麼篇文章介紹其代碼結構了, 為了看源碼能順利些, 遂決定將其翻譯來看看, 小弟英語也是半瓢水, 好多單詞得查詞典, 不當之處請批評. 直接從字面翻譯的, 後面看源碼後可能會在再修改下. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...