在開發一個 ui 組件庫時,確定須要一邊預覽 demo,一邊修改代碼。css
常見的解決方案是像開發通常項目同樣使用 webpack-dev-server
預覽組件,好比經過 vue-cli
初始化項目,或者本身配置腳本。html
文藝一點兒地可能會用到 parcel
來簡化 demo 的開發配置(好比 muse-ui)。vue
做爲一個 ui 組件庫,也確定要有本身的組件展現文檔。webpack
通常業界常見方案是本身開發展現文檔...git
但這樣會帶來一個組件庫和文檔如何同步的問題。github
因爲 vuepress 支持在 markdown 中插入組件,因此咱們其實能夠很天然地邊寫文檔邊開發組件。web
從開發步驟上來講,甚至能夠先寫文檔說明,再具體地編寫代碼實現組件功能。這樣一來文檔便是預覽 demo,與組件開發能夠同步更新。vue-cli
p.s. React 的組件文檔能夠試試這倆庫:json
在開發和使用過程當中若是對於一些對象、方法的參數可以智能提示,豈不美哉?sass
如何實現呢?
其實就是在相應文件夾中添加組件相關的類型聲明(*.d.ts
),並經過 src/index.d.ts
導出。
{
"typings": "src/index.d.ts",
}
複製代碼
一開始將聲明文件都放在
types/
文件夾下,但在實踐中以爲仍是放在當前文件夾下比較好。一方面有利於維護,另外一方面是讀取源碼時也有類型提示。
和打包庫同樣,選了 rollup。
在開發中用不用 *.vue
這樣的單文件組件來開發呢?
<template>
只使用 render
函數。.vue
文件,但樣式單獨寫。.jsx
文件,樣式也單獨寫。<style>
的 .vue
文件,但在使用時必須用 vux-loader。<style>
的 .vue
文件,但有一些配置。講道理,徹底不寫 <template>
有點兒麻煩,因此添加了 rollup-plugin-vue 插件用於打包 .vue
文件。
但碰到一個問題:如何打包 <style>
中的樣式?
<style>
,直接在 js 裏 import scss 文件。沒問題,可是寫組件時不直觀,同一組件的代碼也分散在了兩個地方爲了區分不一樣的場景使用不一樣的 js,因此一共打包了三份 js(commonJs
、es module
、umd
),以及一份壓縮後的 css(dist/tua-ui.css
)。
{
"main": "dist/TuaUI.cjs.js",
"module": "dist/TuaUI.es.js",
}
複製代碼
大部分 ui 庫都支持完整加載,和把大象裝冰箱同樣簡單(但 vux 只支持按需加載):
import TuaUI from '@tencent/tua-ui'
import '@tencent/tua-ui/dist/tua-ui.css'
Vue.use(TuaUI)
複製代碼
因缺思廳的是 cube-ui 把基礎樣式也寫成 Vue 插件,致使按需引入的時候還要單獨引入
Style
,emmmmmmmmm...
import {
/* eslint-disable no-unused-vars */
Style, // <-- 不寫這行按需引入時就沒基礎樣式
Button
} from 'cube-ui'
複製代碼
ui 庫如果只能完整加載,顯然會打包多餘代碼。
因此各類庫通常都支持按需加載組件,大概分如下幾種。
webpack 其實在打包的時候是支持 tree-shaking 的,那麼咱們能不能直接引用源碼實現按需加載呢?
注意源碼必須知足 es 模塊規範(import、export)。
import { TuaToast } from '@tencent/tua-ui/src/'
Vue.use(TuaToast)
複製代碼
嘗試打包,發現 tree-shaking
並無起做用,仍是打包了全部代碼。
其實問題出在沒有在 ui 庫的 package.json
中聲明 sideEffects
屬性。
在一個純粹的 ESM 模塊世界中,識別出哪些文件有反作用很簡單。然而,咱們的項目沒法達到這種純度,因此,此時有必要向 webpack 的 compiler 提供提示哪些代碼是「純粹部分」。 —— 《webpack 文檔》
注意:樣式部分是有反作用的!即不該該被 tree-shaking
!
如果直接聲明 sideEffects
爲 false
,那麼打包時將不包括樣式!因此應該像下面這樣配置:
{
"sideEffects": [ "*.sass", "*.scss", "*.css" ],
}
複製代碼
用 vuepress 寫文檔的時候,通常會在 docs/.vuepress/components/
下寫一些全局組件。
開發時沒啥問題,可是發現一個坑:打包文檔時發現組件裏的樣式 <style>
全丟了。
猜一猜緣由是什麼?
這口鍋就出在上一節的 sideEffects
,詳情看這個 issue。解決方案就是在 sideEffects
里加一條 "*.vue"
便可。
下面我們打包一下安裝了 ui 庫的項目,看看按需加載的效果怎麼樣。
總結一下就是:
114.o4kb
TuaToast
後 js 增長了 0.99kb
,css 增長了 0.79kb
TuaIcon
後 js 增長了 0.96kb
,css 增長了 6.46kb
TuaUI
後 js 增長了 3.35kb
,css 增長了 8.04kb
能夠看出按需加載仍是有效果的~
以上 to be continued...