【vue組件庫搭建06】組件庫構建及npm發包

一、格式化目錄結構

根據以下圖片搭建組件庫目錄

index.js作為入口文件,將所有組件引入,并注冊組件名稱

import { EButton } from "./Button";
export * from "./Button";
import { ECard } from "./Card";
export * from "./Card";const cmpts = [EButton, ECard];const EricUI = {install(Vue) {cmpts.forEach(cmpt => {Vue.component(cmpt.name, cmpt);});},
};export default EricUI;

utils.js:給組件綁定注冊方法

export function withInstall(component) {component.install = app => {app.component(component.name, component);};return component;
}

在main.js中引入,方便后續使用

import { createApp } from "vue";
import "./style.css";
import App from "./App.vue";import Antd from "ant-design-vue";
import "ant-design-vue/dist/antd.less";import EricUI from "../components";const app = createApp(App).use(Antd).use(EricUI).mount("#app");

在docs\.vitepress\theme\index.ts同樣引入

// https://vitepress.dev/guide/custom-theme
import { h } from 'vue'
import type { Theme } from 'vitepress'
import DefaultTheme from 'vitepress/theme'import Antd from 'ant-design-vue';
import './antd-overwrite.less'import { AntDesignContainer } from '@vitepress-demo-preview/component'
import '@vitepress-demo-preview/component/dist/style.css'import './style.css'import HomeImage from './HomeImage.vue'
import EricUI from "../../../components";export default {extends: DefaultTheme,Layout: () => {return h(DefaultTheme.Layout, null, {// https://vitepress.dev/guide/extending-default-theme#layout-slots'home-hero-image': () => h(HomeImage)})},enhanceApp({ app, router, siteData }) {app.use(Antd)app.use(EricUI)app.component('demo-preview', AntDesignContainer)}
} satisfies Theme

到此為止,組件庫開發的組件可以在docs中展示:

EButton是我們開發的button組件,在Button.md中引入

?效果:

二、組件庫構建

?新建build文件夾,以及以下三個文件:

// base.confi.jsimport { fileURLToPath, URL } from "node:url";
import { defineConfig } from "vite";// 文檔: https://vitejs.dev/config/
export default defineConfig({minify: false,css: {preprocessorOptions: {less: {javascriptEnabled: true,modifyVars: {"ant-prefix": "ant",},},},},plugins: [],resolve: {alias: {"@": fileURLToPath(new URL("../src", import.meta.url)),},},
});
// lib.config.jsimport { defineConfig } from "vite";
import { fileURLToPath, URL } from "node:url";
import vue from "@vitejs/plugin-vue";
import lessEntry from "./vite-plugin-less-entry";
import baseConfig from "./base.config";
import vueJsx from "@vitejs/plugin-vue-jsx";
import { viteStaticCopy } from "vite-plugin-static-copy";export default defineConfig({...baseConfig,build: {sourcemap: true,outDir: "lib",lib: {entry: fileURLToPath(new URL("../components/index.js", import.meta.url)),name: "EricUI",fileName: format => `eric-ui.${format}.js`,},rollupOptions: {// 確保外部化處理那些你不想打包進庫的依賴external: ["vue","@ant-design/icons-vue","vxe-table","xe-utils","@vitepress-demo-preview/component","@vitepress-demo-preview/plugin",],},},plugins: [vue(),vueJsx(),viteStaticCopy({targets: [{src: "components/**/*.less",dest: "/",},],structured: true,}),lessEntry({// 生成的入口文件名entry: "components",// libPath需要與viteStaticCopy中的dest保持一致libPath: "components",name: "style",}),],
});
// vite-plugin-less-entry.jsimport path from "node:path";
import fs from "fs-extra";const name = "vite-plugin-custom-less-entry";
export const formatConsole = msg => `[${name}] ${msg}`;
/*** 生成項目less的入口文件*/
export default function lessEntryPlugin({ entry, libPath, name }) {let outputed = false;let rootConfig = null;return {name,apply: "build",order: "post",configResolved(config) {rootConfig = config;},writeBundle() {if (outputed) {return;}outputed = true;// 遍歷entry下的index.less文件,生成${name}.less文件const componentsPath = path.join(rootConfig.root, entry);let componentsLessContent = "";fs.readdir(componentsPath, (err, files) => {files.forEach(file => {if (fs.existsSync(path.join(componentsPath, file, "index.less"))) {componentsLessContent += `@import "./${libPath}/${path.posix.join(file,"index.less")}";\n`;}});const lessEntryFile = path.join(rootConfig.root,rootConfig.build.outDir,`${name}.less`);fs.outputFile(lessEntryFile, componentsLessContent, err => {if (err) {console.error(formatConsole("Failed to generate less entry file"));} else {console.info(formatConsole("Successfully generated less entry file"));}});});},};
}

配置package.json:

{"name": "eric-ui-lib","version": "0.0.2","description": "eric-ui組件庫","main": "lib/eric-ui.umd.js","module": "lib/eric-ui.es.js","files": ["lib"],"keywords": ["eric-ui","eric","ui"],"author": "Eric","type": "module","scripts": {"dev": "vite","build": "vite build","build:lib": "vite build --config ./build/lib.config.js","preview": "vite preview","docs:dev": "vitepress dev docs","docs:build": "vitepress build docs","docs:preview": "vitepress preview docs"},"dependencies": {"@vitepress-demo-preview/component": "^2.3.2","@vitepress-demo-preview/plugin": "^1.2.3","ant-design-vue": "^3.2.20","fs-extra": "^11.2.0","less-loader": "^12.2.0","vite-plugin-static-copy": "^1.0.6","vue": "^3.4.29"},"devDependencies": {"@vitejs/plugin-vue": "^5.0.5","@vitejs/plugin-vue-jsx": "^4.0.0","less": "^4.2.0","vite": "^5.3.1","vitepress": "^1.2.3"}
}

三、npm發布

npm login 登錄,沒有注冊的自行注冊

npm publish

查看npm,即發布成功?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42674.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42674.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42674.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一、MyBatis

一、MyBatis 1、MyBatis簡介 1.1、MyBatis歷史 MyBatis最初是Apache的一個開源項目iBatis, 2010年6月這個項目由Apache Software Foundation遷移到了Google Code。隨著開發團隊轉投Google Code旗下, iBatis3.x正式更名為MyBatis。代碼于2013年11月遷移到Github。…

計算機網絡之無線局域網

1.無線局域網工作方式 工作方式:每臺PC機上有一個無線收發機(無線網卡), 它能夠向網絡上的其他PC機發送和接受無線電信號。 與有線以太網相似,無線局域網也是打包方式發送數據的。每塊網卡都有一個永久的、唯一的ID號…

Unity2D - 基本戰斗系統(Battle System Design)

1. 攻擊邏輯 在Entity中初始化兩個變量,因為在每個角色幾乎都擁有攻擊狀態。這兩個變量分別是transform類,接收一個坐標和一個半徑畫一個圓作為攻擊的判定范圍 public Transform attackCheck; public float attackCheckRadius; 為了可視化攻擊范圍&am…

Python的多態

在 Python 中,多態(Polymorphism)是指不同的對象可以對相同的消息(方法調用)做出不同的響應。 簡單來說,多態允許使用一個統一的接口來操作不同類型的對象,而這些對象會根據自身的類型來執行相應…

某水利集團晉升體系優化項目成功案例紀實

——通過多元化職業晉升通道,激發員工潛力 【客戶行業】水務行業;水利處理 【問題類型】晉升體系優化;人才管理系統 【客戶背景】 某水利處理集團是國內領先的綜合性水資源管理與水務服務供應商。該集團專注于提供包括原水供應、自來水生…

基于ROS的智能網聯車遠程交互軟件,全UI無需記憶指令,劍指核心原理。

基于ROS的智能網聯車遠程交互軟件,全UI無需記憶指令,劍指核心原理。 服務于中汽恒泰,偉大的項目,希望看官點贊,謝謝~~ 進程(節點)列表化,參數面板化,實現快速機器人配置…

Linux--V4L2攝像頭驅動框架及UVC淺析

一、前言 對于一個usb攝像頭,它的內核驅動源碼位于/drivers/media/usb/uvc/ 核心層:V4L2_dev.c文件 硬件相關層: uvc_driver.c文件 本篇記錄基于對6.8.8.8內核下vivid-core.c文件(虛擬視頻驅動程序)的分析&#xff…

推薦系統中Prior Belief的概念(附代碼)

在推薦系統中,先驗信念(prior belief)是指在沒有觀察到實際數據之前,我們對某些參數或變量的初始假設或預期。這種先驗信念可以幫助模型在數據稀疏或噪聲較多的情況下做出更好的預測。 先驗信念(Prior Belief&#xf…

獨立站運營招聘:尋找璀璨之星,開啟運營之旅

尊敬的各位同仁,我乃大家熟知的獨立站長,對于運營獨立站點始終保持著滿腔熱情。今日,我欲與諸位共同探討一熱門議題—獨立站運營招聘。此次招聘不再僅為職位爭奪,更為尋找璀璨之星的探險之旅。 獨立站的靈魂:什么是獨…

Mysql中視圖的使用以及常見運算符的使用示例和優先級

場景 基礎知識回顧:mysql中視圖的基礎使用以及常見運算符的使用示例。 注: 博客:霸道流氓氣質-CSDN博客 實現 Mysql中視圖的使用 視圖的創建 CREATE VIEW stu_view AS SELECT * FROM bus_student; 視圖查詢 SELECT * FROM stu_view;…

澳大利亞媒體發稿:怎樣用圖表提高易讀性?-華媒舍

媒體發稿的可讀性變得尤為重要。讀者們不會再有時間與耐心去閱讀文章繁瑣的文本,他們更喜歡簡潔明了的信息展現形式,在其中圖表是一種極為高效的專用工具。下面我們就詳細介紹怎么使用圖表提高澳大利亞新聞媒體發稿的可讀性,以適應讀者的需要…

java 柵欄(CyclicBarrier)

Java中的柵欄(CyclicBarrier)是一種用于協調多個線程并發工作的同步輔助類。與CountDownLatch不同,CyclicBarrier允許一組線程相互等待,直到所有線程都到達一個共同的屏障點(barrier)后,才繼續執…

CSS 【詳解】樣式選擇器(含ID、類、標簽、通配、屬性、偽類、偽元素、Content屬性、子代、后代、兄弟、相鄰兄弟、交集、并集等選擇器)

CSS 樣式選擇器&#xff0c;用于選中頁面中的 html 元素&#xff0c;以便添加 CSS 樣式。 按渲染性能由高到低 依次是&#xff1a; ID 選擇器 #id 通過元素的 id 屬性選中元素&#xff0c;區分大小寫 <p id"p1" >第一段</p>#p1{color: red; }但不推薦使…

【LinuxC語言】手撕Http之處理POST請求

文章目錄 前言聲明POST的組成讀取POST信息讀取消息體長度讀取消息體解析消息體How to use?總結前言 在互聯網的世界中,HTTP協議無疑是最重要的協議之一。它是Web的基礎,支持著我們日常生活中的大部分在線活動。盡管有許多現成的庫可以處理HTTP請求,但了解其底層工作原理是…

全面解析:兒童編程等級考試及其區別

目錄 1. 前言2. 兒童編程等級考試的重要性3. 兒童編程等級考試的特點4. 兒童編程等級考試4.1 非專業級軟件能力認證(CSP-J/S)4.2 GESP編程能力等級認證4.3 青少年編程能力等級測試(CPA)4.4 全國青少年軟件編程等級考試4.5 全國青少年編程能力等級考試(PAAT)1. 前言 近年來…

【學習筆記】Mybatis-Plus(四):MP中內置的插件

內置插件 目前MP已經存在的內部插件包括如下&#xff1a; 插件類名作用PaginationInnerInterceptor分頁插件。可以代替以前的PageHelperOptimisticLockerInnerInterceptor樂觀鎖插件。用于冪等性操作&#xff0c;采用版本更新記錄DynamicTableNameInnerInterceptor動態表名Te…

【Rust】Cargo介紹

一、Cargo簡介 Cargo 是Rust語言的包管理工具&#xff0c;它幫助我們管理我們項目的依賴。做js開發的同學應該了解nodejs的包管理工具npm&#xff0c;Cargo和npm做的事情是一樣的。C和C的同學可能對這個就比較陌生了&#xff0c;C/C語言沒有統一的依賴管理工具&#xff0c;各個…

Spring中常見知識點及使用

Spring Framework 是 Java 生態系統中最流行的開源框架之一&#xff0c;它提供了一系列強大的功能&#xff0c;用于構建企業級應用。以下是一些常見的 Spring 知識點及其使用方法&#xff1a; 1. 依賴注入&#xff08;Dependency Injection&#xff09; 依賴注入是 Spring 的…

【SpringCloud應用框架】Nacos集群架構說明

第六章 Spring Cloud Alibaba Nacos之集群架構說明 文章目錄 前言一、Nacos支持三種部署模式二、集群部署說明三、預備環境 前言 到目前為止&#xff0c;已經完成了對Nacos的一些基本使用和配置&#xff0c;接下來還需要了解一個非常重要的點&#xff0c;就是Nacos的集群相關的…

【芯片制造】【問題整理】明場檢測和暗場檢測

背景&#xff1a; 什么是明場檢測和暗場檢測 主要功能&#xff1a; 1、在明場檢測中&#xff0c;光源直接照射到樣品表面&#xff0c;透射光或反射光被收集并成像。樣品上的顆粒、劃痕、凹坑會改變光的反射和透射&#xff0c;形成對比&#xff0c;能夠快速掃描大面積樣品。 2、…