国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于原子化思想的 Vue3 組件庫 UnoCSS UI

這篇具有很好參考價值的文章主要介紹了基于原子化思想的 Vue3 組件庫 UnoCSS UI。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

項目地址

Github 地址:https://github.com/cherryful/unocss-ui文章來源地址http://www.zghlxwxcb.cn/news/detail-494532.html

example 預(yù)覽地址:https://cherryful.github.io/unocss-ui/

基于 UnoCSS UI 的開源項目 :

  • vue3-template:一個輕量級的 Vue3 啟動模板,自帶 Unocss UI
  • rabbit-admin:一個基于 Golang 和 Vue3 的輕量級全棧后臺管理模板

前言

UnocssUI 是一個基于 UnoCSS 帶有原子化思想的現(xiàn)代化 Vue3 組件庫,它的特點是簡單,每個組件的實現(xiàn)之間沒有任何依賴(只在 一個 .vue 文件實現(xiàn)),非常適合用來學(xué)習(xí)組件庫的封裝,同時它也在快速的迭代與建設(shè)中。

從該項目中你或許可以學(xué)習(xí)到:

  • 基于 PNPM 的 Monorepo 項目架構(gòu):如何組織組件庫的目錄結(jié)構(gòu)
  • 基于原子化 CSS 的組件封裝方式:原子化 CSS 極大的簡化了組件的封裝
  • 一種傾向于簡潔的編碼思想:可以減少編碼的心智負擔(dān)
  • 開發(fā)帶有動態(tài)調(diào)試功能的文檔:這是一種非常靈活的文檔展現(xiàn)形式

很多思想與方式都是個人參考很多開源項目 + 自己的理解所得到的,如果有問題或者更好的方案,歡迎交流


在開始前,先簡單看一下組件庫的使用方式:

需要安裝三個依賴:unocss,unocss-ui,@unocss/reset

pnpm add unocss unocss-ui @unocss/reset

使用方式一:在 main.ts 進行全局注冊,后續(xù)在 .vue 中使用無需引入

// 注意順序
import '@unocss/reset/tailwind.css'
import 'unocss-ui/style.css' // 目前,無論使用哪種方式都必須引入組件庫的 CSS 文件
import 'uno.css'

import unocssui from 'unocss-ui'
import { createApp } from 'vue'
import App from './App.vue'

createApp(App).use(unocssui).mount('#app')

使用方式二:不進行全局注冊,需要在 .vue 頁面文件中單獨引入:

// App.vue
<script setup>
import { UButton } from 'unocss-ui'
</script>

<template>
	<UButton> Hello </UButton>
</template>

方式二 TODO:后續(xù)實現(xiàn)按需引入并打包的功能(非常重要)

這里提供一個集成了 UnoCSS UI 的 Vue 啟動模板:vue3-template

Monorepo 項目架構(gòu)

Monorepo 是現(xiàn)在比較流行的一種前端項目架構(gòu),簡單來說就是:一個倉庫內(nèi)包含多個開發(fā)項目(模塊)。

  • 整個項目的根目錄下有一個 package.json
  • 子目錄下可能還會有 package.json 即子模塊
  • 基于 PNPM 的 Monorepo 由 pnpm-workspace.yaml 文件來指定哪些目錄可能為子模塊

參考文檔:https://www.pnpm.cn/pnpm-workspace_yaml

本項目的 pnpm-workspace.yaml 內(nèi)容如下:

# pnpm-workspace.yaml
packages:
  - 'packages/*'
  - example
  - demo

其含義是指 packages 目錄下的所有目錄,及根目錄下的 example 和 demo 可以為子模塊。

基于原子化思想的 Vue3 組件庫 UnoCSS UI

即該項目總共有 5 個子模塊,加上根模塊,共計 6 個模塊,在拉取本項目并執(zhí)行 pnpm install 時也會提示。

基于原子化思想的 Vue3 組件庫 UnoCSS UI

UnoCSS UI 的模塊設(shè)計

在 UnoCSS UI 項目中,最外層的根模塊是 unocss-ui-monorepo,其中包含了以下子模塊:

  • example:用于開發(fā)組件時進行實時預(yù)覽,以及作為一個示例項目展示
  • demo:用于測試打包后的組件包是否正常(不能用來做開發(fā)時預(yù)覽,因為導(dǎo)入的是打包后的 package)
  • @unocss-ui/components:組件的源碼
  • @unocss-ui/preset:根據(jù)組件庫自身需求抽取出來的 UnoCSS 的預(yù)設(shè)
  • unocss-ui:項目的入口文件,在這里引用 @unocss-ui/components@unocss-ui/preset

