前言

本文将揭示vue单文件组件的工具 vue-sfc-cli 的内涵,说明它是如何在整个组件研发流程中提升效率的。

本文可以看成是 ?vue组件发布npm最佳实践 的成长篇,是 ?打造自动化的Github Workflow 的姐妹篇,是团队最佳实践的落地产物,涉及的背景知识有点多,需要花点时间消化?

使用教程

快速开始

npx vue-sfc-cli# 接下来会有一串的提示,请务必填写
# 推荐kebab-case风格,小写字母,多个单词用-(dash)分隔,如my-component# 填充完提示后
cd my-component# 使用git初始化,这样可以使用commit hook
git init# 安装依赖
yarn# 开始开发
yarn dev# 打包
yarn build# 可以发布了!
yarn publish
复制代码

参数选项

-u, --upgrade 根据 template目录下模板,生成新的文件,更新到当前组件中。使用的是覆盖策略,默认覆盖的文件定义在 update-files.js。常用于使用最新版本vue-sfc-cli对旧组件的配置进行升级

# cd my-component
npx vue-sfc-cli -u
复制代码

--files 如果想更新额外的文件,可以传此选项,后接文件名,多个文件使用 , 分隔

npx vue-sfc-cli -u --files package.json,.babelrc.js
复制代码

--test 生成一个测试的组件模板,常用于ci环境测试。

npx vue-sfc-cli --test
复制代码

示例文档

在docs目录下,新建 md 文件,建议命名同样是kebab-case

以上传组件upload-to-ali的 docs/draggable.md 文档为例

yarn dev 时会转这个markdown文件就会换成demo,可以看到实际代码,还可以实时修改代码,让demo刷新

API文档

在vue文件里,编写注释,即可生成API文档。

props

在props里使用多行注释

slot

在slot上一行,使用  @slot 开头的注释

event

在emit事件上方,使用多行注释

methods

在要公开显示的方法上方,使用多行注释,并添加 @public

效果预览

引入第三方库

以Element-UI为例

yarn add element-ui
复制代码

新增一个文件:styleguide/element.js

import Vue from 'vue'
import Element from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(Element)
复制代码

修改配置文件:styleguide.config.js

环境变量

如果需要使用环境变量,推荐使用 dotenv

yarn add dotenv --dev
复制代码

prettier and husky

组件模板内置prettier, 可以在提交代码时格式化。

注意的是需要先执行 git init 命令,之后再执行 yarn 安装依赖,否则提交钩子不生效。

注意

不建议在Windows下生成组件,因为.sh可能没有执行权限。

技术详解

技术概览

  • vue-styleguidist 本地开发demo与生成文档
    • jest 单元测试
    • prettier + husky 代码格式化
    • rollup 打包
    • standard-version 自动生成changelog
    • github-release-notes 生成github release
    • auto-badge 为pr自动添加label
    • netlify 预览pr
    • travis ci 发布npm/github pages
    • shell + dingtalk api 发布成功后发送钉钉消息
    • all-contributors 显示贡献者
    • 内置README.md模板,包括目录结构、返回顶部以及一些常见的badge

模板目录

以下是生成的组件默认模板配置

├── .all-contributorsrc  # all-contributors配置
├── .babelrc
├── .editorconfig
├── .github
│   └── badge.yml        # github app auto-badge配置,用于给pr自动打标签
├── .gitignore
├── .grenrc.js           # github-release-notes配置
├── .prettierignore      # prettier配置
├── .prettierrc          # prettier配置
├── .travis.yml          # travis ci配置
├── LICENSE              # MIT
├── README.md            # 自述文件
├── build                # rollup配置
│   └── rollup.config.js
├── build.sh             # ci相关文件
├── dist                 # 打包输出目录
├── docs                 # 使用文档,这些md会转换成demo
│   ├── basic.md
├── notify.sh            # ci相关文件,用于钉钉通知
├── package.json
├── src                   # 源文件目录
│   ├── index.js
│   └── upload-to-ali.vue # 单文件组件
├── styleguide.config.js  # vue-styleguidist配置文件
└── yarn.lock
复制代码

开发

选用vue-styleguidist的原因是,好处是:书写md,既可以充当文档,又可以转换成可运行的demo。

这样的好处是,文档与demo一体化,不用同时维护两份代码。

修改md、修改源文件,demo是会hot reload的,非常方便。

测试

对于组件的测试,大家首先想到的是相关的工具集vue-test-utils,然后觉得,组件测试有点难写,或者说,不知道怎么写。

其实可以换个思路,先从简单的做起。做单元测试,更重要的是培养写测试的习惯,所以一开始建议只用jest对纯函数进行测试。

