- Published on
Vue3 + Vite:開發第一個屬於你的 vue 套件
- Authors
- Name
- Penghua Chen(PH)
閱讀指南
為了讓讀者更有效地閱讀此篇文章並理解每個段落的目的,文章段落採用以下架構:
- 標題
- 本段落目的
- 實作研究 or 理論理解
冀望以此方式,使每個段落都是一個完整的概念,讓讀者能夠透過逐步堆疊的方式,更容易地理解並吸收文章的內容。
開發一個 Progress Bar 元件
首先,我們先來開發一個 Progress Bar 元件。
程式碼可參考測試專案。
為品質做把關:撰寫元件單元測試
使用 Vitest 搭配 Vue test utils 進行元件的單元測試。
撰寫單元測試的工具有很多,這邊我們使用 Vitest 搭配 Vue test utils 進行元件的單元測試,並介紹本次主要用到的一些語法:
Vue test utils
mount
:掛載要測試的元件,這邊掛載 App 元件,透過模擬使用者點擊按鈕的方式來測試 Progress Bar 元件。
Vitest
useFakeTimers
: 使用假的計時器,用來加速測試速度useRealTimers
:使用真實的計時器,可以在模擬完計時相關的測試後,使用此方法來恢復真實的計時器advanceTimersByTimeAsync
: 當如果計時器中有非同步的操作,可以透過此方法來模擬時間快進
程式碼可參考測試專案
備註
這邊使用 advanceTimersByTimeAsync
來模擬時間前進而非 advanceTimersByTime
,目前推測是因為在 Progress Bar 的實作中,是透過在 setInterval
中使用 emit
來觸發事件,且由於 vue 在渲染機制上並不是同步更新,這會導致使用 advanceTimersByTime
來模擬時間前進時,無法正確更新 progressValue
的值。
通過 Vite 配置 lib 模式,完成元件的打包設置
了解本次 lib 模式的設定,並透過 vite.config.js 進行設定。
在 Vite 中,可以透過在 vite.config.ts 中在 build
中設定定義 lib
模式,來打包元件。
程式碼可參考測試專案
其中有幾個比較重要的設定:
build.lib
entry
:指定打包的入口檔案name
:指定打包後的全域變數名稱formats
:指定打包的格式,例如:es
、cjs
、umd
等fileName
:指定打包後的檔案名稱
build.rollupOptions
external
:指定那些你想不想要打包進去套件的外部套件output
:在 UMD 的模式下,替這些指定使用外部的套件定義一個全域變數
於 package.json 中設定入口
在 package.json 中設定入口檔案,讓使用者可以透過 import
或 require
的方式引入套件。
{
"main": "./dist/my-lib.cjs.js",
"module": "./dist/my-lib.es.js",
"exports": {
".": {
"import": "./dist/my-lib.es.js",
"require": "./dist/my-lib.cjs.js"
},
"./umd": "./dist/my-lib.umd.js",
"./iife": "./dist/my-lib.iife.js"
},
"files": [
"dist"
]
}
上述設定解釋如下:
main
:指定 CommonJS 的入口檔案module
:指定 ES Module 的入口檔案exports
:指定入口檔案,讓使用者可以透過import
或require
的方式引入套件.
:指定入口檔案./umd
:指定 UMD 的入口檔案./iife
:指定 IIFE 的入口檔案
files
:指定要發布的檔案
這樣的設定可以讓我們的套件可以在不同的環境中使用。
例如我們想要使用 umd 的方式引入套件,可以透過以下方式引入:
import MyLib from 'my-lib/umd';
撰寫 README.md 、RELEASE.md
透過 README.md 、RELEASE.md 來說明套件的使用方式、版本更新等資訊。
此部份可參考 測試專案 的 README.md 、RELEASE.md。
發布至 NPM server,於專案中安裝並使用
這部分可參考 開發屬於你的第一個 npm 套件 一文中後半的篇幅,本文不多加贅述。