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 相关文章推荐
HTML Dom与Css控制方法
Oct 25 Javascript
加载 Javascript 最佳实践
Oct 30 Javascript
实现点击列表弹出列表索引的两种方式
Mar 08 Javascript
Jquery实现的角色左右选择特效
May 21 Javascript
JavaScript删除指定子元素代码实例
Jan 13 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
Nov 02 Javascript
谈一谈js中的执行环境及作用域
Mar 30 Javascript
jQuery基于ID调用指定iframe页面内的方法
Jul 06 Javascript
vue使用vue-i18n实现国际化的实现代码
Apr 08 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
Oct 12 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
Feb 10 Javascript
react使用antd表单赋值,用于修改弹框的操作
Oct 29 Javascript
详解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
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
2011/06/16 PHP
PHP 下载文件时自动添加bom头的方法实例
2014/01/10 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
JavaScipt基本教程之JavaScript语言的基础
2008/01/16 Javascript
jquery autocomplete自动完成插件的的使用方法
2010/08/07 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
浅谈jQuery框架Ajax常用选项
2017/07/08 jQuery
小程序实现列表多个批量倒计时
2021/01/29 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
python处理PHP数组文本文件实例
2014/09/18 Python
python实现图片识别汽车功能
2018/11/30 Python
对python3.4 字符串转16进制的实例详解
2019/06/12 Python
pymysql 开启调试模式的实现
2019/09/24 Python
Python使用lambda抛出异常实现方法解析
2020/08/20 Python
.net开发工程师面试题
2014/02/25 面试题
生物技术专业研究生自荐信
2013/09/22 职场文书
自荐信格式简述
2014/01/25 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
党员公开承诺书2015
2015/01/21 职场文书
500字小学生检讨书
2015/02/19 职场文书
检讨书模板大全
2015/05/07 职场文书
500字作文之周记
2019/12/13 职场文书
MySQL触发器的使用
2021/05/24 MySQL