這里解釋一下 @unocss-ui/components、@unocss-ui/preset、unocss-ui 三個模塊的關(guān)系

  • @unocss-ui/components 是組件庫的源碼,包含 Button.vue、Tag.vue 等文件,可以直接從該模塊中引入組件:
// App.vue
import { UButton } from '@unocss-ui/components'
  • @unocss-ui/preset 是封裝的 UnoCSS 預(yù)設(shè)文件,需要搭配其實現(xiàn)組件庫的某些功能,引用方式:
// uno.config.ts
import { presetUnocssUI } from '@unocss-ui/preset' 
  • unocss-ui 這個模塊相當(dāng)于是上面兩個模塊的匯總,使得用戶只需要安裝 unocss-ui 模塊即可使用其中的子模塊:
// App.vue
import { UButton } from 'unocss-ui'

// uno.config.ts
import { presetUnocssUI } from 'unocss-ui'

如果你愿意,也可以分別安裝 @unocss-ui/components@unocss-ui/preset 模塊。

順帶一提,子模塊的命名往往都是 @組織名/模塊名,UnoCSS UI 也采用這種設(shè)計。


PNPM Monorepo 常用操作: --filter, -w

PNPM 多模塊下常用的命令:

  • --filter-F 后跟模塊名,表示后面的操作是在該模塊進行
  • -w 表示在根模塊下進行操作

根模塊下安裝的依賴,子模塊是可以直接使用的,而子模塊之間互相不共享依賴。

請熟悉以下幾個例子:若不清楚 -Dadd 等指令含義,先查詢資料補一些 NPM / PNPM 基礎(chǔ)

# 給 example 模塊添加 Vue 依賴
pnpm --filter example add vue

# 給根模塊添加 eslint 開發(fā)依賴
pnpm add -wD eslint

# 在 @unocss-ui/components 模塊下執(zhí)行 pnpm build 操作
# 需要在 @unocss-ui/components 模塊下的 scripts 中配置 build 腳本
pnpm --filter @unocss-ui/components build

# 在 example 模塊下執(zhí)行 pnpm dev 操作
# 需要在 example 模塊下的 scripts 中配置 dev 腳本
pnpm --filter example dev

在根模塊的 package.json 中,配置了一些執(zhí)行腳本:根據(jù)上面的介紹能理解,就是對子模塊的操作在根目錄下進行了匯總。

"scripts": {
	// 在 @unocss-ui/components 下執(zhí)行 pnpm build
    "build:components": "pnpm --filter @unocss-ui/components build",
    "build:preset": "pnpm --filter @unocss-ui/preset build",
    "build:unocss-ui": "pnpm --filter unocss-ui build",
    // 同時執(zhí)行上面 3 個構(gòu)建操作
    "build:all": "pnpm build:preset && pnpm build:components && pnpm build:unocss-ui",

	// 在 example 下執(zhí)行 pnpm dev
    "dev:example": "pnpm --filter example dev",
    "build:example": "pnpm --filter example build",
    "preview:example": "pnpm --filter example preview",
    "dev:demo": "pnpm --filter demo dev",
    "build:demo": "pnpm --filter demo build",
    "preview:demo": "pnpm --filter demo preview",
    "lint": "eslint .",
 	"lint:fix": "eslint --fix ."
}

這樣的好處是每次要操作子模塊,只需要在根目錄下進行操作,而無需不停的 cd 切換到子目錄去執(zhí)行操作。(當(dāng)然進入子模塊后再執(zhí)行該模塊對應(yīng)操作也是可以的)

Monorepo 中的依賴管理

最偷懶的做法是將所有需要的依賴安裝到根模塊中,子模塊中都可以直接使用。

但是我認為還是需要做一些區(qū)分的:

  • 在根模塊中安裝一些所有子項目通用的開發(fā)時依賴,如:eslint,typescript,lint-staged 等。
  • 在各個子模塊安裝其需要的依賴,例如 demo 和 example 都是 Vue 項目,可以分別安裝 vue、vite 等依賴,而 @unocss-ui/preset 只是個標(biāo)準(zhǔn)的 TypeScript 項目,無需安裝 vue 等依賴。

這樣的好處是你把子模塊視作單獨的項目時也可以清楚的知道它必須有哪些依賴。

