Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从零到一教你基于vue开发一个组件库

从零到一教你基于vue开发一个组件库

作者头像
歪马
发布于 2020-05-21 09:09:36
发布于 2020-05-21 09:09:36
80800
代码可运行
举报
文章被收录于专栏:歪码行空歪码行空
运行总次数:0
代码可运行

前言

Vue是一套用于构建用户界面的渐进式框架,目前有越来越多的开发者在学习和使用.在笔者写完 从0到1教你搭建前端团队的组件系统 之后很多朋友希望了解一下如何搭建基于vue的组件系统,所以作为这篇文章的补充,本文来总结一下如何搭建基于vue的组件库.

虽然笔者有近2年没有从事vue的开发了,但平时一直在关注vue的更新和发展, 笔者一直认为技术团队的组件化之路重点在于基础架构的搭建以及组件化的设计思想,我们完全可以采用不同的框架实现类似的设计,所以透过现象看本质,思想才是最重要的.本文主要教大家通过使用vue-cli3 一步步搭建一个组件库并发布到npm上,但笔者认为重点不在于实现搭建组件库的具体方式,而在于设计组件库的思想和取舍.

你将收获

  • 使用vue-cli3搭建团队的组件库并发布到npm
  • npm发包的常用基础知识

相关资料

正文

本文假设大家对vue有一定的了解,并熟悉vue-cli3的配置.首先我们在搭建组件库的时候,一定要清楚是否有必要搭建,如果项目是一次性的或者不同项目中不存在可复用的组件,那么搭建组件库是没有必要的,反之如果团队存在多个不同的项目都会使用一致的组件设计规范,那么搭建组件库无疑是不二选择.接下来我们直接开始实现组件库的搭建.

1.安装vue-cli3并创建一个项目

首先我们先安装开发必要的工具集,并创建一个项目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn global add @vue/cli
// 创建项目
vue create vui

我们安装完依赖并进入项目启动服务后vue-cli3会自动给我们展示一个默认页面,关于vue的组件库目录结构,笔者参考element的来组织,大家也可以按照自己团队的风格来设计.首先我们看看原来的目录结构:

我们做如下调整:

我们将src重命名为examples, 并添加packages目录,用来存放我们的自定义组件. 但是cli默认会启动src下的服务,如果目录名变了,我们需要手动修改配置,vue-cli3中提供自定义打包配置项目的文件,我们只需要手动创建vue.config.js即可.我们具体修改如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
  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')
  }
}

首先修改入口文件地址为examples下的main.js,其次将packages加入打包编译任务中.

2.编写组件代码

首先我们拿一个Button组件来示范,这里只实现一个比较简单的组件,如果大家想了解更加详细的组件设计方法和思路,可以参考笔者的组件设计相关的文章。首先我们先在packages目录下新建一个Button目录,然后src里存放组件的源代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div class="x-button">
    <slot></slot>
  </div>
</template>

<script>
export default {
  name: 'x-button',
  props: {
    type: String
  }
}
</script>

<style scoped>
  .x-button {
      display: inline-block;
      padding: 3px 6px;
      background: #000;
      color: #fff;
  }
</style>

vue和react组件设计中会大量应用插槽机制,比如vue里的slot标签, react的children等,所以这一块大家可以重点关注一下。 我们在在Button的index.js里编写如下代码来作为vue的组件安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 导入组件,组件必须声明 name
import XButton from './src'
// 为组件提供 install 安装方法,供按需引入
XButton.install = function (Vue) {
  Vue.component(XButton.name, XButton)
}
// 导出组件
export default XButton

Button的组件结构如下:

接下来我们在packages的入口文件中导入组件并安装导出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 导入button组件
import XButton from './Button'

// 组件列表
const components = [
  XButton
]

// 定义 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,
  // 以下是具体的组件列表
  XButton
}

上面的install步骤和导出步骤非常关键,大家需要按照规则配置,这也是vue组件注册的规则之一。详细文档大家可以看vue官网的组件篇。

3.测试代码

我们要想看到自己写的组件效果,可以将组件导入到examples目录下的main.js中,其本质就是一个项目的开发目录,我们只需要按照如下方式导入即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// examples/main.js
import Vue from 'vue'
import App from './App.vue'

// 导入组件库
import xui from '../packages'
// 注册组件库
Vue.use(xui)

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

这种方式是全局导入,至于按需导入,完全可以采用element的方式来配置,对于业务组件来说,一般项目中都是使用的到,所以全局导入比较合适,作为UI库来说,按需导入可能更适合。

接下来我们就可以在项目中使用我们的组件了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <x-button type="primary">button</x-button>
  </div>
</template>
<script>
export default {
  name: 'App',
  components: {
    
  }
}
</script>
<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
</style>

效果如下:

大家也可以采用elemnt开发更加美观的说明文档。

4.配置package.json文件

作为一个组件库,我们必须按照npm的发包规则来编写我们的package.json, 我们先来解决组件库打包的问题,首先我们需要让脚手架编译我们的组件代码,并输出到指定目录下,我们按照发包规范一般会输出到lib目录下,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lib": "vue-cli-service build --target lib --name xui --dest lib packages/index.js"
  }

