js打印插件_使用 Nodejs 开发一个 commitlint-release 插件
![](/assets/blank.gif)
本文使用 Zhihu On VSCode 创作并发布
前言: 上次动手开发了一个插件,在 React 中: 如何把 CSS 变量全局化 ,完成这个插件,让我学习了 npm 简单的开发流程,这次在尝试开发一个 commitlint-release 插件,我对开发插件有了更加进一步的了解了,比如如何创建 bin 命令,如何使用 NodeJs 执行命令,如何在 REPL 环境打印出带颜色友好提示等。开发一个简单的插件,我想对我来讲差不多够用的了,莫的没必要去研究那么深。
目的
主要是解决多人协作时代码风格不一致的问题顺便规范下 commit 提交。
在平时,如果是我们自己一个人开发项目,那当然是自己怎么爽怎么来,不要给我讲什么是规范,我就是规范 。但是一旦项目涉及到多人协作或有外包同事的话,情况就不一样了,这时候的代码规范和风格保持一致就是一件特别重要的事情,即使对方是一位优秀的工程师。可以讲代码的规范性的重要性丝毫不亚于业务逻辑的实现。
当然社区对这方面给出了很多解决方案,也就是插件,但是需要一个一个的去集成,换个项目又的动手自己复制,多麻烦呀。对于这种类似 CLI 脚手架的工具,最好是做成 npm 包,非常便于携带呦,还能学到新知识,多好的事情呀。
插件在此 :commitlint-release
灵感来源
我在去配置代码规范的时候并没有想到去做一个 npm 包,直到我发现一个小姐姐写的插件:vue-cli-plugin-commitlint-release
写的可以说是非常的棒,就是可惜只支持 Vue 环境,所以如果我要是开发 React 或 Node 的就尴尬了 。非常建议看看这个插件源代码,也很简单的,你可以照着 插件开发指南 来学习下 @vue/cli 插件的开发技巧,不说为了学习技术就是为了面试多要点工资,也得看看呀,对吧。
既然不能直接使用,那就只能自己搞了,而且我还有点新功能要加进去,看下思路:
- 不依赖 Vue 或 React 框架的 API 来实现要不然不通用,依据 NodeJs 的 API 来完成
- 添加代码格式化方面的功能
前置知识
我们对着 commitlint-release 要实现的功能来一个一个学习,先看下 commitlint-release 有哪些功能:
- 自动检测 commit message 是否符合规范,不规范不允许提交
- 自动提示 commit message 填写格式,不怕忘记规范怎么写。
- 自动更新 package.json 里的版本号。
- 自动生成 changelog,更好的维护版本迭代。
- 集成 git add . && git commit 不需要在执行两个命令,配合 shelljs 这个 npm 包能更强大。
- 自动格式化代码。
commit message
功能一和二都属于 commit 提交规范的事情,即使用 使用 husky 和 commitlint 规范提交记录 配置使用也很简单,首先安装依赖:
npm
依据 husky 官网 介绍在 package.json 文件添加 husky 字段,用来拦截 git commit 命令:
"husky"
然后在根据 @commitlint/config-conventional 的 Getting started 来使用命令行,来创建 commitlint.config.js 文件:
echo
配置完了,这时如果我们做一个 commit 提交动作,husky 会先拦截,然后通过 @commitlint/cli 来获取 @commitlint/config-conventional 的规则集来验证,验证通过即自动完成本次提交。
另外,关于验证的规则集,你也可以不使用 @commitlint/config-conventional 这个包。自己看下规则,自定义也行,但是我认为没多大必要。
假如你是个新手或忘记了 commit 的规范怎么写。这时有个自动提示 commit message 填写格式就好了。 commitizen 的 git-cz 或 cz 命令就是用来干这个的。先安装 commitizen 依赖:
npm i -D commitizen
然后再 package.json 文件的 scripts 字段添加以下内容:
"scripts"
这时通过 npm run cz 或 npm run git-cz 就能调出 commit 的提示功能了。
生成 CHANGELOG.md
接着看,很多开源的项目都有一个 CHANGELOG.md 文件,这个文件便于更加方便的维护版本迭代。那它是怎么自动生成的呢。
cz-conventional-changelog 这个包是生成 angular 规范的 CHANGELOG.md。如果你想自定义 CHANGELOG.md 的格式请使用 conventional-changelog 这个包来实现,然后在配合 --config 就行了。
可以去看看阮老师的文章 Commit message 和 Change log 编写指南 不仅包含了如何生成 CHANGELOG.md,还包含 Commit message 提价规范的讲解。
版本升级
关于版本升级最常用的就是 npm version major | minor | patch,但是不够只能,这里使用 standard-version 来替代下。其实替不替代也没啥用。
输入命令后,提示输入 [ major | minor | patch ],以当前版本 1.0.0 为例:
升级版本一定要符合:semver 语义化版本控制规范,例如:
major:主版本号,当你做了不兼容的 API 修改。这时候的 version 应该为 2.0.0。 minor:次版本号,当你做了向下兼容的功能性新增。这时候的 version 应该为 1.1.0。 patch:修订号,当你做了向下兼容的问题修正。这时候的 version 应该为 1.0.1。
ESLint、prettier、editorconfig
- editorconfig 主要是保证文件编码、换行等在不同的设备保持一致
- ESLint 代码风格和语法检查
- prettier 格式化代码
主要讲下有 ESLint 为什么还要使用 prettier,这是因为
- ESlint 并不能完全修复代码风格
- 配置规则过多
prettier 有一套固定的格式话代码规则,但是这些规则大部分都不可以给我们自定义,只有灰常少的一小部分可以自己配置,可以配置的规则在此 Options ,虽然 prettier 格式化规则表现的较为霸道,但是格式化完还是很好看的,所以多人协作在保证团队代码风格一致,牺牲一点个人写代码的风格还是可以接受的,既然 prettier 负责代码风格,那么现在 ESlint,就主要用来检查代码质量(例如变量未定义不允许使用等),和补充 prettier 没有照顾到的代码风格(补充的千万不能和 prettier 规则冲突)(例如:注释和代码不能在同一行)。
npm 相关的知识
看我插件的使用介绍会发现:
npm i commitlint-release -D
执行 npx init-commitlint 命令来初始化配置npx init-commitlint
安装之后需要通过 npx init-commitlint 来初始化配置。init-commitlint 这个命令是怎么来的呢?没错,是通过 package.json 的 bin 字段自动生成的。具体看此 记一次nodejs开发CLI的过程
npm 的知识还是很重的,推荐一个博客:Node.js 进阶-你应该知道的 npm 知识都在这! 这个博客还是少些东西,我知道有个博客内容恰好能和它互补,可惜忘了。。。
简单介绍下 commitlint-release 的开发
先根据 NodeJS 的规范建项目目录,简单讲下我的目录:
# 此包被引入时的入口
├── bin/
最最重要的就是 bin/init.js 文件,里面的 API 简单介绍下:
- process.argv 来获取进程被启动时传入的命令行参数process.argv
- process.cwd() 方法会返回 Node.js 进程的当前工作目录。
- process.exit() 方法以退出状态 code 指示 Node.js 同步地终止进程。
- createReadStream 和 createWriteStream,文件模块创建读取流和写入流,就是用 JS 读取文件和写入文件
- spawn 开启一个子进程来执行 shell 命令,也可以用 shelljs 这个 npm 包
- chalk 可以用来给文字上色
- path 和 __dirname 都是文件路径模块的
耐下性子来仔细研究研究,以后项目中遇到需要去看 node_modules 或研究源码的时候很有帮助的。
最后
对了,今天是十月二十四号,还想不起来什么吗?我在提示下 1024 ,这下知道了吧,没错你答对了,是程序员节,很多人(我想大多数都是程序员自己讲的)都说程序员累,我是真想不明白,天天玩个电脑有啥累的,而且为什么会有程序员节,还不是上班没事划个水在网上冲浪 ♀️,吐槽吐槽自己如何辛苦 ,就是闲着没事在网上硬给创造出来一个节日。要说辛苦送外卖的不辛苦吗,妈蛋,不仅是辛苦还有生命危险⚠️,尤其是冬天,也没见外卖员天天在网上喊辛苦,你都无法想象一个站点模范外卖员到底有多拼,对比程序员那点加班和大小周啥的,对外卖员的工作时间来讲完全就是洒洒水级别的。
当然今天这个节日还是有点用的,毕竟老板发了红包 ,我就抢了二十三块钱,不错了省一顿饭,就是这么没出息
当前时间 Saturday, October 24, 2020 18:31:31 北京办公室
js打印插件_使用 Nodejs 开发一个 commitlint-release 插件相关推荐
- android中的插件开发框架,设计并开发一个 Android 的插件化框架
结合动态加载系列文章的分析,现在开始设计并开发一个 Android 的插件化框架,命名为 Frontia.Frontia 有 "前端" 的意思,寓意着 Android 插件能像前端 ...
- python写chrome插件_用VueJS写一个Chrome浏览器插件
浏览器基本已经天下大统了,放眼望去都是Chromium的天下.那么,能写一个浏览器插件也算是一种回报率不错的技能. 基本知识 浏览器插件官方的说法叫扩展程序,允许你为浏览器增加各种功能,但不需要深入研 ...
- rails开发利器:视频播放插件plugin(如何开发一个简单的插件)
For: rails2.3.8 因为我的项目是基于rails2.3.8的,以后在做rails3.0的 plugin的名称是 video_player, 新建plugin ruby script/g ...
- 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(三)
前篇 使用React.Node.js.MongoDB.Socket.IO开发一个角色投票应用的学习过程(一) 使用React.Node.js.MongoDB.Socket.IO开发一个角色投票应用的学 ...
- 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(一)
这几篇都是我原来首发在 segmentfault 上的地址:https://segmentfault.com/a/1190000005040834 突然想起来我这个博客冷落了好多年了,也该更新一下,呵 ...
- java 线程 插件_我的第一个Chrome插件:天气预报应用
1.Chrome插件开发基础 开发Chrome插件很简单,只要会基本的前台技术HTML.CSS.JS就可以开发了. Chrome插件一般包括两个HTML页面background和popup. back ...
- java在线学习网站源码_我是怎么开发一个小型java在线学习网站的
2016/1/27 11:55:14 我是怎么开发一个小型java在线学习网站的 一直想做一个自己的网站(非博客),但是又不知道做什么内容的好,又一次看到了w3schools,就萌发了开发一个在线ja ...
- asp.net web开发框架_用Python开发一个Web框架
一.Web框架 首先我们今天要做的事是开发一个Web框架.可能听到这你就会想.是不是很难啊?这东西自己能写出来? 如果你有这种疑惑的话,那就继续看下去吧.相信看完今天的内容你也能写出一个自己的Web框 ...
- 开发一个 Chrome 浏览器插件,拢共分几步?
市面上浏览器有很多,比如 IE.Edge.火狐.Safari 等,但市场占有率第一的永远只有一个 -- Chrome. 之所以如此,很大一部分原因是 Chrome 丰富的插件库.我们在使用浏览器时,免 ...
- 记录--手把手带你开发一个uni-app日历插件(并发布)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 相信我们在开发各类小程序或者H5,甚至APP时,会把uni-app作为一个技术选型,其优点在于一键打包多端运行,较为强大的跨平台的性能.但 ...
最新文章
- 【Google Play】从 Android 应用中跳转到 Google Play 中 ( 跳转代码示例 | Google Play 页面的链接格式 | Google Play 免安装体验 )
- Zookeeper分布式一致性原理(六):Zookeeper开源客户端zkClient
- A Router may have only one child element
- 主导精准脱贫-农业大健康·万祥军:恩施谋定硒功能性产业链
- AbstractQueuedSynchronizer理解之三(Semaphore)
- Code Runner for VS Code 突破 2000 万下载量!支持超过 50 种语言
- LeetCode之Reverse String II
- python中的map,feilter,和reduce函数
- 通过Azure Kinect DK 基于Ubuntu18.04实现室内三维重建(一)
- java基础知识点(5)——分支语句if-switch
- HCS12XEP100 ADC与SCI2的冲突解决 (2011-4-15)
- 我使用过的Linux命令之dot - 绘制DOT语言脚本描述的图形
- bochs运行xp_bochs xp镜像下载
- R720重装系统\WEPE装系统\WEPE
- HTML+CSS大作业——中华美德文化(6页) HTML+CSS+JavaScript 中国传统美德文化网页HTML代码
- 苹果手机如何设置喜欢的铃声?想给自己的iphone换个别具特色的铃声吗?
- 大数据招聘,我就这样被算法选中
- 移动网页支付(微信H5支付和支付宝网页支付)
- Java化小数为分数_杭电oj1717——小数化分数(java实现)
- MII接口(Media Independent Interface)
热门文章
- MySQL 和 MySQL Workbench图形化安装教程
- oracle中lang的作用,【Oracle】详解Oracle中NLS_LANG变量的使用
- vue el-checkbox循环多个如何选中当前的_vue 快速入门指南(一)
- php编写一个学生类_0063 PHP编程编写学生分数信息编辑和删除功能网页
- java 反序列化 怎么知道类_理解java中的序列化与反序列化
- 语言模拟蒲丰问题_播音主持专业艺考模拟主持八大禁忌!
- case when的判断顺序_Sql 中的if 判断 case... when
- 元素偏移量offset系列(附实例)
- 【 HDU1081 】 To The Max (最大子矩阵和)
- linux环境下给文件加密/解密的方法