vue3+vite+npm 搭建組件庫(kù)

使用npm安裝vite腳手架

npm create vite@latest

項(xiàng)目命名xikang,選擇vue+JavaScript,接下來??

cd xikang
npm install
npm run dev

修改相關(guān)文件

修改:./src -> ./examples(對(duì)開發(fā)的組件進(jìn)行測(cè)試)

新增:./packages(該文件夾用于存放開發(fā)的組件)

修改index.html引入的main.js文件的路徑

/src/main.js替換為/examples/main.js

組件開發(fā)

以button組件為例,添加packages/button/src/index.vue

//
<script setup name="XkButton">
import { createApp } from 'vue'
// 1\. 引入你需要的組件 這里用到了vant(npm i vant)
import { Button as VanButton } from 'vant';
// 2\. 引入組件樣式
import 'vant/lib/index.css';
const app = createApp();
app.use(VanButton)
</script>

<template>
  <div> 
    <van-button type="primary">主要按鈕</van-button>
    <van-button type="success">成功按鈕</van-button>
    <van-button type="default">默認(rèn)按鈕</van-button>
    <van-button type="warning">警告按鈕</van-button>
    <van-button type="danger">危險(xiǎn)按鈕</van-button>
    </div>
</template>

<style scoped>
</style>

添加packages/button/index.js (組件導(dǎo)出)

import XkButton from './src/index.vue';

XkButton.install = (App) => {
    App.component(XkButton.__name, XkButton);
    // 因?yàn)閚ame在script標(biāo)簽上,所以獲取名字的形參是__name
};

export default XkButton;

所有組件導(dǎo)出

添加packages\index.js文件,用于導(dǎo)出所有的組件

import XkButton from './button';

//按需引入
export {XkButton };

const components = [XkButton];

const install = (App) => {
    components.forEach((item) => {
        App.component(item.__name, item);
    });
};

export default {
    install,
};

修改配置

// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'

export default defineConfig({
  plugins: [vue()],
  build: {
    outDir: 'lib', // 輸出內(nèi)容到lib文件夾
    lib: {
      entry: resolve(__dirname, 'packages/index.js'), //指定組件編譯入口文件
      name: 'xkVue3Mobile',
      fileName: 'xk-vue3-mobile',
    },//庫(kù)編譯模式配置
    rollupOptions: {
      // 確保外部化處理那些你不想打包進(jìn)庫(kù)的依賴
      external: ['vue', /vant.*/],
      output: {
        // 在 UMD 構(gòu)建模式下為這些外部化的依賴提供一個(gè)全局變量
        globals: {
          vue: 'Vue',
        },
      },
    },// rollup打包配置
  },
});

npm run build,生成lib文件 ,包括:

image.png

上傳npm之前,修改配置package.json文件

{
  "name": "xk-vue3-mobile", // 庫(kù)名
  "private": false,
  "version": "0.0.2", // 每次升級(jí),都要修改版本,不然npm上傳失敗
  "type": "module",
  "files": [
    "lib"
  ],
  "main": "lib/xk-vue3-mobile.umd.js",
  "module": "lib/xk-vue3-mobile.js",
  "exports": {
    "./lib/style.css": "./lib/style.css",
    ".": {
      "import": "./lib/xk-vue3-mobile.js",
      "require": "./lib/xk-vue3-mobile.umd.js"
    }
  },
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "vant": "^4.8.2",
    "vue": "^3.3.11"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^4.5.2",
    "vite": "^5.0.8"
  }
}

如有不需要上傳的文件,在根目錄添加一個(gè).npmignore文件,將不上傳的文件添加即可

.vscode
examples/
packages/
public/
vite.config.js
*.map
*.html
node_modules

上傳npm私有庫(kù)

npm i -g verdaccio
  • 輸入 verdaccio 命令啟動(dòng) verdaccio
verdaccio

在瀏覽器中輸入 http://localhost:4873/ 出現(xiàn)如??頁(yè)面就說明服務(wù)啟動(dòng)成功(不要關(guān)閉verdaccio命令,否則后續(xù)會(huì)失?。?/p>

image.png
  • 登錄npm adduser --registry http://localhost:4873

  • 輸入npm賬號(hào)用戶名、密碼和郵箱,登錄成功后如下:

image.png
  • 進(jìn)入到我們工程根目錄,執(zhí)行npm publish --registry http://localhost:4873/(如出現(xiàn)下圖,則成功)
image.png
image.png

image.png

npm引入

npm set registry http://localhost:4873
npm i xk-vue3-mobile

按需導(dǎo)入

import { createApp } from 'vue'
const app = createApp();
import { XkButton } from 'xk-vue3-mobile';
import 'xk-vue3-mobile/lib/style.css'
app.use(XkButton)

<xk-button></xk-button>

CDN引入

我們將lib文件夾放到我們的根目錄

// 根目錄 index.html
<link rel="stylesheet" href="/lib/style.css" />

按需引入組件

import { Slider, XkButton } from '../lib/xk-vue3-mobile'
<xk-button></xk-button>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容