也即,把组件里的方法抽取出来,单独放到一个文件里,然后专门对这些函数进行测试。

这样的好处是,为了方便测试:

  • 开发者在写组件时,需要尽可能地写短小精悍的函数
    • 函数要写成纯函数,也即不依赖或影响到全局变量

这样的方法,也很适合对一个完全没有测试的组件,逐步补充测试用例。

下面是el-data-table对纯函数测试的代码示例

附上相关文章:✅使用jest进行测试驱动开发

构建

yarn build 即可构建生成三个文件:

  • upload-to-ali.esm.js
    • upload-to-ali.min.js
    • upload-to-ali.umd.js

使用者import组件时,默认import进来的是 upload-to-ali.umd.js。 关于三个文件的相关描述,?vue组件发布npm最佳实践已阐述过,就不重复了。

rollup的一个特点是,默认不会把组件的依赖一起打包进去,这个特性有利于减少组件的分发体积。

下面是个示例:

// src/index.js
const crypto = require('crypto')
const axios = require('axios')
复制代码

执行 yarn build , 会得到以下信息

请不用担心这个警告,这是有意而为之的,因为不想把依赖把打包进dist进去了。

commit规范

在继续下面的内容之前,再复习一下Conventional Commits

摘取重点如下,格式为:

<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
复制代码

其中<type><subject> 是必须的。

type的类型有:

  • feat: A new feature
    • fix: A bug fix
    • docs: Documentation only changes
    • style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
    • refactor: A code change that neither fixes a bug nor adds a feature
    • perf: A code change that improves performance
    • test: Adding missing or correcting existing tests
    • chore: Changes to the build process or auxiliary tools and libraries such as documentation generation

另外约定,更新依赖使用 chore(deps),这也是github官方的做法

PR自动打标签

由于github-release-notes生成的release notes只对打上了label的Pull Request才有效,因此给github仓库添加一个自动添加label的机器人,避免重复劳动。

流程详解

.grenrc.js

.grenrc.js是github release notes 的配置, 这是参考了nuxt、github以及其他流行仓库后得到的配置,可以拿来即用

badge.yml

.github/badge.yml是 auto-badge 的配置文件,需要放到隐藏文件夹 .github 下。以下配置与上面的 .grenrc.js 相对应,同样可以拿来即用

自动发布

Travis CI

主要利用Travis CI做到自动化,先看下面的 .travis.yml 配置:

上面参数的具体说明,可以参考教程:?Github集成TravisCI:自动发布

流程详解

其主要流程如下图所示:

build.sh

build.sh内容如下:

#!/bin/sh
yarn stdveryarn buildgit remote add github https://$GITHUB_TOKEN@github.com/FEMessage/upload-to-ali.git > /dev/null 2>&1
git push github HEAD:master --follow-tags
复制代码

与之相对应的,package.json里scipts需要有以下字段:

"stdver": "standard-version -m '[skip ci] chore(release): v%s'",
"release": "gren release --override"
复制代码

notify.sh内容如下:

#!/bin/sh
if [ "$TRAVIS_TEST_RESULT" != "0" ]
then
echo "build not success, bye"
exit 1
fiurl=https://api.github.com/repos/FEMessage/upload-to-ali/releases/latest
resp_tmp_file=resp.tmpcurl -H "Authorization: token $GITHUB_TOKEN" $url > $resp_tmp_filehtml_url=`cat $resp_tmp_file | sed -n 5p | sed 's/\"html_url\"://g' | awk -F '"' '{print $2}'`
body=`cat $resp_tmp_file | grep body | sed 's/\"body\"://g;s/\"//g'`msg='{"msgtype": "markdown", "markdown": {"title": "upload-to-ali更新", "text": "@所有人\n# [upload-to-ali]('$html_url')\n'$body'"}}'curl -X POST https://oapi.dingtalk.com/robot/send\?access_token\=$DINGTALK_ROBOT_TOKEN -H 'Content-Type: application/json' -d "$msg"rm $resp_tmp_file
复制代码

这里有两个关键点:

  • 构建失败,不发送消息
    • 调用github api获取最新release时,带上github token

README.md

参考了优秀开源项目后,我们搜索出了一套README.md模板,内置在初始化工程里了

还有常见的badge

以及contributors

相关emoji代表的意思,可以看官方文档

结语

最后,欢迎大家使用github.com/FEMessage/v…开发vue组件~

转载于:https://juejin.im/post/5d21cc33e51d45108c59a5bc

