在公司項目逐漸多起來的狀況下,公共組件也多起來。不想每一次修改一下公共組件,都要去每一個項目中修改。這時候你就該學會用Vue CLI3 搭建組件庫並用npm發佈了,本文以基於element組件中Select 選擇器和Tree 樹形控件擴展出來的樹結構數據下拉選擇器的組件爲例子講解。css
npm uninstall vue-cli -g
卸載;npm install -g @vue/cli
安裝Vue CLI3;vue --version
,查看Vue CLI的版本號是不是3.0以上,是表明安裝成功。vue create fxft-tree-select
,fxft-tree-select
爲項目名稱;經過Vue CLI搭建的Vue組件庫項目中有不少無用的文件和代碼,須要對其作一次清潔。html
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build"
},
複製代碼
改爲 "scripts": {
"dev": "vue-cli-service serve",
"build": "vue-cli-service build"
},
複製代碼
由於在Vue CLI2中使用npm run dev
命令啓動項目。npm install
安裝依賴,安裝成功後,執行npm run dev
,執行成功後在瀏覽器打開 http://localhost:8080/ ,頁面展現以下圖所示,說明Vue項目已經搭建成功。清潔後以下:vue
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
</head>
<body>
<div id="app"></div>
</body>
</html>
複製代碼
清潔後以下:webpack
import Vue from 'vue'
import Router from 'vue-router';
Vue.use(Router)
function load(component) {
return resolve => require([`./views/${component}`], resolve);
}
export default new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{
path: '/',
name: 'home',
component: load('home')
},
]
})
複製代碼
清潔後以下:git
<template>
<div>
<router-view/>
</div>
</template>
複製代碼
刪除views文件夾中的About.vue和Home.vue文件,github
新建home.vue文件.內容以下:web
<template>
<div style="text-align:center">
<img alt="Vue logo" src="../assets/logo.png">
<p>歡迎使用Vue組件庫項目</p>
</div>
</template>
複製代碼
從新執行npm run dev,執行成功後在瀏覽器打開 http://localhost:8080/ ,頁面展現以下圖所示,說明Vue項目已經清潔成功。vue-router
清潔完畢後,但其仍是不知足咱們組件庫項目開發的要求,須要咱們進一步配置。vue-cli
在Vue組件庫項目中原來src文件夾的內容是demo展現的內容,因此文件名改爲examples,比較形象。npm
在Vue CLI3中,項目的webpack配置是要在根目錄下新建vue.config.js來配置。
在vue.config.js文件中配置內容以下:
module.exports = {
pages: {
index: {
entry: 'examples/main.js',
template: 'public/index.html',
filename: 'index.html',
},
},
}
複製代碼
組件的代碼在package文件夾中開發
const path = require('path');
function resolve(dir) {
return path.resolve(__dirname, dir)
}
module.exports = {
configureWebpack: {
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'@': resolve('packages'),
'assets': resolve('examples/assets'),
'views': resolve('examples/views'),
}
},
},
}
複製代碼
關閉source map有兩個好處
在vue.config.js文件中配置內容以下:
module.exports = {
productionSourceMap: false,
}
複製代碼
是否將組件中的 CSS 提取至一個獨立的 CSS 文件中 (而不是動態注入到 JavaScript 中的 inline 代碼),
看成爲一個庫構建時,要將其設置爲 false 省得用戶本身導入 CSS。
在vue.config.js文件中配置內容以下:
module.exports = {
css: {
extract: false,
},
}
複製代碼
在vue.config.js文件中配置內容以下:
module.exports = {
configureWebpack: {
output: {
libraryExport: 'default'
}
},
}
複製代碼
固定端口
port: 8091,
開啓熱更新
hot: true,
固定打開瀏覽器
open: 'Google Chrome',
在vue.config.js文件中配置內容以下:
module.exports = {
devServer:{
port: 8091,
hot: true,
open: 'Google Chrome'
}
}
複製代碼
咱們使用插件時候,通常會作兩個步驟
import treeSelect from 'fxft-tree-select';
Vue.use(treeSelect);
複製代碼
那你可知爲何要這麼使用。
Vue.use()
安裝 Vue.js 插件。若是插件是一個對象,必須提供 install 方法。若是插件是一個函數,它會被做爲 install 方法。install 方法調用時,會將 Vue 做爲參數傳入。
該方法須要在調用 new Vue() 以前被調用。
在今天寫的樹下拉選擇器組件是一個對象,因此要提供install的方法,並暴露出來。
install方法
官網這麼介紹:這個方法的第一個參數是 Vue 構造器,第二個參數是一個可選的選項對象。
那麼我在packages文件夾中新建index.js文件中寫入:
import treeSelect from './src/index.vue';
treeSelect.install = function(Vue) {
Vue.component(treeSelect.name, treeSelect);
};
export default treeSelect;
複製代碼
<template>
<el-select v-model="value">
<el-option value="1">1</el-option>
<el-option value="2">2</el-option>
</el-select>
</template>
<script src="./js/index.js"></script>
複製代碼
export default {
name: 'treeSelect',
data(){
return {
value:'',
}
}
}
複製代碼
npm install element-ui --save
import 'element-ui/lib/theme-chalk/index.css';
import { Select, Option, Tree } from 'element-ui';
import treeSelect from '@/index';
Vue.use(Select);
Vue.use(Option);
Vue.use(Tree);
Vue.use(treeSelect);
複製代碼
<template>
<div style="text-align:center">
<img alt="Vue logo" src="../assets/logo.png">
<div>
<tree-select></tree-select>
</div>
</div>
</template>
複製代碼
你們注意到
import treeSelect from '@/index';
Vue.use(treeSelect);
複製代碼
在home.vue中<tree-select></tree-select>
這樣使用。
咱們換成這樣引入,也能夠正常顯示
import myTree from '@/index';
Vue.use(myTree);
複製代碼
可是若是咱們換成<my-tree></my-tree>
這樣使用,則會報組件未定義的錯誤。
爲何呢。由於<tree-select></tree-select>
這樣使用,是根據packages/src/js/index.js文件中的name:'treeSelect'
,而不是根據Vue.use(treeSelect)
,因此咱們在寫組件文檔時候,組件標籤必定要在文檔中體現處理。
組件調試環境搭建完了,開發過程就不詳細介紹了。最後會把git倉庫地址公佈出來,下面介紹一下怎麼用npm發佈。
若是你們須要詳細的開發過程介紹,能夠給我留言,看狀況寫詳細開發流程。
在package.json文件中寫入:
"scripts": {
"dev": "vue-cli-service serve",
"lib": "vue-cli-service build --target lib --name tree-select --dest lib packages/index.js"
},
複製代碼
--target
: 構建目標,默認爲應用模式。這裏修改成 lib 啓用庫模式;--name
: 打包後的文件名;--dest
:輸出目錄,默認 dist
。這裏咱們改爲 lib
;[entry]
:入口文件,默認爲 src/App.vue。這裏咱們指定編譯 packages/index.js
。執行命令npm run lib
後,會發現項目中多了一個文件夾。
lib/tree-select.common.js:一個給打包器用的 CommonJS 包 (不幸的是,webpack 目前還並無支持 ES modules 輸出格式的包)
lib/tree-select.umd.js:一個直接給瀏覽器或 AMD loader 使用的 UMD 包
lib/tree-select.umd.min.js:壓縮後的 UMD 構建版本
在package.json文件中寫入:
"main": "lib/tree-select.umd.min.js",
複製代碼
在package.json文件中寫入:
"private": false,
複製代碼
在package.json文件中寫入:
"keyword": "tree-select tree select",
"description": "基於element組件中Select 選擇器和Tree 樹形控件擴展出來的樹結構數據下拉選擇器",
"author": "pengyh",
複製代碼
將package.json文件中"name": "fxft-tree-select"
的fxft-tree-select複製到npm官網上查重。
若是name
值有重複須要修改,不然發佈不上去,會提示你是否有權限修改此庫。
對照package.json文件中"version": "0.5.0",
,0.5.0
是否重複版本,若是重複,須要手動更新版本,不然會提示不能在之前發佈的版本上發佈
項目中只有編譯後的 lib 目錄、package.json、README.md纔是須要被髮布的。咱們須要在.npmignore文件中設置:
examples/
packages/
public/
vue.config.js
babel.config.js
複製代碼
在README.md,要寫清楚,怎麼安裝,怎麼引入使用,有哪些參數,哪些方法,哪些事件等,這是很是關鍵的
首先須要到 npm 上註冊一個帳號,註冊過程略。
若是配置了淘寶鏡像,先設置回npm鏡像: 執行命令npm config set registry http://registry.npmjs.org
執行命令npm login
按步驟輸入用戶名、密碼、郵箱,每一個步驟回車進入下一步
執行命令 npm publish
,若是成功以下圖
打開淘寶 NPM 鏡像,將組件名fxft-tree-select輸入進行搜索 點擊下圖所示進行同步
npm install fxft-tree-select --save
import treeSelect from '@/index';
Vue.use(treeSelect);
複製代碼
在項目這樣<tree-select></tree-select>
這樣使用。
以上只是講解了,單個組件的組件庫怎麼開發。後續還有多個組件的組件庫怎麼開發,怎麼按需引入及怎麼搭建私有的npm庫。
項目地址:fxft-tree-select