當(dāng)然這些并不是強制性的,如果嫌麻煩,全部使用 pnpm -w add xxx 安裝在根模塊就可以了。

項目整體結(jié)構(gòu)

經(jīng)過上面的介紹,其實項目整體結(jié)構(gòu)很簡單,再梳理一下核心內(nèi)容如下:

.
├── demo 			// 子項目 demo: 用于測試組件庫打包的 Vue 項目
├── example 		// 子模塊 example: 用于開發(fā)組件時進行實時預(yù)覽,以及作為一個示例項目展示的 Vue 項目
├── LICENSE
├── package.json 	// 根模塊 unocss-ui-monorepo
├── packages
│   ├── components 	// 子模塊 @unocss-ui/components: 組件庫源碼
│   ├── preset 		// 子模塊 @unocss-ui/preset: 組件庫的 UnoCSS 預(yù)設(shè)
│   └── unocss-ui	// 子模塊 unocss-ui: 組件庫的匯總
├── pnpm-workspace.yaml // 設(shè)置 pnpm monorepo 的子模塊
├── README.md 
├── tsconfig.json
└── // 省略一些配置文件如 .npmrc .eslintrc .gitignore 等

以上是這個項目的整體架構(gòu),知道了這些可以讓你熟悉項目的結(jié)構(gòu),從而減少對其的恐懼。但是不可能項目每個文件都由我來介紹的清清楚楚,下面聊聊我認為比較合理的源碼學(xué)習(xí)與查看方式。

對該項目的學(xué)習(xí)應(yīng)該基于以下的原則:

1、從整體到局部,從根模塊到子模塊。首先應(yīng)當(dāng)看項目根目錄下有哪些文件,例如本項目根目錄下有一些我沒有介紹到的文件:.eslintrc,.npmrc,tsconfig.json 等,因為這些并不影響你對項目的整體理解。但是我建議遇到?jīng)]見過的后綴名就百度查詢一下相關(guān)資料,至少需要對其有簡單的概念(是怎么產(chǎn)生的,是否是某個開發(fā)依賴的配置文件,用來做什么的),久而久之的積累下來會發(fā)現(xiàn):前端其實就那么些個配置文件!

對于每個子模塊中的內(nèi)容,可以不用一開始全部看完,但是需要知道這個模塊是用來干嘛的(這個我已經(jīng)在上面介紹過了)。

2、先從項目的依賴開始看起。package.json 中有非常多的配置項,其中大部分與打包與發(fā)布有關(guān),初次學(xué)習(xí)應(yīng)該將重點放在 dependencisdevDependencies 這兩個配置上,看看是否所有的依賴項都認識,如果遇到不認識的依賴還是需要自行百度。

3、熟悉了整體結(jié)構(gòu),可以開始看細節(jié)。

基于上面的介紹,項目的整體結(jié)構(gòu)應(yīng)當(dāng)是非常清晰的。

基于原子化 CSS 的組件封裝方式

原子化 CSS 基礎(chǔ)

如果你對原子化 CSS 沒有任何概念,建議先從 TailwindCSS 開始了解并查詢相關(guān)資料,理解它是什么,如何使用的。但是很多人哪怕接觸過原子化 CSS,可能也無法理解它的好處。

在我看來,原子化 CSS 最大的好處其實是 減少人的編碼心智負擔(dān)。

或許你會感到奇怪,一大堆的類似內(nèi)聯(lián)樣式的書寫方式,把代碼寫在 HTML 標(biāo)簽里,怎么會減少人的心智負擔(dān)呢,應(yīng)該是加大了心智負擔(dān)才對呀!如果這樣能減少心智負擔(dān),那遠古時期就應(yīng)該流行內(nèi)聯(lián)樣式才對!

原子化 VS 內(nèi)聯(lián)樣式

首先原子化 CSS 和內(nèi)聯(lián)樣式是不一樣的,主要體現(xiàn)在它非常的簡短,例如實現(xiàn)這么一個簡單圓圈效果:
基于原子化思想的 Vue3 組件庫 UnoCSS UI

<!-- 使用內(nèi)聯(lián)樣式 -->
<div style="width: 1.25rem; height: 1.25rem; background-color: white; border: 2px solid red; border-radius: 100%;" />

<!-- 使用原子化 CSS -->
<div class="m-15 h-15 w-15 border-5 border-red-500 rounded-full bg-white" />

