Vue cli3 库模式搭建组件库并发布到 npm的流程


Posted in Javascript onOctober 12, 2018

市面上目前已有各种各样的UI组件库,比如 Element 和 iView ,他们的强大毋庸置疑。但是我们面临的情况是需求越来越复杂,当它们不能再满足我们需求的时候,这个时候就有必要开发一套属于自己团队的组件库了。

所以本文的目的就是让读者能通过此文,小能做一个简单的插件供人使用,大能架构和维护一个组件库不在话下。

以下一个简单的颜色选择器插件 vColorPicker 讲述从开发到上线到npm的流程。

vColorPicker 插件 DEMO

一、技术栈

如何通过新版脚手架创建项目,这里就不提了,自行看官方文档。

  • Vue-cli3: 新版脚手架的库模式,可以让我们很轻松的创建打包一个库
  • npm:组件库将存放在npm
  • webpack:修改配置需要一点 webapck 的知识。

二、大纲

想要搭建一个组件库,我们必须先要有一个大概的思路。

  1. 规划目录结构
  2. 配置项目以支持目录结构
  3. 编写组件
  4. 编写示例
  5. 配置使用库模式打包编译
  6. 发布到npm

三、规划目录结构

1、创建项目

在指定目录中使用命令创建一个默认的项目,或者根据自己需要自己选择。

$ vue create .

2、调整目录

我们需要一个目录存放组件,一个目录存放示例,按照以下方式对目录进行改造。

.
...
|-- examples // 原 src 目录,改成 examples 用作示例展示
|-- packages // 新增 packages 用于编写存放组件
...
.

Vue cli3 库模式搭建组件库并发布到 npm的流程

四、配置项目以支持新的目录结构

我们通过上一步的目录改造后,会遇到两个问题。

  1. src 目录更名为 examples ,导致项目无法运行
  2. 新增 packages 目录,该目录未加入 webpack 编译

注:cli3 提供一个可选的 vue.config.js 配置文件。如果这个文件存在则他会被自动加载,所有的对项目和webpack的配置,都在这个文件中。

1、重新配置入口,修改配置中的 pages 选项

新版 Vue CLI 支持使用 vue.config.js 中的 pages 选项构建一个多页面的应用。

这里使用 pages 修改入口到 examples

module.exports = {
 // 修改 src 目录 为 examples 目录
 pages: {
 index: {
 entry: 'examples/main.js',
 template: 'public/index.html',
 filename: 'index.html'
 }
 }
}

2、支持对 packages 目录的处理,修改配置中的 chainWebpack 选项

packages 是我们新增的一个目录,默认是不被 webpack 处理的,所以需要添加配置对该目录的支持。

chainWebpack 是一个函数,会接收一个基于 webpack-chain 的 ChainableConfig 实例。允许对内部的 webpack 配置进行更细粒度的修改。

module.exports = {
 // 修改 src 为 examples
 pages: {
 index: {
 entry: 'examples/main.js',
 template: 'public/index.html',
 filename: 'index.html'
 }
 },
 // 扩展 webpack 配置,使 packages 加入编译
 chainWebpack: config => {
 config.module
 .rule('js')
 .include
 .add('packages')
 .end()
 .use('babel')
 .loader('babel-loader')
 .tap(options => {
  // 修改它的选项...
  return options
 })
 }
}

链式操作

webpack-chain

五、编写组件

以上我们已配置好对新目录架构的支持,接下来我们尝试编写组件。以下我们以一个已发布到 npm 的小插件作为示例。

GitHub - 颜色选择器:vcolorpicker

1. 创建一个新组件

  1. 在 packages 目录下,所有的单个组件都以文件夹的形式存储,所有这里创建一个目录 color-picker/
  2. 在 color-picker/ 目录下创建 src/ 目录存储组件源码
  3. 在 /color-picker 目录下创建 index.js 文件对外提供对组件的引用。

Vue cli3 库模式搭建组件库并发布到 npm的流程

修改 /packages/color-picker/index.js 文件,对外提供引用。

# /packages/color-picker/index.js
// 导入组件,组件必须声明 name
import colorPicker from './src/color-picker.vue'
// 为组件提供 install 安装方法,供按需引入
colorPicker = function (Vue) {
 Vue.component(colorPicker.name, colorPicker)
}
// 默认导出组件
export default colorPicker

2. 整合所有的组件,对外导出,即一个完整的组件库

修改 /packages/index.js 文件,对整个组件库进行导出。

// 导入颜色选择器组件
import colorPicker from './color-picker'
// 存储组件列表
const components = [
 colorPicker
]
// 定义 install 方法,接收 Vue 作为参数。如果使用 use 注册插件,则所有的组件都将被注册
const install = function (Vue) {
 // 判断是否安装
 if (install.installed) return
 // 遍历注册全局组件
 components.map(component => Vue.component(component.name, component))
}
// 判断是否是直接引入文件
if (typeof window !== 'undefined' && window.Vue) {
 install(window.Vue)
}
export default {
 // 导出的对象必须具有 install,才能被 Vue.use() 方法安装
 install,
 // 以下是具体的组件列表
 colorPicker
}

六、编写示例

1、在示例中导入组件库