我们的lib脚本就是用来打包packages的组件代码到lib目录下,文件名为以--name指定的名称前缀开头,我们执行脚本会输出类似如下代码:

其次我们需要编写package文件的description,keywords等,具体介绍如下:

  • description 组件库的描述文本
  • keywords 组件库的关键词
  • license 许可协议
  • repository 组件库关联的git仓库地址
  • homepage 组件库展示的首页地址
  • main 组件库的主入口地址(在使用组件时引入的地址)
  • private 声明组件库的私有性,如果要发布到npm公网上,需删除该属性或者设置为false
  • publishConfig 用来设置npm发布的地址,这个配置作为团队内部的npm服务器来说非常关键,可以设置为私有的npm仓库

还有很多配置具体要看团队的要求和规范,这里就不一一举例了.具体配置源码可参考地址 xui.

5.发布到npm

发布到npm的方法也很简单, 首先我们需要先注册去npm官网注册一个账号, 然后控制台登录即可,最后我们执行npm publish即可.具体流程如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 本地编译组件库代码
yarn lib
// 登录
 npm login
 // 发布
 npm publish
 // 如果发布失败提示权限问题,请执行以下命令
 npm publish --access public

发布之后效果如下:

之后我们就可以通过如下方式使用了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import vui from '@alex_xu/vui'
import '/@alex_xu/vui/lib/vui.css'
Vue.use(vui)

关于npm相关的知识笔者在这里简单提一下,大家可以参考学习.

1. .npmignore 配置文件

.npmignore配置文件类似于 .gitignore 文件,如果没有 .npmignore,会使用.gitignore来取代他的功能。

2. npm发包的版本管理

npm的发包遵循语义化版本,一个版本号格式如下:Major.Minor.Patch,每一部分具体介绍如下:

  • Major 表示主版本号,做了不兼容的API修改时需要更新
  • Minor 表示次版本号,做了向下兼容的功能性需求时需要更新
  • Patch 表示修订号, 做了向下兼容的问题修正时需要更新

对应的npm也提供了脚本帮我们实现自动更新版本号,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm version patch
npm version minor
npm version major
复制代码

还有更加深入的知识比如版本的tag化这些,大家感兴趣也可以研究一下. 本文的组件库搭建参考element的目录组织方式,大家也可以直接采用element或者其他开源组件库的脚手架来实现.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 歪码行空 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
🚀手把手教你从零开始开源插件🚀
在定义vue的插件的时候,需要有install方法在里面做你想做的事情,然后在index.js中暴露出去,比如:
饼干_
2022/09/19
4240
如何实现一个公共组件库上传到npm并在项目中使用
一般多个项目使用一些公共组件的时候,我们没必要在每个项目里写公共组件代码,我们可以将公共组件封装成一个库,上传至npm,这样我们在项目中使用就可以直接从npm下载直接使用。当然我们也可以搭建自己本地的npm镜,而本文主要讲述上传npm。
can4hou6joeng4
2023/11/29
8930
浅析组件库实现按需引入的几种方式
按需加载是所有组件库都会提供的一个基础能力,本文会分析ElementUI、Vant及varlet几个组件库的实现并进行相应实践,帮助你彻底搞懂其实现原理。
街角小林
2022/03/21
3.3K0
浅析组件库实现按需引入的几种方式
从零实现一套属于自己的UI框架-发布到npm
如今前端工程师的要求越来越高了,需要掌握的技术点越来越多了,会一些基本的前端技能完全适应不了快速变化的前端领域了。接下来我将从零实现一个自己的UI组件库并发布到npm上,提供给需要的朋友参考也总结下自己对封装组件的理解方便以后复习。
Nealyang
2020/02/19
1.4K0
Vue Cli 3 搭建一个可按需引入组件的组件库架子
Ant-design、Element 这些框架都有按需引入组件的功能。需要使用哪个组件,就引入哪个组件,这样那些没必要的组件就不会打包到我们的项目里了。跟着我下边的步骤,相信大家也能搭建出一个按需引入
stys35
2020/04/13
2.7K0
请说下封装 vue 组件的过程?_vue 自己封装过哪些通用组件
引言:随着业务的逐渐增多,前端业务线越来越多,需要封装公共组件并发布到npm上,以供所有的项目都可以直接install,不用每次改一个组件,复制拷贝到所有的项目,如果项目特别多,那对于开发人员来说,是一件崩溃的事情,这是我封装组件并发布到npm的全过程的一次记录,希望对其他的开发者有用 1、实现一个国家区号的列表选择框,如果没有可输入
全栈程序员站长
2022/11/09
5650
请说下封装 vue 组件的过程?_vue 自己封装过哪些通用组件
ts封装和发布一个npm库
  "main": "./dist/test-arrar-map.js"//入口文件改成打包后的入口
