在公司项目逐渐多起来的情况下,公共组件也多起来。不想每一次修改一下公共组件,都要去每个项目中修改。这时候你就该学会用Vue CLI3 搭建组件库并用npm发布了,本文以基于element组件中Select 选择器和Tree 树形控件扩展出来的树结构数据下拉选择器的组件为例子讲解。
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组件库项目中有很多无用的文件和代码,需要对其做一次清洁。
1、初始化
"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项目已经搭建成功。2、清洁public文件下的index.html文件
清洁后如下:
复制代码
3、清洁router.js文件
清洁后如下:
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')
},
]
})
复制代码
4、清洁App.vue文件
清洁后如下:
复制代码
5、清洁views文件夹
删除views文件夹中的About.vue和Home.vue文件,
新建home.vue文件.内容如下:
欢迎使用Vue组件库项目
复制代码
6、删除components文件夹
7、清洁完毕
重新执行npm run dev,执行成功后在浏览器打开 http://localhost:8080/ ,页面展示如下图所示,说明Vue项目已经清洁成功。
清洁完毕后,但其还是不满足我们组件库项目开发的要求,需要我们进一步配置。
1、更改src文件夹的名字
在Vue组件库项目中原来src文件夹的内容是demo展示的内容,所以文件名改成examples,比较形象。
2、重新配置项目入口文件
在Vue CLI3中,项目的webpack配置是要在根目录下新建vue.config.js来配置。
在vue.config.js文件中配置内容如下:
module.exports = {
pages: {
index: {
entry: 'examples/main.js',
template: 'public/index.html',
filename: 'index.html',
},
},
}
复制代码
3、在根目录下新建packages文件夹
组件的代码在package文件夹中开发
4、配置文件别名
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'),
}
},
},
}
复制代码
5、关闭source map
关闭source map有两个好处
在vue.config.js文件中配置内容如下:
module.exports = {
productionSourceMap: false,
}
复制代码
6、配置css.extract项
是否将组件中的 CSS 提取至一个独立的 CSS 文件中 (而不是动态注入到 JavaScript 中的 inline 代码),
当作为一个库构建时,要将其设置为 false 免得用户自己导入 CSS。
在vue.config.js文件中配置内容如下:
module.exports = {
css: {
extract: false,
},
}
复制代码
7、暴露默认导出配置
在vue.config.js文件中配置内容如下:
module.exports = {
configureWebpack: {
output: {
libraryExport: 'default'
}
},
}
复制代码
8、配置devServer项
固定端口
port: 8091,
开启热更新
hot: true,
固定打开浏览器
open: 'Google Chrome',
在vue.config.js文件中配置内容如下:
module.exports = {
devServer:{
port: 8091,
hot: true,
open: 'Google Chrome'
}
}
复制代码
1、组件入口文件
我们使用插件时候,一般会做两个步骤
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;
复制代码
2、搭建组件调试环境
1
2
复制代码
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);
复制代码
复制代码
大家注意到
import treeSelect from '@/index';
Vue.use(treeSelect);
复制代码
在home.vue中
这样使用。
我们换成这样引入,也可以正常显示
import myTree from '@/index';
Vue.use(myTree);
复制代码
但是如果我们换成
这样使用,则会报组件未定义的错误。
为什么呢。因为
这样使用,是根据packages/src/js/index.js文件中的name:'treeSelect'
,而不是根据Vue.use(treeSelect)
,所以我们在写组件文档时候,组件标签一定要在文档中体现处理。
组件调试环境搭建完了,开发过程就不详细介绍了。最后会把git仓库地址公布出来,下面介绍一下怎么用npm发布。
如果大家需要详细的开发过程介绍,可以给我留言,看情况写详细开发流程。
1、打包编译命令
在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 构建版本
2、配置主入口文件
在package.json文件中写入:
"main": "lib/tree-select.umd.min.js",
复制代码
3、设置库为公开库
在package.json文件中写入:
"private": false,
复制代码
4、配置关键词、描述、作者
在package.json文件中写入:
"keyword": "tree-select tree select",
"description": "基于element组件中Select 选择器和Tree 树形控件扩展出来的树结构数据下拉选择器",
"author": "pengyh",
复制代码
5、检查组件库名是否已被使用
将package.json文件中"name": "fxft-tree-select"
的fxft-tree-select复制到npm官网上查重。
如果name
值有重复需要修改,否则发布不上去,会提示你是否有权限修改此库。
6、检查组件版本是否重复
对照package.json文件中"version": "0.5.0",
,0.5.0
是否重复版本,如果重复,需要手动更新版本,否则会提示不能在以前发布的版本上发布
7、设置忽略文件,减少依赖包大小
项目中只有编译后的 lib 目录、package.json、README.md才是需要被发布的。我们需要在.npmignore文件中设置:
examples/
packages/
public/
vue.config.js
babel.config.js
复制代码
8、编辑使用文档
在README.md,要写清楚,怎么安装,怎么引入使用,有哪些参数,哪些方法,哪些事件等,这是非常关键的
1、登录到npm
首先需要到 npm 上注册一个账号,注册过程略。
如果配置了淘宝镜像,先设置回npm镜像: 执行命令npm config set registry http://registry.npmjs.org
执行命令npm login
按步骤输入用户名、密码、邮箱,每个步骤回车进入下一步
2、发布到npm
执行命令 npm publish
,如果成功如下图
3、怎么更新同步到cnpm
打开淘宝 NPM 镜像,将组件名fxft-tree-select输入进行搜索 点击下图所示进行同步
npm install fxft-tree-select --save
import treeSelect from '@/index';
Vue.use(treeSelect);
复制代码
在项目这样
这样使用。
以上只是讲解了,单个组件的组件库怎么开发。后续还有多个组件的组件库怎么开发,怎么按需引入及怎么搭建私有的npm库。
项目地址:fxft-tree-select