Element一套優雅的Vue 2組件庫是如何開發的

2021-01-15 TechWeb

今年的 JSConf 大會上,受到 gridcontrol 作者現場開源項目的感染,我們也在現場宣布開源這套基於 Vue 2 開發的組件庫 —— Element。上場前五分鐘才建的空倉庫,到晚上我們真正推代碼上去已經收(pian)到了 100 多 star,而且僅僅三天時間就獲得了 1k star。這個項目其實早在 Vue 2 進入 beta 時就開始開發了,一直到八月底才接近尾聲。初期也遇到一些棘手的問題,很慶幸都找到了解決方案。在這裡整理一些解決方案分享給大家。

如何管理多個獨立的組件項目 -- lerna

最初制定的目標是有一個主項目管理所有的組件弄成一個包,然後每一個組件都是單獨一個包。這樣用戶可以安裝所有組件也可以只安裝自己需要的組件。於是我們最直接的做法就是一個組件建一個項目,到後面組件越來越多管理起來也越加複雜,每一次升級主倉庫就要更新一堆依賴組件的版本號。而且開發起來也不方便。

後來看到 babel 的倉庫的目錄結構很是奇特。一個 packages 文件夾下有所有的 babel 官方插件,直到發現他們用了一個叫 lerna 的工具。可以讓你在主項目下管理多個子項目,從而解決了多個包互相依賴,且發布時需要手動維護多個包的問題。

所以我們重構了目錄結構,所有插件單獨一個項目放在 packages 目錄下,可單獨打包發布;同時最外面的 src 目錄下的入口文件引入所有組件,打包發布的主項目就是包含了所有的組件。從而就解決了多個子項目管理的問題。

element/   package.json   packages/     component-a/       package.json     component-b/       package.json  

如何解決定製多套主題的問題

組件庫一般都會自帶一套主題,也可能會有多套主題可供選擇,當然也要滿足用戶自定義的需求。所以 Vue 推薦的定義 scope 的樣式就不可行了,同時也不能把樣式寫在組件裡。那麼如何寫樣式同時單獨發布的組件如何引用樣式文件也是我們要解決的問題。

為了方便用戶覆蓋樣式,我們採用 BEM 風格來寫 CSS,這樣的好處是類名基本都是一級,少數才會有嵌套情況,這樣很容易的就可以直接覆蓋掉原有樣式。我們使用了自家開發的 postcss-salad PostCSS 插件來寫樣式。集成了多個實用的 PostCSS 插件同時也支持 BEM 風格。

並且樣式文件目錄也作為單獨一個子項目發布,這樣引入整個包可以包含樣式文件,單獨安裝的組件可以通過安裝主題包的方式引入樣式文件。

這麼做的好處是方便以後擴展其他主題,或者開發者可以自己定義一套其他 CSS 預處理的版本例如 Less 或 Scss。

文檔是如何工作的 -- vue-markdown-loader

當初寫 Mint UI 時就遇到了要用 Vue 寫文檔的問題:如何才能在寫 Markdown 時也能寫 Vue 組件的 Demo。雖然後來並沒有在 Mint UI 的文檔裡寫 Demo。最開始在 Element 的內部版本裡,找遍了各種 Vue 的 Markdown 相關插件,要麼是在 template 裡定義 Markdown 格式,要麼就是有一個 Markdown 的組件。都不能做到純粹的寫 Markdown 文件,並且還能寫 Demo。

後來想到或許可以嘗試把 Markdown 文件轉成 Vue 組件。畢竟可以在 Markdown 裡寫 HTML,那麼完全可以作為 Vue 的模板。後來就有了 vue-markdown-loader,一個把 Markdown 轉成 Vue 組件的 webpack loader,搭配 vue-router 就能搭建一個可以在 Markdown 裡寫 Vue 代碼的文檔網站。

如何同時打包多個組件 -- cooking

