最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Monorepo風格的組件工程搭建示例詳解

 更新時間:2023年02月01日 14:18:15   作者:Fone丶峰  
這篇文章主要介紹了Monorepo風格的組件工程搭建示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

Monorepo概念

隨著各種技術的發(fā)展和超級應用的出現(xiàn),人們開始考慮怎么才能將所有的小應用都集成在一個大項目中,特別是在這些項目互相影響時,在實現(xiàn)過程中,工程師們最關注的兩點是:項目功能分離 和 避免重復代碼。

如果將每個功能作為獨立的項目打包,隨著業(yè)務的發(fā)展,項目會越來越多,根本沒法管理,項目與項目之間的協(xié)作也會越來越困難,所以Monorepo的概念并產(chǎn)生了。

Monorepo中我們可以在一個項目下進行功能拆分,他們互相獨立不影響,但是又可以通過引用來達到互相協(xié)助。

Monorepo的優(yōu)缺點

優(yōu)點:

  • 簡化依賴的管理。
  • 跨組合作更加方便。
  • 代碼復用簡單。

缺點:

  • 項目構建時間過長。
  • 版本信息雜糅不清晰。

我也會基于Monorepo的方式搭建屬于自己的組件庫工程。

項目工程的搭建

技術選型

  • 基于pnpmMonorepo工程,項目打包工具vitegulp,使用sass處理樣式。
  • Vue組件寫法會支持Jsxtemplate的方式。項目支持Typescript
  • lint規(guī)范的接入,prettier的格式化統(tǒng)一,husky的卡點校驗。
  • 組件單元測試使用vitest+happy-dom。

基于以上的技術開始搭建我們的項目。

項目的大概結構

// vb-design
|—— config        //放置一些腳本
|—— examples      //存放演示包
    |—— demo
    |—— taro-demo 
    ...
|—— packages      //存放npm庫的包
    |—— hooks
    |—— icon
    |—— ui-h5
    |—— ui-taro
    ...
.eslintignore
.eslintrc.js
.gitignore
.lintstagedrc.cjs
.npmrc
.prettierrc.cjs
package.json
pnpm-workspace.yaml
README.md
tsconfig.root.json
...

項目配置

Monerepo工程的起步

pnpm搭建Monorepo是非常簡單的,只需要我們配置pnpm-workspace.yaml文件即可。具體的配置可參考pnpm-workspace.yaml | pnpm

lint、prettier、eslint的接入

lint、prettiereslint的配置大部人應該都很熟練了,在這我就不一一貼代碼說明了。還不清楚的小伙伴可參考我的代碼或者找篇相關的教程自己跟著試試。

統(tǒng)一開發(fā)環(huán)境

開發(fā)環(huán)境的統(tǒng)一,主要是統(tǒng)一Node版本和pnpm,我們可以通過在package.json中配置一些字段來統(tǒng)一開發(fā)環(huán)境。

1、限制Node版本和pnpm通過配置voltaengines限制Nodepnpm的版本

//package.json
"volta": {
    "node": "16.13.0"
},
"engines": {
    "node": "16.13.0",
    "pnpm": ">=6"
}

2、限制項目只能通過pnpm初始化依賴

//package.json
"scripts": {
    "preinstall": "npx only-allow pnpm",
}

packages子包搭建

對于子包的搭建,不會詳細地一一講解,需要深入了解的可以自行到源代碼里看。

ui-h5搭建

  • 目錄結構設計
//ui-h5
components                  //組件目錄
    |—— Button
        |—— demo            //demo演示存放目錄
            |—— base.vue
            ...
        |—— index.md        //組件使用文檔
        |—— index.scss      //組件樣式
        |—— index.ts        //vue組件
        |—— index.taro.ts   //taro組件
    |—— Icon
    ...
style          //公共樣式存放
    |—— index.scss
    ...
ui.h5.ts       //vue組件對外暴露
ui.taro.ts     //taro組件對外暴露