import Vue from 'vue'
import App from './App.vue'
// 导入组件库
import ColorPicker from './../packages/index'
// 注册组件库
Vue.use(ColorPicker)
Vue.config.productionTip = false
new Vue({
 render: h => h(App)
}).$mount('#app')

2、在示例中使用组件库中的组件

在上一步用使用 Vue.use() 全局注册后,即可在任意页面直接使用了,而不需另外引入。当然也可以按需引入。

<template>
 <colorPicker v-model="color" v-on:change="headleChangeColor"></colorPicker>
</template>

<script>
export default {
 data () {
 return {
 color: '#ff0000'
 }
 },
 methods: {
 headleChangeColor () {
 console.log('颜色改变')
 }
 }
}
</script>

七、发布到 npm,方便直接在项目中引用

到此为止我们一个完整的组件库已经开发完成了,接下来就是发布到 npm 以供后期使用。

1、 package.js 中新增一条编译为库的命令

在库模式中,Vue是外置的,这意味着即使在代码中引入了 Vue,打包后的文件也是不包含Vue的。

Vue Cli3 构建目标:库

以下我们在 scripts 中新增一条命令 npm run lib

  • --target : 构建目标,默认为应用模式。这里修改为 lib 启用库模式。
  • --dest : 输出目录,默认 dist 。这里我们改成 lib
  • [entry] : 最后一个参数为入口文件,默认为 src/App.vue 。这里我们指定编译 packages/ 组件库目录。
"script": {
 // ...
 "lib": "vue-cli-service build --target lib --name vcolorpicker --dest lib packages/index.js"
}

执行编译库命令

$ npm run lib

Vue cli3 库模式搭建组件库并发布到 npm的流程

2、配置 package.json 文件中发布到 npm 的字段

name
version
description
main
keyword
author
private
license

以下为参考设置

{
 "name": "vcolorpicker",
 "version": "0.1.5",
 "description": "基于 Vue 的颜色选择器",
 "main": "lib/vcolorpicker.umd.min.js",
 "keyword": "vcolorpicker colorpicker color-picker",
 "private": false
 }

3、添加 .npmignore 文件,设置忽略发布文件

我们发布到 npm 中,只有编译后的 lib 目录、package.json、README.md才是需要被发布的。所以我们需要设置忽略目录和文件。

和 .gitignore 的语法一样,具体需要提交什么文件,看各自的实际情况。

# 忽略目录
examples/
packages/
public/

# 忽略指定文件
vue.config.js
babel.config.js
*.map

4、登录到 npm

首先需要到 npm 上注册一个账号,注册过程略。

如果配置了淘宝镜像,先设置回npm镜像:

$ npm config set registry http://registry.npmjs.org

然后在终端执行登录命令,输入用户名、密码、邮箱即可登录。

$ npm login

Vue cli3 库模式搭建组件库并发布到 npm的流程

5、发布到 npm

执行发布命令,发布组件到 npm

$ npm publish

Vue cli3 库模式搭建组件库并发布到 npm的流程

6、发布成功

发布成功后稍等几分钟,即可在 npm 官网搜索到。以下是刚提交的 vcolorpicker

Vue cli3 库模式搭建组件库并发布到 npm的流程

总结

以上所述是小编给大家介绍的Vue cli3 库模式搭建组件库并发布到 npm,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript 回调函数详解
Nov 11 Javascript
js限制文本框只能输入整数或者带小数点的数字
Apr 27 Javascript
js实现三张图(文)片一起切换的banner焦点图
Aug 25 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
Jan 14 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
Jun 13 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
Jan 19 Javascript
jquery Ajax实现Select动态添加数据
Jun 08 jQuery
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
Aug 29 Javascript
Vue官方文档梳理之全局配置
Nov 22 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
Jan 03 Javascript
深入理解Puppeteer的入门教程和实践
Mar 05 Javascript
使用vue判断当前环境是安卓还是IOS
Apr 12 Vue.js
详解vue服务端渲染浏览器端缓存(keep-alive)
Oct 12 #Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
Oct 12 #Javascript
在JS循环中使用async/await的方法
Oct 12 #Javascript
代码实例ajax实现点击加载更多数据图片
Oct 12 #Javascript
vue项目环境变量配置的实现方法
Oct 12 #Javascript
原生JS实现自定义下拉单选选择框功能
Oct 12 #Javascript
原生JS实现轮播图效果
Oct 12 #Javascript
You might like
文件上传类
2006/10/09 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
JavaScript toUpperCase()方法使用详解
2016/08/26 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
解决layui表格内文本超出隐藏的问题
2019/09/12 Javascript
Django内容增加富文本功能的实例
2017/10/17 Python
python3+PyQt5实现柱状图
2018/04/24 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
大专生自荐信
2013/10/04 职场文书
电焊工岗位职责
2014/03/06 职场文书
党的生日演讲稿
2014/09/10 职场文书
事业单位考察材料范文
2014/12/25 职场文书
2015年招商引资工作总结
2015/04/25 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
网聊搭讪开场白
2015/05/28 职场文书
地球上的星星观后感
2015/06/02 职场文书
2019个人半年工作总结
2019/06/21 职场文书
六年级情感作文之500字
2019/10/23 职场文书
导游词之山海关
2019/12/10 职场文书
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android
小程序自定义轮播图圆点组件
2022/06/25 Javascript