基于vue-cli3构建自己的UI库

2023-05-16

文章目录

  • 前言
  • 一、创建项目
  • 二、编写组件
    • 1.button组件
    • 2.引入字体图标icon文件
    • 3.引入Button组件看效果
  • 三、修改目录结构
    • 1. packages文件夹
    • 2. 打包修改
    • 2. demo展示
  • 四、将UI库部署到npm上
  • 五、项目使用自己的UI库
  • 总结


前言

github:https://github.com/Dream-wu/mj-ui

知识基础:

  • vue基础语法、过渡与动画处理
  • 组件思想
  • vue-cli项目结构
  • npm发布流程

一、创建项目

# CLI (@vue/cli) 是一个全局安装的 npm 包,提供了终端里的 vue 命令,需本地安装
vue create mj-ui    
npm i
yarn serve

选择项目配置:vue2 、sass

这样就快速创建了一个项目,编写UI库源码

二、编写组件

编写组件前,一定要大致列好组件的框架,从几方面去考虑:

  • props: 入参属性,格式校验,默认值
  • event:向父组件输出的事件
  • slot:是否支持插槽,以及个数和位置
  • 动画效果

src/components文件夹下创建UI组件文件,例如button组件 button.vue(参考element-ui)

1.button组件

代码如下(示例):

<template>
  <button class="mj-button" :class="[`mj-button--${type}`, {
    'is-plain': plain,
    'is-round': round,
    'is-circle': circle,
    'is-disabled': disabled
    }]" @click="handleClick"
    :disabled="disabled"
    type="button">
    <i :class="icon" v-if="icon"></i>
    <span v-if="$slots.default"><slot></slot></span>
  </button>
</template>
<script>
export default {
  name: 'MjButton',
  props: {
    type: {
      type: String,
      default: 'default'
    },
    plain: {
      type: Boolean,
      default: false
    },
    round: {
      type: Boolean,
      default: false
    },
    circle: {
      type: Boolean,
      default: false
    },
    disabled: {
      type: Boolean,
      default: false
    },
    icon: {
      type: String,
      default: ''
    }
  },
  methods: {
    handleClick (e) {
      this.$emit('click', e)
    }
  }
}
</script>
<style lang="scss" scoped>
.mj-button {...}
</style>

2.引入字体图标icon文件

在button组件和其他组件中需要图标支持,这里是拿的element-ui的字体图标文件,在icon.scss文件中修改font-family名称为mj-icons

@font-face {
  font-family: 'mj-icons';
  src: url('fonts/mj-icons.woff') format('woff'), /* chrome, firefox */
       url('fonts/mj-icons.ttf') format('truetype'); /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
  font-weight: normal;
  font-style: normal;
}

[class^="mj-icon-"], [class*=" mj-icon-"] {
	font-family: 'mj-icons' !important;
	// ....
}

3.引入Button组件看效果

scr/main.js中引入组件和样式,并全局注册:

import Vue from 'vue'
import App from './App.vue'
import MjButton from './components/button.vue'
import './assets/index.scss'  //内部引入了字体图标和其他样式文件

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

src/App.vue中使用组件,测试效果:

<template>
	<div id="app">
    	<mj-button>按钮</mj-button>
    	<mj-button type="primary">按钮</mj-button>
    	<mj-button type="info">按钮</mj-button>
    	<mj-button type="success">按钮</mj-button>
    	<mj-button type="warning">按钮</mj-button>
   	 	<mj-button type="danger">按钮</mj-button>
   </div>
</template>

打开看效果:
在这里插入图片描述

依照此步骤,可以继续封装其他组件,例如:radio,switch,form,…等。没有思路的可以去参考其他组件库

三、修改目录结构

为了看起来更像一个组件库,调整一下目录结构

1. packages文件夹

  • 根目录下,新建packages文件夹用于存放用于打包组件库的文件(组件和样式),将之前src/components下的所有组件挪到packages下,以及所有样式图标文件。
  • 在packages下,新建index.js,index.js作为该UI库的入口文件。该UI库作为vue的一个插件,必须提供install方法。在install方法内全局注册上所有组件
// packages/index.js
import MjButton from './button.vue'
import MjDialog from './dialog.vue'
import './assets/index.scss'

const components = [
  MjButton,
  MjDialog
]
// 整个包的入口 ,注册所有组件
const install = function (Vue) {
  components.forEach(component => {
    Vue.component(component.name, component)
  })
}

// 判定是否是直接引入文件(比如script引入,全局能拿到Vue变量),如果是,就不用调用Vue.use()
if (typeof window !== 'undefined' && window.Vue) {
  install(window.Vue)
}
export default install

2. 打包修改

  • 新建vue.config.js,修改打包规则,只打包packages文件夹。
