基于vue-cli3創(chuàng)建libs庫的實現方法
前言:當我寫這篇博客之前我想過這些問題,是否你也被困擾過呢?
1:當你有自己覺得寫的好的組件,是不是有一種想存下來,方便下一次使用的情況?
2:是不是大多數時候都是使用cv大法?from "a" to "b" to “c” to anyWhere.....
3:是不是你的的組件跟你npm install下來的有很大區(qū)別?
4:是不是想定義一套規(guī)則來管理公司項目的組件?(當然前提你得是,,,,大佬)
一:創(chuàng)建默認項目
使用 vue create xxx 創(chuàng)建一個默認項目

二:修改原始目錄結構
創(chuàng)建的默認目錄如下,我們需要將原本的src目錄改為examples,然后創(chuàng)建packages目錄來編寫自己的組件庫文件,(其實目錄命名你開心就好,,)


好了,接下來劃重點!
三:配置example & packages
到這里你可能發(fā)現了,項目無法跑起來了,因為我們沒有了原始默認的入口文件
在根目錄下創(chuàng)建vue.config.js配置文件(vue-cli3的配置文件,在這里的配置會覆蓋腳手架webpack默認的配置項)。
//不熟悉配置的可官網查看 https://cli.vuejs.org/zh/config/#pages
module.exports = {
pages: {
index: {
entry: 'examples/main.js',
template: 'public/index.html',
filename: 'index.html'
}
}
}
進入packages目錄創(chuàng)建一個組件目錄(HelloWorld),一個index文件(用來暴露所有的組件),然后在組件目錄新建index(暴露出當前組件)文件與src組件源碼。
在HelloWorld下面的index中引入組件。
import HelloWord from './src/HelloWorld.vue';
HelloWord.install = (Vue)=>{
Vue.components(HelloWord.name,HelloWord)
}
export default HelloWord;
在packages目錄下面的index中引入所有的組件并注冊。
import HelloWorld from './HelloWorld';
// 將引入的組件模塊存儲,方便循環(huán)注冊所有組件
const components = [ HelloWorld ];
const install = (Vue,options)=>{
if (install.installed) return;
install.installed = true
console.log(options)
components.forEach(component => {
Vue.component(component.name, component)
})
}
// 如果是直接引入的
if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue)
}
export default {
// 使用Vue.use必須具有install方法
// https://cn.vuejs.org/v2/api/#Vue-use
install,
// 同時導出組件列表
...components
}
在examples中的入口文件main.js引入注冊的全局組件。
//main.js
...
import libs from "../packages"
...
Vue.use(libs,{a:'test'})
到現在項目基本已經跑起來了,在項目中可以直接調用組件了,無需在components里注冊,平時開發(fā)中你的全局組件也可以這樣來注冊使用。
四:組件打包
vue-cli3中提供了構建一個庫的方法 ,默認是構建應用,這個方法提供的幾個配置項主要有以下幾個
target: 改為 lib 可啟用構建庫模式;
name: 構建庫輸出的文件名;
dest: 構建的輸出目錄,默認為 dist;
entry: 入口文件路徑;
vue-cli-service build --target lib --name myLib --dest libs [entry]
所以需要在項目的package.json文件中添加一條上面的執(zhí)行腳本
"scripts": {
"lib": "vue-cli-service build --target lib --name common --dest lib packages/index.js"
}
vue-cli3的默認配置是只對src目錄下的文件進行編譯的,所有這里我們還需要在vue.config.js文件中將packages文件夾也加入loader編譯的配置(后測試可不加)。
chainWebpack:(config)=>{
config.module
.rule('js')
.include
.add('/packages/')
.end()
.use('babel')
.loader('babel-loader')
.tap(options=>{
//TODO
return options
})
}
然后執(zhí)行npm run lib會在跟目錄下生成lib文件夾,lib會生成三種形式的文件(commonjs,umd,umd-min)

五:發(fā)布npm
有了上面的四步,基本上開發(fā)階段算是完成了,接下來就是如何讓你的庫有一個存儲的地方,方便下一次的復用,首先你應該想到了 npm ,這個node包管理庫。
一個基礎的npm包,你首先需要知道package.json中這些配置的作用
name -----> 包的名稱,必須唯一,不能跟已有的npm包重名,否則發(fā)布不上去;
version -----> 包的版本,當你需要迭代版本時,必須修改這個值(可手動修改,可運行以下命令修改);
$ npm version patch 會增加小版本 1.0.1:屬于小修改,不更改功能使用 $ npm version minor 會增加二級 1.1.0:可能添加了一些功能,不影響以前的使用。 $ npm version major 會增加大版本 2.0.0:可能改了API,輸入大范圍的修改。
main -----> 包的入口,當你使用import xx from 'xxxx'的時候默認引入的就是main文件;
private -----> 是否為私有包,如果傳到npm上必須改為false;
license ----->開源協議
author ------>作者 <可選>
description ----->包的描述 <可選>
keyworlds ----->關鍵字 <可選>
repository ----->包存放的倉庫地址
....... 還有很多配置項可自己查詢配置項;
跟據上面的選項,最終配置出的結果如下
{
"name":"vue-libs-demo",
"version":"0.1.0",
"author":{
"name":"mrlwc",
"email":"845822761@qq.com"
},
"private":false,
"license":"MIT",
"description":"test vue lib",
"keyWorlds":["test","vue","libs"],
"main":"lib/common.umd.min.js"
}
npm 的發(fā)布也有需要忽略的敏感信息文件,所以需要添加.npmignore文件,排除開發(fā)環(huán)境下的文件內容
# dir examples/ packages/ public/ node_modules/ # Log filesnpm-debug.log* yarn-debug.log* yarn-error.log* vue.config.js babel.config.js *.map # Editor directories and files .DS_Store .idea .vscode *.suo *.ntvs* *.njsproj *.sln *.sw? .prettierrc
配置完后,就可以發(fā)布了,首先使用 npm login 一步步輸入賬號,密碼,郵箱(如果沒有賬號的直接去官網注冊即可),然后運行 npm publish ,如果失敗也許是包重名。
現在你的組件包已經發(fā)布成功了,在其他項目中使用 npm install vue-libs-demo 后在入口文件 Vue.use(xxx) 即可使用所有的組件。
六:發(fā)布git倉庫
你是否想過,公司的代碼或者組件庫放到公開平臺是不是有點不妥?畢竟這是公司賴以生存的寶貝不是?所以一般公司都會有自己的私有服務器,然后在上面搭建gitLab等一系列管理方式,所以公共組件庫同樣可以保存到這些倉庫中。然后修改依賴安裝路勁來下載這些公用組件。
下面我就用gitee這個平臺來進行操作
首先去gitee去建立一個空的倉庫;
將自己的項目推送到倉庫中;
$ git remote add <repository path> $ git push -u origin master
然后在自己的新項目中按下面的方式引入依賴后執(zhí)行npm install

好了到這里基本上就結束了?。ㄈ绻懈玫慕鉀Q方案,或者發(fā)現什么錯誤的地方,可留言共同學習)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
關于iview和elementUI組件樣式覆蓋無效問題及解決
這篇文章主要介紹了關于iview和elementUI組件樣式覆蓋無效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09