從這個角度來看原子化 CSS 可以認為是內(nèi)聯(lián)樣式的簡寫,毫無疑問比它短很多,樣式越多越明顯。

如果要再給這個圓圈添加一個鼠標(biāo)懸浮效果呢?常規(guī)的內(nèi)聯(lián)樣式無法實現(xiàn),需要借助選擇器。而在原子化 CSS 中只需要這樣添加以下屬性:hover:bg-gray-100

<div class="m-15 h-15 w-15 border-5 border-red-500 rounded-full bg-white hover:bg-gray-100" />

再比如要給所有子標(biāo)簽添加邊距這么一個簡單的功能:
基于原子化思想的 Vue3 組件庫 UnoCSS UI

 <div>
   <span> A </span>
   <span style="margin-left: 16px;"> B </span>
   <span style="margin-left: 16px;"> C </span>
 </div>

使用原子化 CSS 非常簡單:

<div class="space-x-4">
  <span> A </span>
  <span> B </span>
  <span> C </span>
</div>

原子化 CSS 包含了很多功能性極強的 class,因此它其實是內(nèi)聯(lián)樣式的全方面升級。

原子化 VS class

這點我認為沒有太大比較的必要,class 的本質(zhì)是將相同屬性的標(biāo)簽抽象出一份來維護。原子化也可以通過 @apply 實現(xiàn)類似的效果,而且更加靈活:

基于原子化思想的 Vue3 組件庫 UnoCSS UI

<div class="flex gap-2">
	<div class="circle border-red-500 ">
	<div class="circle border-blue-500">
	<div class="circle border-green-500">
</div>
.circle {
	@apply m-15 h-15 w-15 border-5 rounded-full bg-white hover:bg-gray-100;
}

毫無疑問相比原生 css 它依舊突出一個簡潔。


在原子化中,@apply 這種用法只是用來輔助,大部分情況下都我都更愿意直接用原子化寫,如果實在是重復(fù)的太多了,就用它。

因為使用 class 很大程度上會有一個困擾,也就是起名問題,原子化可以避免這個問題。

原子化對組件封裝的影響

使用原子化 CSS 可以減少心智負擔(dān)主要體現(xiàn)在以下幾個方面:

  • 不用非常頻繁的起類名,只會偶爾需要用到 class
  • 雖然類似內(nèi)聯(lián)樣式,但是從寫法上來說比它簡潔太多,視覺效果很好
  • 寫某個模塊時不需要額外考慮對其他模塊的影響,只需要注重當(dāng)前內(nèi)容

傳統(tǒng)組件封裝中由于 style 中的內(nèi)容過多,我們一般會抽取出一個單獨的 .css 文件,并且還要盡量想辦法去進行各種抽取有共同點的 class 等操作,這些都是對 “心智負擔(dān)” 的壓力的體現(xiàn)。

使用了原子化的思路減少了巨量的 css,完全可以不考慮以上的操作。并且可以實現(xiàn)一個組件文件盡量減少其外部依賴,即我認為基于原子化 CSS 的組件文件完全可以只由一個 .vue 文件實現(xiàn)其全部內(nèi)容,而不是在設(shè)計層面抽象出各種依賴再引入,這一點也實在是令人有巨大的心智負擔(dān)。

尤其是在看別人的項目的時候,我經(jīng)常會想著看看它的組件中的某一個很小的功能是如何實現(xiàn)的,奈何有些項目實在是將一個模塊拆分的七零八碎,各種引入,令人眼花繚亂,更有甚者會濫用 “自動引入依賴” 這種功能,導(dǎo)致有時候在網(wǎng)頁上看看代碼根本無法理解一些邏輯的源自哪里。

UnoCSS UI 從開發(fā)之初的設(shè)計理念就是:簡單就是最好的,因此:

  • 項目中沒有使用那些看起來甜甜的插件(自動導(dǎo)入等)
  • 每個組件不過多的依賴于其他東西,所有組件只依靠一個 .vue 便實現(xiàn)其所有功能,如果你只想看某個組件的具體實現(xiàn),只需要沒有任何壓力的看這個組件的 .vue 就可以了。

例如你可以查看這個 Button.vue 查看一下封裝一個 Button 代碼量其實非常的少 。

因此我認為在理解了整個項目的設(shè)計結(jié)構(gòu)后,剩下的事情就非常簡單了:挑選你感興趣并想學(xué)習(xí)的組件源碼去查看學(xué)習(xí)。