為了開發(fā)方便,把vue端、taro端的組件都放在該包下,以及examples需要的演示文檔和demo也放在該包下。至于各端寫好的組件demo、演示文檔是怎么使用,后續(xù)會說明。

  • 構建產(chǎn)物
// dist
components                    //單個組件
    |—— Button
        |—— index.scss
        |—— index.css
        |—— index.js
        |—— index.taro.js
    |—— Icon
    ...
style 
    |—— index.scss
    ...
types
    |—— 
    ...
style.css
vb-ui.es.js
vu-ui.umd.js
vb-ui.taro.es.js
vb-ui.taro.umd.js

ui-taro搭建

該包其實沒有做更多的事情,只是初始化之后把package.json做了相關配置。最重要的地方是在根目錄下的package.json配置了腳本,在ui-h5包構建之后,通過腳本copy了該包需要的東西。

  • 腳本文件都在根目錄config

icon搭建

ui-h5中,Icon組件的設計支持了iconfontsvg的方式,這也是參考了element-uiIcon組件設計。所以該包主要是處理svg圖標,把圖標轉化成vue組件統(tǒng)一向外暴露的過程。

另外,我并不會用設計軟件,沒有svg可用,所以借用了字節(jié)arco-design的圖標Arco Design Icons – Figma

hooks搭建

該包主要是一些公共方法的包,目前也沒有更多的想法,所以也只是先放著。

examples瀏覽器端演示包搭建

因為搭建的是移動端組件庫,所以演示包需要有兩個入口,H5端和PC端。整個搭建的過程大致是:

vite-plugin-pagesvite-plugin-vue-layouts的配置

//vite.config.js
Pages({
  dirs: [
    {
      dir: resolve(__dirname, '../../packages/ui-h5/components'),
      baseRoute: 'component',
    },
  ],
  exclude: ['**/components/*.vue'],
  extensions: ['vue', 'md'],
}),
Layout({
  layoutsDirs: 'src/layouts',
  defaultLayout: 'preview',
})

項目的構建與npm包發(fā)布

這么多的子包,打包構建以及推送到npm是不是需要到每個子包下執(zhí)行完打包和執(zhí)推送的命令?針對這個問題pnpm官方是有解決方案的:

首先所有的子包都定義個build命令來執(zhí)行當前包的所有打包構建事情,最后項目根目錄package.json的配置如下:

//package.json
"scripts": {
    "build": "pnpm --filter './packages/**' run build && pnpm run build:taro",  //執(zhí)行packages下所有子包的build方法
    "release": "pnpm run build && pnpm run release:only",
    "release:only": "changeset publish --tag=beta --access=publish",            //發(fā)布所有子包
    "build:taro": "node ./config/build-taro.js",
    "build:demo": "pnpm --filter './examples/**' run build"
}

上方build這個地方的配置pnpm官方有很詳細的說明。再就是關于npm publish的,主要是通過@changesets/cli這個cli工具去解決。

changeset publish 只是一個很純凈的發(fā)包命令,手動提升/修改版本后再 changeset publish他會將所有包都publish一次。

  • 寫到這,順便再給大家說下這個項目的代碼發(fā)布流吧。
  • 版本號是手動修改的。
  • 通過打tag的方式會觸發(fā)workflows去執(zhí)行打包構建,然后publish和部署演示的demo。

很多開源的項目通過changeset-bot + changesets/action + @changesets/cli能玩出各種各樣的工作流。

關于單元測試

單測在開源項目里是不可缺少的存在,雖然我不一定會去寫單測??,但是該有的東西還是得搭起來。

Vitest是基于vite的原生快速單元測試,完全兼容JestApi,還能共用vite的配置。所以針對當前項目使用Vitest是最快接入單元測試的方式,但是很遺憾,針對小程序端還沒有更好的接入單元測試方案。

最后

寫到這,組件庫的搭建過程也差不多了,有什么不了解的可以留言或私信我。歡迎大家提出更好的意見或想法,還有寫作水平差,有問題請輕噴。

最后因為沒有一些設計規(guī)范,所以UI組件的產(chǎn)出并不會很理想。但是從0到1實現(xiàn)的過程才是重點,這能讓我們以后在碰到相同問題時能快速解決。