// vue.config.js
const path = require('path');
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(path.resolve(__dirname, 'packages')).end()
            .use('babel')
            .loader('babel-loader')
            .tap(options => {
                return options
            })
    }
}
  • 新增打包命令:"lib": "vue-cli-service build --target lib packages/index.js" vue-cli默认打包成应用的方式,这里要打包成一个库,需重新配置lib方式,并指定打包入口文件
  • 打包后会生成dist目录,内有commonjs umd不同格式的js文件

2. demo展示

将原来的src文件夹重新命名为examples,主要用于组件库的demo实例展示,同时在main.js去掉对组件的全局注册,直接引入packages中的UI库。

// examples/main.js 
import MjUI from '../packages'

Vue.use(MjUI)

四、将UI库部署到npm上

部署到npm上,就可以实现云管理,在项目中直接引入npm包即可。那传到npm上,需要做一些修改:

  • package.json中的"private": false,必须为false才能部署成功
  • package.json中的name值,不能重名的。可以在npm网站上搜一下有没有重名的库。
  • package.json配置入口文件:"main": “dist/mj-ui.umd.min.js”
  • 新建一个.npmignore文件,配置忽略上传的文件,这里只需要dist目录即可
# 忽略目录,npm上不需要上传源码,只需要dist即可
examples/
packages/
public/

# 忽略指定文件
vue.config.js
babel.config.js
*.map
  • 切记,npm命令设置的镜像源必须是自己的。不要配置淘宝等其他的源,查看当前设置的镜像:npm config get registry
  • npm login 命令输入用户名和密码,登录
  • npm publish 命令就可以发布(每次重新发布要更改version,否则会失败)

五、项目使用自己的UI库

像引用其他插件库一样:

yarn add mj-ui-vue
import MjUI from 'mj-ui-vue'
import 'mj-ui-vue/dist/mj-ui.css'

Vue.use(MjUI)

总结

封装一个UI库的步骤大致如上,关键在于一个一个的组件是如何封装的,这需要我们开发人员的不断学习和总结。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于vue-cli3构建自己的UI库 的相关文章

  • 开科唯识笔试

    对于这次的笔试 xff0c 我只想说BiShi 几道编程题加一道SQL题 1 找出所有三位数中的水仙花数 public void getNarcissusNums int g 61 0 s 61 0 b 61 0 sum 61 0 for
  • JDBC批量插入

    最近项目中有用到JDBC技术 xff0c 存在大量数据要进行插入 xff0c 通过研究采用批量插入速度快的不是一点点 下面简单比较了一下普通插入与批量插入5W条数据的时间效率 常规插入 xff1a 耗时12952ms public stat