如果是萌新,盡量從比較簡單的組件開始學(xué)習(xí):Button,Tag,Alert 等。

@unocss-ui/components

基于以上思想來看,其實 @unocss-ui/components 這個子項目的源碼結(jié)構(gòu)非常簡單:

.
├── package.json
├── README.md
├── src
│   ├── components // 組件源碼盡量簡單獨立、無依賴,一個 .vue 實現(xiàn)所有功能
│   │   ├── Alert.vue
│   │   ├── Badge.vue
│   │   ├── Button.vue
│   │   ├── Checkbox.vue
│   │   ├── ...
│   ├── composables // 一些可復(fù)用的函數(shù)
│   └── index.ts // 組件庫入口文件,用于導(dǎo)出所有組件
├── tsconfig.json
├── tsconfig.node.json
├── uno.config.ts
└── vite.config.ts

@unocss-ui/preset

該 preset 沒有做太復(fù)雜的事情,核心就是定義了 safelist 和 theme 兩個屬性。

safelist

就像之前所說的,該組件庫中的組件都是不依賴于外部文件的,其實 preset 的主要意義是設(shè)置一些 safelist。

簡單來說 safelist 解決的問題就是動態(tài)拼接 CSS 失效的問題,例如現(xiàn)在需要封裝一個可以傳入顏色的圓圈組件:

<script setup>
defineProps({
  color: { type: String, default: 'red' },
})
</script>

<template>
  <div
    class="h-15 w-15 border-5 rounded-full bg-white hover:bg-gray-100"
    :class="`border-${color}-500 `"
  />
</template>
<div class="m-15 flex gap-2">
	<Circle color="red" />
	<Circle color="blue" />
	<Circle color="green" />
</div>

以上代碼非常合理,但卻不一定會生效,因為 其中包含字符串拼接的 class,如果想要確保它一定會生效,可以配置 safelist:

// uno.config.ts
safelist: ['bg-red-500', 'bg-blue-500', 'bg-green-500']

因此 @unocss-ui/preset 大部分的配置其實就是針對 safelist,來保證我在代碼中使用動態(tài)拼接 class 是正常的。

theme

參考:https://unocss.dev/config/theme#theme

在項目中,往往都是有 “主題色” 的概念的,UnoCSS UI 預(yù)設(shè)中約定了主題色為以下:

  • primary - indigo
  • secondary - teal
  • accent - pink
  • success - green
  • info - blue
  • warning - yellow
  • error - red
import { colors } from 'unocss/preset-mini'

// ...
theme: {
  colors: {
    primary: colors.indigo, // 簡單的使用調(diào)色板顏色,否則需要自行書寫 50, 100, 200, 300 這些數(shù)字對應(yīng)的具體顏色
    secondary: colors.teal,
    accent: colors.pink,
    success: colors.green,
    info: colors.blue,
    warning: colors.yellow,
    error: colors.red,
  },
},
// ...

使用 bg-primary-500 等價于 bg-indigo-500,這樣的好處是當(dāng)你想一鍵切換主題只需要改一行配置即可。

同時,為了讓代碼中使用的更隨心所欲,我們將其與 safelist 結(jié)合,來實現(xiàn)代碼中可以使用動態(tài)拼接成主題色的 class

const types = ['primary', 'secondary', 'accent', 'success', 'info', 'warning', 'error']

// ...
safelist: [
  ...types.map(t => nums.map(n => `bg-${t}-${n}`)).flat(),
  ...types.map(t => nums.map(n => `text-${t}-${n}`)).flat(),
  // ...
],

對于大部分組件來說,完全可以接受一個類型固定的 type,然后動態(tài)的拼接到 bg,text 等 class 中

defineProps<{
  type?: 'success' | 'info' | 'warning' | 'error' | 'primary' | 'secondary' | 'accent'
}()

// ...
<div
	// ....
	:class="text-${type}-700 bg-${type}-500"
>
// ...
</div>

目前的 preset 源碼 也比較簡單,只是遇到了需要動態(tài)拼接的 class 情況才放到這里,后面會按需增加:

import type { Preset } from 'unocss'
import { colors } from 'unocss/preset-mini'

const types = ['primary', 'secondary', 'accent', 'success', 'info', 'warning', 'error']
const nums = ['50', '100', '200', '300', '400', '500', '600', '700', '800', '900', '950']
const sizes = ['sm', 'md', 'lg', 'full']