由於前面的設定,最終需要每個組件都單獨打包一份並發布。同時每一個組件下面都會有一個對應的配置文件,傳統的用 webpack 打包雖然支持傳入數組,但是並不能傳入多個文件。但是我們有 cooking,一個基於 webpack 但是配置更簡單同時使用上也更容易的工具。打包時只需要同時傳入多個配置文件,利用 webpack 接受數組配置項的特性,就能同時進行打包。

有了這些工具,讓 Element 的開發工作變得更容易且更高效。現在 Element 已經正式開源,並且我們已經放出了文檔,同時還放出了設計資源,歡迎各位 Vue 開發者來嘗試,也歡迎來做貢獻。

相關項目連結:

https://github.com/ElemeFE/element https://github.com/lerna/lerna https://github.com/ElemeFE/postcss-salad https://github.com/ElemeFE/mint-ui https://github.com/QingWei-Li/vue-markdown-loader https://github.com/ElemeFE/cooking

點讚 0

相關焦點

  • Vue 3下element-ui用不了怎麼辦,element-plus來幫你
    element-plus你可以理解為是element-ui支持Vue 3的版本,element-plus是一套支持Vue 3.0的組件庫,提供的組件涵蓋了絕大部分頁面UI的需求。在Vue 3的腳手架項目中,首先安裝element-plus的npm包,命令如下所示:npm install element-plus -S編輯main.js,引入整個element-plus組件和所需的樣式,由於element-plus組件內部默認使用英語,而我們項目需要使用中文
  • Element - 餓了麼團隊出品的神級桌面 UI 組件庫
    介紹由餓了麼團隊出品,一套為開發者、設計師和產品經理準備的組件庫,提供了配套axure、sektch設計資源,可以直接下載使用,能幫我等搬磚人員節省大量的時間。使用現成的UI組件庫,能快速搭建項目,後期也容易維護,在敏捷開發項目中尤為常見。
  • Element 仍在維護,官方發布適配 Vue 3.0 的 Element Plus
    地址:https://github.com/element-plus/element-plus由於 Vue 3.0 進行了大版本升級,Element 作為其生態的組件庫希望藉此機會丟掉歷史包袱,所以開發團隊對 Element 進行了一次深度重構。
  • 如何創建vue項目並使用element框架中的el-select
    cnpm install --global vue-cli2、創建一個基於webpack模板項目,使用命令vue init webpack wmn>命令:vue init webpack wmn命令:npm i element-ui -S
  • 官方Element Plus for Vue 3.0 Beta 版本今天發布了!
    直接來到Element Plus官網,先進行安裝:npm install element-plus --save關於快速上手可參考官網,裡面對於全局配置、按需引入以及如何與新版的vue-cli正如vue-next之於vue,一次 100% 的重構雖然解決了很多歷史遺留問題,但也不可避免的引入一些新的bug 和問題,而獨立的issue 和pr 可以減少大家使用和反饋的心智成本,也能更加方便我們定位問題,並行維護迭代。
  • vue-element-admin v3.6.1 發布,後臺集成方案
    vue-element-admin v3.6.1 已發布,更新內容:vue-element-admin 是基於 vue+element 的後臺集成方案,功能包括:登錄
  • 如何在vue項目中使用sass並設置元素樣式
    那麼,如何在vue項目中使用sass?下面利用實例說明:1、打開HBuilderX開發工具,新建項目,選擇普通項目;然後輸入項目名稱wmk,選擇vue模板,接著點擊創建按鈕新建項目,選擇vue模板2、在項目中src/components文件夾下,新建vue文件,輸入文件名稱,點擊創建
  • vue網頁聊天室|Vue+ElementUI仿微信界面
    項目介紹基於vue2+vuex+vue-cli+element-ui+swiper等技術開發仿微信pc端界面聊天應用,實現了發送消息+表情(動圖gif)、圖片/視頻預覽、右鍵長按菜單、紅包/朋友圈、截圖發送等功能。
  • vue-element-admin v3.9.0 發布,後臺集成方案
    vue-element-admin v3.9.0 已發布,更新內容:refactor[tagsView]: 使用 el-scrollbar 替代之前的滾動方案 #995
  • 如何在Element框架使用日期控制項並獲取年齡
    工具HBuilderXNode.jsnpm瀏覽器技術vueelementJavaScriptCSS3在element框架項目中,日期控制項是一種常用的,可以顯示日期、時間和日期時間。那麼,如何使用日期控制項設置用戶出生日期?然後根據出生日期算出年齡。下面利用實例說明:操作步驟如下:1、打開HBuilderX工具,創建vue項目,然後新建vue文件
  • 一張圖教你快速玩轉vue-cli3
    >配置單/多頁面如何配置自定義環境變量如何在vue.config.js定製自己的webpackvue項目部署思維導圖} else {// 為開發環境修改配置...} else {// 為開發環境修改配置...
  • 如何在Element實現表格的增加、修改和刪除
    下面利用具體的實例說明:操作步驟如下:1、打開HBuilderX開發工具,創建vue+element框架項目,然後新建vue文件,輸入名稱Person.vue,點擊創建按鈕新建vue文件,輸入文件名並創建2、在新建的vue文件中,利用Element布局,插入一個搜索框、三個按鈕,分別為查詢、重置和新增按鈕
  • 如何使用Element-UI中輸入框轉換成文本域
    >HBuilderX技術VueElement-UI1、打開HBuilderX工具,新建vue項目,模板選擇element新建vue項目,模板選擇element2、創建完項目,查看項目結構以及文件作用創建完項目,查看項目結構以及文件作用3、打開App.vue文件,去掉多餘代碼,添加一個el-input控制項
  • 推薦一個開源的vue+Element UI前後端分離後臺管理系統實戰
    最近在學習vue前後端分離開發,但是由於技術太菜,很難在項目上得心應手,最終找到了一個vue開源項目學習,最終在沒有基礎的情況下,他認識我我不認識他,呵呵。我想很多自學這塊的小夥伴也遇到過同樣的問題吧。
  • nuxt打包element-ui上傳阿里雲oss(CDN)上字體出現跨域問題
    今天打包將項目放到linux伺服器上,打包項目,將打包文件放到阿里雲oss(CDN),訪問界面時,出現element字體跨域問題。截圖如下:苦逼一下午,終於解決了這個問題。1.先要理解vue和nuxt的assets文件夾和static文件夾的區別,asset是會被webpack打包,你只有將字體文件放到static就會當成靜態文件直接訪問,不會處理。
  • 怎麼使用vue中的實例屬性vm.$data
    ElementJavaScript在vue中,vm.1、打開HBuilderX工具,創建vue項目,然後在src/components新建vue文件DataAtrr.vue新建vue文件DataAtrr.vue2、使用命令npm i element-ui -S安裝Element,然後打開main.js文件,引入Element的樣式和模塊
  • Diboot 2.0.5 發布,自動化開發助理 - OSCHINA - 中文開源技術交流...
    Diboot 2.0.5 發布,自動化開發助理,為您賦能提效一、前言Diboot 2.0.5
  • VUE 項目如何快速優化?|原力計劃
    如果程式設計師有修改 webpack默認配置的需求,可以在項目根目錄中 按需創建vue.config.js這個配置文件,從而對項目的打包發布過程做自定義配置,具體可以參考 https://cli.vuejs.org/zh/config/#vue-config-js為開發模式和發布模式指定不同的打包入口:
  • 如何在Element框架實現表格並聯動子表格
    >HBuilderXnpm瀏覽器Node.js技術vueElementJavaScriptCSS3在使用vue+Element結合的框架開發項目時,會經常使用到Element中的表格。如果想要實現父子表格的聯調(根據父表格的某個欄位查詢子表格),該如何實現呢?下面利用實例說明:1、打開HBuilderX工具,創建vue模板項目,然後安裝Element;接著,在項目指定文件夾下,新建vue文件ParentChild.vue
  • 如何在Element中實現表格雙擊查看詳情
    >HBuilderXnpm瀏覽器Node.js技術vueElementJavaScriptCSS3在使用Element進行開發項目時,使用el-table(表格)組件,如果表格欄位是編號,顯示的是描述,或雙擊表格行記錄,查看這條記錄的詳情,該如何實現呢