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 相关文章推荐
不安全的常用的js写法
Sep 15 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
Apr 12 Javascript
JS使用正则表达式除去字符串中重复字符的方法
Nov 05 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
Dec 25 Javascript
node.js插件nodeclipse安装图文教程
Oct 19 Javascript
用原生js统计文本行数的简单示例
Aug 19 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
Nov 16 Javascript
基于jQuery ztree实现表格风格的树状结构
Aug 31 jQuery
vue项目中引入Sass实例方法
Aug 27 Javascript
webpack打包html里面img后src为“[object Module]”问题
Dec 22 Javascript
Nest.js 授权验证的方法示例
Feb 22 Javascript
vue项目打包后路由错误的解决方法
Apr 13 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
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
php实现天干地支计算器示例
2014/03/14 PHP
跟我学Laravel之视图 &amp; Response
2014/10/15 PHP
php实现json编码的方法
2015/07/30 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
原生js实现可爱糖果数字时间特效
2016/12/30 Javascript
jQuery插件FusionCharts实现的3D柱状图效果实例【附demo源码下载】
2017/03/03 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
微信小程序 实现动态显示和隐藏某个控件
2017/04/27 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
2018/05/02 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
python实现的简单FTP上传下载文件实例
2015/06/30 Python
单链表反转python实现代码示例
2018/02/08 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
2019/05/04 Python
python顺序执行多个py文件的方法
2019/06/29 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
python selenium 获取接口数据的实现
2020/12/07 Python
咖啡店自主创业商业计划书
2014/01/22 职场文书
鲜花方阵解说词
2014/02/13 职场文书
2015年社区妇联工作总结
2015/04/21 职场文书
英语投诉信范文
2015/07/03 职场文书
辞职离别感言
2015/08/04 职场文书