export function presetUnocssUI(): Preset {
  return {
    name: '@unocss-ui/preset',
    safelist: [
      ...types.map(t => nums.map(n => `bg-${t}-${n}`)).flat(),
      ...types.map(t => nums.map(n => `border-${t}-${n}`)).flat(),
      ...types.map(t => nums.map(n => `text-${t}-${n}`)).flat(),
      ...types.map(t => nums.map(n => `focus:ring-${t}-${n}`)).flat(),
      ...types.map(t => nums.map(n => `focus:border-${t}-${n}`)).flat(),
      ...types.map(t => `border-r-${t}-500`),
      ...sizes.map(s => `rounded-${s}`),
    ],
    theme: {
      colors: {
        primary: colors.indigo,
        secondary: colors.teal,
        accent: colors.pink,
        success: colors.green,
        info: colors.blue,
        warning: colors.yellow,
        error: colors.red,
      },
    },
  }
}

順帶一提,@unocss-ui/preset 不僅用于該組件庫,也可以單獨使用。

只要在你的項目中引用了該 preset,即可以使用 bg-primary-500 這種帶有主題風(fēng)格的顏色 class。

當(dāng)你想覆蓋 UnoCSS UI 默認的主題配置時,也需要引入其并重新覆蓋 theme 即可:

import { defineConfig, presetUno } from 'unocss'
import { colors } from 'unocss/preset-mini'
import { presetUnocssUI } from 'unocss-ui'

export default defineConfig({
  theme: {
    colors: {
      primary: colors.red, // 覆蓋 primary
      secondary: colors.blue, // 覆蓋 secondary
      accent: colors.green, // 覆蓋 accent
    },
  },
  presets: [
    presetUno(),
    presetUnocssUI(), // 引入該 preset
  ],
})

組件庫的開發(fā)與測試

example

example 預(yù)覽地址:https://cherryful.github.io/unocss-ui/

example 這個子項目目前的意義主要在于開發(fā)時的調(diào)試,以及本身作為一個示例項目來展示組件。

只需要通過以下指令運行起來,然后就可以直接修改 @unocss-ui/components 中的源碼,就能進行實時的開發(fā)調(diào)試。

git clone https://github.com/cherryful/unocss-ui
cd unocss-ui
pnpm install

pnpm dev:example

demo

demo 這個子項目是用來測試組件庫打包效果的,當(dāng)你開發(fā)完 @unocss-ui/components 或 @unocss-ui/preset 后可以看看打包后的效果是否正常:

pnpm build:all

pnpm dev:demo

基于 Github Actions 的自動部署

基于 Github Acions 的自動部署非常簡單,主要是參考根目錄下 .github/workflows/deploy.yml 文件。

只需要在 .github/workflows 下建立配置文件,則推送到 Github 會自動觸發(fā)其中的行為。

該組件庫項目比較龐大,如果需要一個簡單點的 Github Actions 示例,可以參考 vue3-template 這個項目。

大部分時候,看懂該項目中的 deploy.yml,其他項目基本復(fù)制過去改改就可以了。

具體知識可參考 Github Actions 官方文檔,或查詢其他博客。

推送 npm 包

由于該項目的推送者是我,因此其他人執(zhí)行推送操作是沒有用的,這里簡單介紹推送 npm 包相關(guān)知識。

1、需要去 https://www.npmjs.com/ 注冊一個 npm 賬號。

2、正常的推送流程就是在某個模塊的根目錄下執(zhí)行以下指令:

  • 項目推送的名稱、版本號、搜索關(guān)鍵字、主頁等信息,都在 package.json 中配置
npm login

# 常規(guī)方法
npm publish 

# pnpm 項目盡量使用 
pnpm publish

因為我們使用了 PNPM 的工作區(qū)的相關(guān)概念,

  • 比如在 package.json 中出現(xiàn) "@unocss-ui/preset": "workspace:*"
  • 需要使用 pnpm publish 在推送時自動更新工作區(qū)的版本號為線上最新版
  • 即在線上會變成 "@unocss-ui/preset": "0.0.1-alpha.3" vevs

詳情參考 PNPM Workspace 文檔

其他生態(tài)

基于 UnoCSS UI 的開源項目

由于目前 unocss-ui 才剛剛起步,因此目前生態(tài)全靠作者及其團隊維護:

unocssui-example:UnoCSS UI 項目中的 example 子項目,動態(tài)調(diào)試 + 文檔