随机推荐

  • 面试经历---YY欢聚时代(2015年11月21日上午初试、25日下午复试)

    YY欢聚时代一年多前去面试过一次 xff0c 当时鄙视了 xff0c 在现在的公司呆了1年半了 xff0c 感觉做得很不爽 xff0c 而且薪资又不满意 xff0c 所以想找个新工作 xff0c 就想去YY面试 下面将两次YY面试的经历写出
  • exe应用程序无法启动,因为应用程序的并行配置不正确

    问题 xff1a exe应用程序无法启动 xff0c 因为应用程序的并行配置不正确 有关详细信息 xff0c 请参阅应用程序事件日志 xff0c 或使用命令行 sxstrace exe 工具 原因查找 xff1a 1 xff09 开始 所有
  • TortoiseSVN is locked in another working copy

    TortoiseSVN提交报错 TortoiseSVN is locked in another working copy 原因 xff1a 可能是因为打开了多个commit会话 xff0c 然后又去修改了提交文件的内容 xff0c 导致文
  • Java对接企业微信

    最近需要对接企业微信 xff0c 例如将风险测评结果推送给企业微信中对应的用户 xff0c 然后用户对结果进行查看与确认操作 xff0c 所以这里就涉及到两方面 xff1a 1 xff09 将外部系统内容推送到企业微信 xff1b 2 xf
  • 微众银行面试

    机缘巧合 xff0c 其实并没有换工作的想法 xff0c 却收到了微众的面试邀请 xff0c 就想着去看看当是增长见识吧 xff0c 因为已经好久没准备面试的事情了 xff0c 而且微众毕竟作为腾讯系的看起来好像也不错 说实话那边离地铁站是
  • #TP4056#--3.7V锂电池充放电电路(实践日志篇)

    成就更好的自己 本篇为小型电源的实践日志 xff0c 内附各种充电应用电路 xff0c 并开源TP4056应用电路AD的原理图和PCB xff1b 先放一点锂电池常识性的知识 xff1a 锂电池是一类由锂金属或锂合金为负极材料 使用非水电解
  • ROS四旋翼无人机快速上手指南(1):无人机系统硬件概述与指南简介

    成就更好的自己 ROS无人机快速上手指南旨在于让使用此无人机开发平台的比赛参赛人员 xff0c 算法设计人员 xff0c 无人机爱好者更加快速的了解底层控制运作原理 xff0c 从而缩短开发周期 xff0c 减少掉坑次数 xff0c 快速验
  • ROS四旋翼无人机快速上手指南(2):Ubuntu18.04与ROS系统

    成就更好的自己 目录 Jetson版Ubuntu以及ROS的安装 xff1a ROS特性及Nano开发问题 PX4与Gazebo仿真环境 ROS与MATMAB仿真 Jetson版Ubuntu以及ROS的安装 xff1a ROS机器人系统运行
  • ROS四旋翼无人机快速上手指南(4):阿木实验室PX4功能包飞行控制分析与讲解(重点章节)

    成就更好的自己 这一章详细讲解一下阿木实验室 AMOV 的开源项目px4 command功能包 xff0c 此功能包通过mavlink协议直接控制烧录px4固件的自驾仪 xff0c 还融合了来自各个传感器的位姿 xff0c 距离等信息 xf
  • ROS四旋翼无人机快速上手指南(5):快速部署上层算法的操作与思路

    成就更好的自己 经过本系列上一篇文章关于PX4 command飞行控制功能包的分析 xff0c 相信大家对于飞整个流程有个大概的了解 xff0c 本章将在此基础上详细讲解一下应用级算法构建的思路与操作方法 关于PX4 command飞行控制
  • USB系列-LibUSB使用指南(1)-Windows下的报错与踩坑

    成就更好的自己 时隔一年再次开始撰写博客 xff0c 这一年的时间经历了很多 xff0c 现在终于稳定下来 以后很长一段时间都能够稳定的学习和更新 时间将会聚焦于USB和PCIe的开发进行 xff0c 能和大家共同进步真的很高兴 本篇为US
  • rosdep init和rosdep update出现问题解决,以及ros编程问题

    如果你在执行 rosdep init 过程中出现以下错误 ERROR cannot download default sources list from https raw githubusercontent com ros rosdist
  • linux内核体系结构

    本节介绍了linux内核的编制模式和体制结构 xff0c 然后详细描述linux内核代码目录中组织形式以及子目录各个代码文件的主要功能以及基本调用的层次关系 一个完整可用的操作系统主要由4部分组成 xff1a 硬件 操作系统内核 操作系统服
  • 基于OpenLTE的4G移动通信网络实验指导书

    基于本人本科毕业设计的成果 xff0c 设计了一套基于开源SDR项目 OpenLTE的实验指导书 xff0c 可以指引读者通过平台源码 平台提供的实验和结合实验对3GPP规范的解读分析来更直观 更多元立体的学习无线通信技术 xff0c 而不
  • 一行代码实现数组中数据频次值

    问题 xff1a 一行代码实现统计数组中每个name出现的次数 数组示例如下 xff1a 期望结果 xff1a 39 哈哈 39 2 39 哈哈1 39 1 39 哈哈2 39 2 span class token keyword var
  • mac bash_profile报错导致所有命令失效解决办法

    项目场景 xff1a 搭建flutter环境时 xff0c 在mac下需要配置环境变量 问题描述 xff1a 配置环境变量 xff0c 需要修改 bash profile文件 xff0c 修改文件保存退出后 发现文件有报错 xff0c 导致
  • 我理解的“大前端”

    前言 随着业务场景越来越复杂 xff0c 前端技术也越来越丰富 xff0c 这几年也迎来爆发期 xff0c 大前端 的概念逐渐涌现 本图根据本人理解整理 xff0c 如有不足 xff0c 欢迎指正 xff0c 感谢 一 终端 PC端 PC端
  • 前端获取用户地理定位的几种方式(Geolocation API,微信,腾讯地图)

    文章目录 前言一 Geolocation API二 微信 SDK1 引入jssdk2 获取签名 xff0c 注入配置3 调用JS SDK api 获取位置 三 第三方服务 xff08 腾讯地图服务 xff09 1 引入js文件2 获取定位
  • H5 软键盘自动搜索功能

    业务场景 xff1a 通常APP中的顶部搜索栏 xff0c 都配一个搜索按钮 同时输入文字软键盘弹起 xff0c 回车键自动变成搜索键 xff0c 点击软键盘中的搜索能进行搜索功能 xff0c 如下图taobao所示 xff1a 思考 软键
  • 基于vue-cli3构建自己的UI库

    文章目录 前言一 创建项目二 编写组件1 button组件2 引入字体图标icon文件3 引入Button组件看效果 三 修改目录结构1 packages文件夹2 打包修改2 demo展示 四 将UI库部署到npm上五 项目使用自己的UI库