揭秘vue-sfc-cli: 组件研发利器相关推荐

  1. 什么Vue单文件组件(SFC)?

    介绍# Vue 的单文件组件 (即 *.vue 文件,英文 Single-File Component,简称 SFC) 是一种特殊的文件格式,使我们能够将一个 Vue 组件的模板.逻辑与样式封装在单个 ...

  2. vue + element 顶部二级菜单_揭秘vue/react组件库中5个quot;作者不造的轮子quot;

    点击上方"前端公虾米"关注最新前端资讯 来源: 铁皮饭盒https://juejin.im/post/5d89cd156fb9a06acb3ee19e ? 这五个轮子其实是5个纯j ...

  3. element ui 多个子组件_ElementUI 技术揭秘(2) 组件库的整体设计

    需求分析 当我们去实现一个组件库的时候,并不会一上来就撸码,而是把它当做产品一样,思考一下我们的组件库的需求.那么对于 element-ui,除了基于 Vue.js 技术栈开发组件,它还有哪些方面的需 ...

  4. vue 构建根组件_构建迷你图Vue组件

    vue 构建根组件 Sparklines can be used to quickly visualize data variance. They are small and intuitive to ...

  5. cli3解决 ie11语法错误 vue_从零到一教你基于vue开发一个组件库高性能前端架构解决方案...

    Vue是一套用于构建用户界面的渐进式框架,目前有越来越多的开发者在学习和使用.虽然笔者有近2年没有从事vue的开发了,但平时一直在关注vue的更新和发展,笔者一直认为技术团队的组件化之路重点在于基础架 ...

  6. npm 编译打包vue_从零到一教你基于vue开发一个组件库

    前言 Vue是一套用于构建用户界面的渐进式框架,目前有越来越多的开发者在学习和使用.在笔者写完 徐小夕:如何从0到1教你搭建前端团队的组件系统​zhuanlan.zhihu.com 之后很多朋友希望了 ...

  7. Vue 开发的组件库

    16款优秀的Vue UI组件库推荐 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可. 在公司的Web前端项目开发中,多个项目采用 ...

  8. Vue.js 父子组件通信的十种方式;告诉世界前端也能做 AI;你可能不知道的14个JavaScript调试技巧...

    记得点击文章末尾的"阅读原文"查看哟~ 下面先一起看下本周的摘要吧~ 想了解老用户如何参与阿里云双十一1折拼团特惠主机的,可以看第二条推送,文中提供了两种方法~,一起看看本周有哪些 ...

  9. VUE常用UI组件插件及框架-vue前端UI框架收集

    UI组件及框架 element - 饿了么出品的Vue2的web UI工具套件 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开源 UI 组件库 Keen-UI - ...

最新文章

  1. 我的商汤实习年末总结
  2. params(C# 参考)
  3. java 创建日程到期提醒_日程管理工具—Things 3
  4. mysql 主从_搭建mysql主从并编写监控主从状态脚本
  5. Linux之深入理解anaconda使用
  6. 深度:余额宝技术架构及演进
  7. 查看显卡显存_选购显卡必须知道的五大参数及分类推荐购买显卡
  8. udpSocket捕获ICMP不可达错误
  9. office2019 图目录_【设计图文】电磁阀体中心孔组合机床、机床总体工位布置和钻、扩、铰工位液压系统设计(有cad图)...
  10. 大数据分析师的报考条件是什么?
  11. [HTML]北京邮电大学信息与通信工程学院选课参考指南
  12. NOIP模拟 字符处理(送分or送命?)
  13. 元宵佳节,戴铭老师亲自带你分析iOS行业动态!
  14. C++学习 Day.5(进入正轨~~)
  15. html5表单地区元素,html5新增表单域元素及属性
  16. java regux_使用Unix命令在Java中打印Mac的序列号
  17. Anders Hejlsberg 技术理想架构开发传奇
  18. 2006~2016,国产「产品经理」相关图书·十年盘点
  19. 自动驾驶 | 传感器融合–自动驾驶的关键技术
  20. 如何制作自己想要的AAC音频文件

热门文章

  1. java excel 逐行读取_java利用poi读取Excel文件
  2. ANN人工神经网络(Artificial Neuron Network )
  3. 【至简设计案例系列】基于FPGA的密码锁(XILINX ISE版)
  4. hdu4526威威猫系列故事——拼车记
  5. c语言inv函数怎么用,1 怎样学习c语言
  6. HttpClient的使用 (dotnetcore) (.netcore)
  7. php 将字符串 变为 数组,php将字符串转换为数组
  8. css中,用px自动转化为rem
  9. 老照片修复-上色-生成动图的操作方法
  10. AVB源码学习(七):AVB2.0-Super动态分区介绍