預(yù)覽地址:https://cherryful.github.io/unocss-ui/#/general/getting-started


vue3-template:一個輕量級的 Vue3 啟動模板,自帶 Unocss UI

預(yù)覽地址:https://cherryful.github.io/vue3-template/


rabbit-admin:一個基于 Golang 和 Vue3 的輕量級全棧后臺管理模板

預(yù)覽:
基于原子化思想的 Vue3 組件庫 UnoCSS UI

基于原子化思想的 Vue3 組件庫 UnoCSS UI

基于原子化思想的 Vue3 組件庫 UnoCSS UI

TODO

  • 考慮一種發(fā)展方向:將組件的 JS 部分抽取成 Hook 的模式,可以寫不同的 HTML 適配相同功能的組件庫。
  • 基于 VitePress 生成靜態(tài)的文檔(雖然目前有動態(tài)調(diào)試文檔,當(dāng)時還是需要一個靜態(tài)文檔的)
  • 考慮基于 UnoCSS UI 產(chǎn)出更多開源項目,同時維護升級組件本身

這篇文章想講的東西還有很多(后面還會更新),并且組件庫本身也在快速開發(fā)與迭代中,非常歡迎各位同學(xué)參與建設(shè),學(xué)習(xí)源碼,對我提出意見。

如果覺得本文能幫上你,或者認為這個項目還不錯,歡迎給個 Star。

Github 地址:https://github.com/cherryful/unocss-ui