相關文章

開篇:對于組件庫的思考、技術梳理

代碼倉庫:vb-design

以上就是Monorepo風格的組件工程搭建示例詳解的詳細內(nèi)容,更多關于Monorepo組件搭建的資料請關注腳本之家其它相關文章!

相關文章

  • 關于Vue 消除Token過期時刷新頁面的重復提示問題

    關于Vue 消除Token過期時刷新頁面的重復提示問題

    很多朋友在token過期時刷新頁面,頁面長時間未操作,再刷新頁面時,第一次彈出“token失效,請重新登錄!”提示,針對這個問題該怎么處理呢,下面小編給大家?guī)碓蚍治黾敖鉀Q方法,一起看看吧
    2021-07-07
  • vue彈窗里面使用echarts不顯示的問題及解決

    vue彈窗里面使用echarts不顯示的問題及解決

    這篇文章主要介紹了vue彈窗里面使用echarts不顯示的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 詳解vue組件之間的通信

    詳解vue組件之間的通信

    這篇文章主要介紹了vue組件之間的通信,幫助大家更好的理解和學習前端的相關知識,感興趣的朋友可以了解下
    2020-08-08
  • vue2 中使用 render 函數(shù)編寫組件的方式

    vue2 中使用 render 函數(shù)編寫組件的方式

    vue提供了聲明式編寫UI的方式,即vue提供了對DOM進行描述的方式,有兩種描述DOM的方式即模板和render 函數(shù),本文通過示例代碼介紹vue2 中使用 render 函數(shù)編寫組件的方式,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • vue 子組件修改data或調用操作

    vue 子組件修改data或調用操作

    這篇文章主要介紹了vue 子組件修改data或調用操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue程序調試和排錯技巧分享

    Vue程序調試和排錯技巧分享

    因為程序的調試非常重要,程序猿可以利用好的調試方法去查找定位自己的問題所在之處,從而,達到糾正自己程序錯誤的地方,健壯自己的程序,讓問題變得越來越少,程序變得越來越健康,所以本文給大家介紹了Vue程序調試和排錯技巧,需要的朋友可以參考下
    2024-12-12
  • vue3+ElementPlus封裝函數(shù)式彈窗組件詳解

    vue3+ElementPlus封裝函數(shù)式彈窗組件詳解

    這篇文章主要為大家詳細介紹了如何利用vue3和ElementPlus封裝函數(shù)式彈窗組件,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-08-08
  • Vue父組件如何獲取子組件中的變量

    Vue父組件如何獲取子組件中的變量

    這篇文章主要為大家詳細介紹了Vue父組件如何獲取子組件中的變量,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • vue車牌搜索組件使用方法詳解

    vue車牌搜索組件使用方法詳解

    這篇文章主要為大家詳細介紹了vue車牌搜索組件的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • vue3?ref和reactive的區(qū)別解析

    vue3?ref和reactive的區(qū)別解析

    這篇文章主要介紹了在Vue3中,ref用于創(chuàng)建簡單數(shù)據(jù)的響應式包裝,通過.value訪問和修改;reactive用于創(chuàng)建復雜對象的響應式對象,可以直接訪問和修改屬性,兩者各有適用場景,ref更適合單個值,reactive更適合復雜對象,本文介紹vue3?ref和reactive區(qū)別,感興趣的朋友一起看看吧
    2025-02-02

最新評論

仪陇县| 油尖旺区| 民和| 东丰县| 凤翔县| 隆子县| 攀枝花市| 交城县| 绍兴市| 无为县| 盐边县| 保靖县| 大理市| 句容市| 正阳县| 宁城县| 竹北市| 广州市| 江门市| 娱乐| 锦州市| 防城港市| 牟定县| 沈丘县| 石狮市| 永善县| 凌海市| 永川市| 信阳市| 昔阳县| 渑池县| 酒泉市| 土默特右旗| 萍乡市| 通河县| 济宁市| 巫山县| 大名县| 山阴县| 建平县| 江阴市|