摘要:開發(fā)模式預(yù)覽在開發(fā)一個(gè)組件庫(kù)時(shí),肯定需要一邊預(yù)覽,一邊修改代碼。一般業(yè)界常見(jiàn)方案是自己開發(fā)展示文檔但這樣會(huì)帶來(lái)一個(gè)組件庫(kù)和文檔如何同步的問(wèn)題。一方面有利于維護(hù),另一方面是讀取源碼時(shí)也有類型提示。
開發(fā)模式 預(yù)覽 demo
在開發(fā)一個(gè) ui 組件庫(kù)時(shí),肯定需要一邊預(yù)覽 demo,一邊修改代碼。
常見(jiàn)的解決方案是像開發(fā)一般項(xiàng)目一樣使用 webpack-dev-server 預(yù)覽組件,比如通過(guò) vue-cli 初始化項(xiàng)目,或者自己配置腳本。
文藝一點(diǎn)兒地可能會(huì)用到 parcel 來(lái)簡(jiǎn)化 demo 的開發(fā)配置(比如 muse-ui)。
展示文檔作為一個(gè) ui 組件庫(kù),也肯定要有自己的組件展示文檔。
一般業(yè)界常見(jiàn)方案是自己開發(fā)展示文檔...
但這樣會(huì)帶來(lái)一個(gè)組件庫(kù)和文檔如何同步的問(wèn)題。
為何不用 vuepress?由于 vuepress 支持在 markdown 中插入組件,所以我們其實(shí)可以很自然地邊寫文檔邊開發(fā)組件。
從開發(fā)步驟上來(lái)說(shuō),甚至可以先寫文檔說(shuō)明,再具體地編寫代碼實(shí)現(xiàn)組件功能。這樣一來(lái)文檔即是預(yù)覽 demo,與組件開發(fā)可以同步更新。
p.s. React 的組件文檔可以試試這倆庫(kù):
docz
doc-scripts
類型聲明在開發(fā)和使用過(guò)程中如果對(duì)于一些對(duì)象、方法的參數(shù)能夠智能提示,豈不美哉?
如何實(shí)現(xiàn)呢?
其實(shí)就是在相應(yīng)文件夾中添加組件相關(guān)的類型聲明(*.d.ts),并通過(guò) src/index.d.ts 導(dǎo)出。
{ "typings": "src/index.d.ts", }
一開始將聲明文件都放在 types/ 文件夾下,但在實(shí)踐中覺(jué)得還是放在當(dāng)前文件夾下比較好。一方面有利于維護(hù),另一方面是讀取源碼時(shí)也有類型提示。如何打包 打包工具
和打包庫(kù)一樣,選了 rollup。
單文件組件在開發(fā)中用不用 *.vue 這樣的單文件組件來(lái)開發(fā)呢?
muse-ui 完全不寫 只使用 render 函數(shù)。
iview、element、vant 使用 .vue 文件,但樣式多帶帶寫。
ant-design-vue 使用 .jsx 文件,樣式也多帶帶寫。
vux 使用帶 的 .vue 文件,但在使用時(shí)必須用 vux-loader。
cube-ui 使用帶 的 .vue 文件,但有一些配置。
講道理,完全不寫 有點(diǎn)兒麻煩,所以添加了 rollup-plugin-vue 插件用于打包 .vue 文件。
但碰到一個(gè)問(wèn)題:如何打包 中的樣式?
首先嘗試不寫 ,直接在 js 里 import scss 文件。沒(méi)問(wèn)題,但是寫組件時(shí)不直觀,同一組件的代碼也分散在了兩個(gè)地方
接著嘗試配置 rollup-plugin-vue,碰到一個(gè) source-map 報(bào)錯(cuò)的問(wèn)題。我提了個(gè) issue。
加載方式 區(qū)分場(chǎng)景為了區(qū)分不同的場(chǎng)景使用不同的 js,所以一共打包了三份 js(commonJs、es module、umd),以及一份壓縮后的 css(dist/tua-ui.css)。
{ "main": "dist/TuaUI.cjs.js", "module": "dist/TuaUI.es.js", }完整加載
大部分 ui 庫(kù)都支持完整加載,和把大象裝冰箱一樣簡(jiǎn)單(但 vux 只支持按需加載):
引入 js
引入 css
安裝插件
import TuaUI from "@tencent/tua-ui" import "@tencent/tua-ui/dist/tua-ui.css" Vue.use(TuaUI)
因缺思廳的是 cube-ui 把基礎(chǔ)樣式也寫成 Vue 插件,導(dǎo)致按需引入的時(shí)候還要多帶帶引入 Style,emmmmmmmmm...
import { /* eslint-disable no-unused-vars */ Style, // <-- 不寫這行按需引入時(shí)就沒(méi)基礎(chǔ)樣式 Button } from "cube-ui"按需加載
ui 庫(kù)若是只能完整加載,顯然會(huì)打包多余代碼。
所以各種庫(kù)一般都支持按需加載組件,大概分以下幾種。
muse-ui、iview、ant-design-vue、vant 通過(guò) babel-plugin-import 插件實(shí)現(xiàn)。
element 通過(guò) babel-plugin-component(fork 自 babel-plugin-import)插件實(shí)現(xiàn)。
vux 通過(guò)自己的 vux-loader 實(shí)現(xiàn)。
cube-ui 通過(guò)配置 webpack 實(shí)現(xiàn)。
tree-shakingwebpack 其實(shí)在打包的時(shí)候是支持 tree-shaking 的,那么我們能不能直接引用源碼實(shí)現(xiàn)按需加載呢?
注意源碼必須滿足 es 模塊規(guī)范(import、export)。
import { TuaToast } from "@tencent/tua-ui/src/" Vue.use(TuaToast)
嘗試打包,發(fā)現(xiàn) tree-shaking 并沒(méi)有起作用,還是打包了所有代碼。
sideEffects其實(shí)問(wèn)題出在沒(méi)有在 ui 庫(kù)的 package.json 中聲明 sideEffects 屬性。
在一個(gè)純粹的 ESM 模塊世界中,識(shí)別出哪些文件有副作用很簡(jiǎn)單。然而,我們的項(xiàng)目無(wú)法達(dá)到這種純度,所以,此時(shí)有必要向 webpack 的 compiler 提供提示哪些代碼是“純粹部分”。 —— 《webpack 文檔》
注意:樣式部分是有副作用的!即不應(yīng)該被 tree-shaking!
若是直接聲明 sideEffects 為 false,那么打包時(shí)將不包括樣式!所以應(yīng)該像下面這樣配置:
{ "sideEffects": [ "*.sass", "*.scss", "*.css" ], }vuepress 組件樣式
用 vuepress 寫文檔的時(shí)候,一般會(huì)在 docs/.vuepress/components/ 下寫一些全局組件。
開發(fā)時(shí)沒(méi)啥問(wèn)題,但是發(fā)現(xiàn)一個(gè)坑:打包文檔時(shí)發(fā)現(xiàn)組件里的樣式 全丟了。
猜一猜原因是什么?
這口鍋就出在上一節(jié)的 sideEffects,詳情看這個(gè) issue。解決方案就是在 sideEffects 里加一條 "*.vue" 即可。
測(cè)試數(shù)據(jù)下面咱們打包一下安裝了 ui 庫(kù)的項(xiàng)目,看看按需加載的效果怎么樣。
Origin
dist/js/chunk-vendors.71ea9e72.js ----- 114.04 kb
TuaToast
dist/js/chunk-vendors.beb8cff5.js ----- 115.03 kb
dist/css/chunk-vendors.97c93b2d.css ----- 0.79 kb
TuaIcon
dist/js/chunk-vendors.25d8bdbd.js ----- 115.00 kb
dist/css/chunk-vendors.eab6517c.css ----- 6.46 kb
TuaUI
dist/js/chunk-vendors.6e0e6390.js ----- 117.39 kb
dist/css/chunk-vendors.7388ba27.css ----- 8.04 kb
總結(jié)一下就是:
原始項(xiàng)目的 js 打包出來(lái)為 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...
參考資料vuepress 在 Markdown 中 使用 Vue
muse-ui
iview
element
ant-design-vue
babel-plugin-import
babel-plugin-component
vux
vant
vux-loader
cube-ui
cube-ui 的后編譯和普通編譯
tree-shaking
rollup-plugin-vue
source-map 報(bào)錯(cuò)的問(wèn)題
vuepress sideEffects issue
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100810.html
摘要:中文官網(wǎng)英文官網(wǎng)組織發(fā)出一個(gè)問(wèn)題之后,不要暫時(shí)的離開電腦,如果沒(méi)有把握先不要提問(wèn)。珍惜每一次提問(wèn),感恩每一次反饋,每個(gè)人工作還是業(yè)余之外抽出的時(shí)間有限,充分準(zhǔn)備好應(yīng)有的資源之后再發(fā)問(wèn),有利于問(wèn)題能夠高效質(zhì)量地得到解決。 Vue.js資源分享 更多資源請(qǐng)Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/maid...
摘要:簡(jiǎn)潔直觀強(qiáng)悍的前端開發(fā)框架,讓開發(fā)更迅速簡(jiǎn)單。是一套基于的前端框架。首個(gè)版本發(fā)布于年金秋,她區(qū)別于那些基于底層的框架,卻并非逆道而行,而是信奉返璞歸真之道。 2017-1209 ZanUI (Vue) 2017-1218 Onsen UI(Vue, React, Angular) 2017-1215 增加 Vuetify, Weex UI, Semantic UI React,ele...
摘要:簡(jiǎn)潔直觀強(qiáng)悍的前端開發(fā)框架,讓開發(fā)更迅速簡(jiǎn)單。是一套基于的前端框架。首個(gè)版本發(fā)布于年金秋,她區(qū)別于那些基于底層的框架,卻并非逆道而行,而是信奉返璞歸真之道。 2017-1209 ZanUI (Vue) 2017-1218 Onsen UI(Vue, React, Angular) 2017-1215 增加 Vuetify, Weex UI, Semantic UI React,ele...
摘要:今年的大會(huì)上,受到作者現(xiàn)場(chǎng)開源項(xiàng)目的感染,我們也在現(xiàn)場(chǎng)宣布開源這套基于開發(fā)的組件庫(kù)。一個(gè)文件夾下有所有的官方插件,直到發(fā)現(xiàn)他們用了一個(gè)叫的工具。那么如何寫樣式同時(shí)單獨(dú)發(fā)布的組件如何引用樣式文件也是我們要解決的問(wèn)題。 showImg(https://segmentfault.com/img/bVDD9H?w=2502&h=1222); 今年的 JSConf 大會(huì)上,受到 gridcont...
閱讀 2867·2021-07-30 15:30
閱讀 562·2019-08-30 15:55
閱讀 1631·2019-08-26 17:04
閱讀 642·2019-08-26 11:36
閱讀 2080·2019-08-26 10:58
閱讀 3562·2019-08-23 14:34
閱讀 1566·2019-08-22 18:48
閱讀 2533·2019-08-21 17:51