刘嘿哈
2022/10/25
5510
[day-ui] 组件库打包环境配置
上一节我们书写了 button 和 icon 组件,单元测试和文档也都完成了,接下来我们把写好的库打包发布到 npm 上。之后我们建个小 vue3 的项目,安装我们自己的包。
测不准
2021/04/19
4490
手把手教你写一个Vue组件发布到npm且可外链引入使用
前言 我们为什么要写个组件上传到npm镜像上呢,我们肯定遇到过这样一个场景,项目中有很多地方与某个功能相似,你想到的肯定是把该功能封装成Component组件,后续方便我们调用。但是过了一段时间,你
Sneaker-前端公虾米
2021/06/21
4770
手把手教你写一个Vue组件发布到npm且可外链引入使用
前端-团队效率(五)开发一个Vue插件
问题:一个项目的开发过程中或者一个公司的多个项目中都会各种相同的组件,结果左写一个,右写一个,需求变化后,左把红色变成绿色,点击变成悬浮,右还不知道。乃至于一个轮播功能A同事引用了插件1,B同事引用了插件1.1或者另一个插件。
吴文周
2020/01/17
5260
前端-团队效率(五)开发一个Vue插件
「Vue进阶」一篇文章,教你学会Vue-CLI 插件开发
如果你正在使用Vue框架,那么你肯定知道 VueCLI是什么。 Vue-CLI3,它是Vue.js 开发的标准工具(脚手架),提供项目支架和原型设计。
前端劝退师
2019/09/17
2.1K0
「Vue进阶」一篇文章,教你学会Vue-CLI 插件开发
全栈的自我修养: 002使用@vue/cli进行vue环境搭建 (使用Vue,SpringBoot,Flask完成前后端分离)
前言删代码,不用跑路安装@vue/cli创建 Vue 项目项目结构vue-cli3.0修改端口号使用 elementUI安装 Vuex安装 axiosgithub参考
双鬼带单
2020/07/27
1.1K0
全栈的自我修养: 002使用@vue/cli进行vue环境搭建 (使用Vue,SpringBoot,Flask完成前后端分离)
从0到1教你搭建前端团队的组件系统(高级进阶必备)
随着vue/react这类以数据驱动为主的web框架的不断完善和壮大,越来越多的前端团队开始着手搭建内部的组件库。虽然目前市面上已经有很多功能强大且完善的组件库供我们使用,比如基于react的开源组件库ant-design,material,又比如基于vue的开源组件库elementUI,iView等。
徐小夕
2020/02/26
5.3K0
Vue组件库 View UI快速入门 环境配置
Designer 小郑
2023/08/01
3540
Vue组件库 View UI快速入门 环境配置
使用 Vue CLI 3 封装组件
在时不时遇到”似曾相识“的 UI 模块时,我们下意识的反应一定是”不然把它抽成一个组件吧“。Element-UI 就是这样想法的集大成者。
kmokidd
2019/04/18
3.1K0
使用 Vue CLI 3 封装组件
【xingorg1-ui】基于vue3.0从0-1搭建组件库 (十) 组件发布到NPM
本来需要配置.npmignore配置文件,但是网上不建议用这种方式,说是黑名单的方式,不在黑名单里的关键信息都发上去了。 而是建议使用package.json里配置白名单的方式。于是将package.json配置如下: 关键配置处加上了备注信息:
xing.org1^
2020/11/24
9730
【xingorg1-ui】基于vue3.0从0-1搭建组件库 (十) 组件发布到NPM
从 Element UI 源码的构建流程来看前端 UI 库设计
由于业务需要,近期团队要搞一套自己的UI组件库,框架方面还是Vue。而业界已经有比较成熟的一些UI库了,比如ElementUI、AntDesign、Vant等。
前端森林
2020/06/28
2K0
vue-cli3项目搭建配置以及性能优化
在之前的开发中主要用的是vue-cli2,最近空闲时间比较多,接下来有新项目,本着偷懒的本能,自己打算搭建一个基础包以备后期开发应用,并对其进行性能优化和配置
青梅煮码
2023/03/13
1.7K0
vue-cli3项目搭建配置以及性能优化
【xingorg1-ui】基于vue3.0从0-1搭建组件库 (八) 组件库打包环境配置
no-clean表示打包时不删除build文件夹(https://cli.vuejs.org/zh/config/#outputdir) 作用就是为了后边的按需打包,下表。
xing.org1^
2020/11/24
1.7K0
【xingorg1-ui】基于vue3.0从0-1搭建组件库 (八) 组件库打包环境配置
vue项目封装组件_前端组件封装
在使用vue进行日常开发的时候,组件的封装是一个很常规的操作,也可以从npm仓库下载别人封装好的组件来使用,比如iview,element ui等…但每个项目的应用场景不同,所以我们有时也需要自己封装组件。而如果在开发中换了项目,那么就只能复制代码过去,略显麻烦,这个时候呢,可以将封装好的组件上传到npm仓库,需要使用时就可以直接通过npm指令下载,非常方便。
全栈程序员站长
2022/11/09
1.6K0
vue项目封装组件_前端组件封装
推荐阅读
相关推荐
🚀手把手教你从零开始开源插件🚀
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验