到了這里,關(guān)于基于原子化思想的 Vue3 組件庫 UnoCSS UI的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Vue項目實戰(zhàn)——【基于 Vue3.x + Vant UI】實現(xiàn)一個多功能記賬本(項目演示、涉及知識點、源碼分享)

    Vue項目實戰(zhàn)——【基于 Vue3.x + Vant UI】實現(xiàn)一個多功能記賬本(項目演示、涉及知識點、源碼分享)

    1、前言 如果你對 vue3.x 的基礎(chǔ)知識還很陌生,推薦先去學(xué)習(xí)一下 vue 基礎(chǔ) 內(nèi)容 參考鏈接 Vue2.x全家桶 Vue2.x全家桶參考鏈接 Vue3.x知識一覽 Vue3.x重點知識參考鏈接 如果你 剛學(xué)完 vue3 , 想檢查一下自己的學(xué)習(xí)成果 如果你 已學(xué)完 vue3 , 想快速回顧復(fù)習(xí)所學(xué)知識 如果你 已精通

    2024年01月18日
    瀏覽(98)
  • 項目實戰(zhàn):《智慧線上購物商城》:基于vue3+vite+vant4組件(一)

    項目實戰(zhàn):《智慧線上購物商城》:基于vue3+vite+vant4組件(一)

    本項目主要是基于vue3和vite以及vant4組件所開發(fā)的移動端購物商城。項目沒有接口,所運用的存儲數(shù)據(jù)為json數(shù)據(jù)通過axios請求,以及Localstorage等技術(shù)實現(xiàn)數(shù)據(jù)。 開發(fā)的模型參考以下的網(wǎng)站,感興趣的小伙伴可以去看看。 AxureShop原型演示 AxureShop原型演示 https://demo.axureshop.com/?

    2024年02月02日
    瀏覽(91)
  • 基于vscode實現(xiàn)vue3項目創(chuàng)建啟動+安裝配置路由vue-router實現(xiàn)單頁面組件切換

    基于vscode實現(xiàn)vue3項目創(chuàng)建啟動+安裝配置路由vue-router實現(xiàn)單頁面組件切換

    訪問https://nodejs.org/en,點擊下載最新版本的nodejs,并安裝。 在項目目錄文件下,通過cmd運行下述指令。 依次輸入下列命令,啟動vue項目 在瀏覽器中加載http://localhost:5173/,頁面加載成功,說明vue項目安裝啟動成功。 建議安裝第三方庫通過vscode中的終端來操作,項目啟動通過

    2024年02月03日
    瀏覽(97)
  • Vue項目實戰(zhàn)——【基于 Vue3.x + Vant UI】實現(xiàn)一個多功能記賬本(登錄注冊頁面,驗證碼)

    Vue項目實戰(zhàn)——【基于 Vue3.x + Vant UI】實現(xiàn)一個多功能記賬本(登錄注冊頁面,驗證碼)

    系列內(nèi)容 參考鏈接 基于 Vue3.x + Vant UI 的多功能記賬本(一) 項目演示,涉及知識點 基于 Vue3.x + Vant UI 的多功能記賬本(二) 搭建開發(fā)環(huán)境 基于 Vue3.x + Vant UI 的多功能記賬本(三) 開發(fā)導(dǎo)航欄及公共部分 項目演示 Vue3 + Vant UI_多功能記賬本 1、登錄注冊頁面 頁面設(shè)計,頁面

    2024年02月03日
    瀏覽(172)
  • Vue項目實戰(zhàn)——【基于 Vue3.x + Vant UI】實現(xiàn)一個多功能記賬本(開發(fā)導(dǎo)航欄及公共部分)

    Vue項目實戰(zhàn)——【基于 Vue3.x + Vant UI】實現(xiàn)一個多功能記賬本(開發(fā)導(dǎo)航欄及公共部分)

    系列內(nèi)容 參考鏈接 基于 Vue3.x + Vant UI 的多功能記賬本(一) 項目演示,涉及知識點 基于 Vue3.x + Vant UI 的多功能記賬本(二) 搭建開發(fā)環(huán)境 Vue3 + Vant UI_多功能記賬本 1、底部導(dǎo)航欄 components 文件夾下,創(chuàng)建 NavBar.vue 組件 NavBar.vue 詳細內(nèi)容請看代碼和注釋 van-tabbar-item 為標(biāo)簽欄

    2024年02月02日
    瀏覽(95)
  • 【vue3】 vue3 幾款值得推薦的UI組件庫

    【vue3】 vue3 幾款值得推薦的UI組件庫

    推薦幾個比較流行的VUE3 UI框架,同時提供出色的開發(fā)人員體驗,合理利用,又或者學(xué)習(xí)借鑒都是不錯的選擇,排名不分先后。 Ant Design Vue 官方網(wǎng)站:https://2x.antdv.com/components/overview/ Ant Design Vue 是一個非常成熟的框架,使用 Ant Design Vue 創(chuàng)建用戶界面非常簡單,這些組件可以適

    2023年04月19日
    瀏覽(17)
  • unocss和tailwindcss css原子引擎

    unocss和tailwindcss css原子引擎

    tailwindcss官網(wǎng) https://tailwindcss.com/docs/grid-column 基本介紹及優(yōu)點分析 Tailwind CSS 中文文檔 - 無需離開您的HTML,即可快速建立現(xiàn)代網(wǎng)站 PostCss 處理 Tailwind Css 基本流程 PostCSS - 是一個用 JavaScript 工具和插件來轉(zhuǎn)換 CSS 代碼的工具 | PostCSS中文網(wǎng) 在 vscode 中,安裝 Tailwind Css 插件,增加

    2024年02月07日
    瀏覽(15)
  • vue3組件二次封裝Ui處理

    vue3組件二次封裝Ui處理

    在Vue開發(fā)中,我們常常需要使用UI框架提供的組件。但是UI框架的組件可能并不符合我們的需求,這時候就需要進行二次封裝。下面是一些關(guān)于Vue組件二次封裝Ui處理的技巧: 子組件代碼: 父組件使用: 如果使用props接收弊端: 基本上組件不會只有一兩個屬性,屬性多的話接

    2023年04月14日
    瀏覽(31)
  • vue3封裝element-ui-plus組件

    vue3封裝element-ui-plus組件

    最近看視頻學(xué)習(xí)封裝公共組件,將學(xué)習(xí)的內(nèi)容記錄以下,方便以后cv。 下面跟未來的自己說: ? ? ? ? 先說思路再放代碼嗷,我怕你以后忘了。要cv直接往最后拉。 思路: ? ? ? ? 其實主要是通過slot去接收父組件傳遞過來的模板。父組件引用了組件件,往里面?zhèn)髁藗€表單,

    2024年02月09日
    瀏覽(16)
  • Vue3 UI組件庫對比,Naive UI、Element Plus、 Ant Design Vue

    Element Plus Naive ui Ant Design Vue 簡介 element-ui Vue3版本,國內(nèi)使用廣泛 Vue作者推薦的Vue3ui 組件庫 阿里Ant Design設(shè)計規(guī)范的Vue實現(xiàn)版 地址 https://github.com/element-plus/element-plus https://github.com/tusen-ai/naive-ui https://github.com/vueComponent/ant-design-vue 社區(qū)活躍度 高 中 高 ui庫組件主要實現(xiàn)方式

    2024年01月25日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包