用 node.js 脚本替代复杂的 npm script

Node.js 丰富的生态能赋予我们更强的能力,对于前端工程师来说,使用 Node.js 来编写复杂的 npm script 具有明显的 2 个优势:首先,编写简单的工具脚本对前端工程师来说额外的学习成本很低甚至可以忽略不计,其次,因为 Node.js 本身是跨平台的,用它编写的脚本出现跨平台兼容问题的概率很小。

下面我们就一起探索下,如何把上节中使用 shell 编写的 cover 脚本改写成 Node.js 脚本,在 Node.js 脚本中我们也能体味到 shelljs 这个工具包的强大。

1. 安装 shelljs 依赖

使用如下命令安装 shelljs 到项目依赖中:

npm i shelljs -D
# npm install shelljs --save-dev
# yarn add shelljs -D

此外,我们计划使用 chalk 来给输出加点颜色,让脚本变的更有趣,同样安装到 devDependencies 里面:

npm i chalk -D
# npm install chalk --save-dev
# yarn add chalk -D

2. 创建 Node.js 脚本

touch scripts/cover.js

3. 用 Node.js 实现同等功能

shelljs 为我们提供了各种常见命令的跨平台支持,比如 cp、mkdir、rm、cd 等命令,此外,理论上你可以在 Node.js 脚本中使用任何 npmjs.com 上能找到的包。清理归档目录、运行测试、归档并预览覆盖率报告的完整 Node.js 代码如下:

const { rm, cp, mkdir, exec, echo } = require('shelljs');
const chalk = require('chalk');console.log(chalk.green('1. remove old coverage reports...'));
rm('-rf', 'coverage');
rm('-rf', '.nyc_output');console.log(chalk.green('2. run test and collect new coverage...'));
exec('nyc --reporter=html npm run test');console.log(chalk.green('3. archive coverage report by version...'));
mkdir('-p', 'coverage_archive/$npm_package_version');
cp('-r', 'coverage/*', 'coverage_archive/$npm_package_version');console.log(chalk.green('4. open coverage report for preview...'));
exec('npm-run-all --parallel cover:serve cover:open');

关于改动的几点说明:

  • 简单的文件系统操作,建议直接使用 shelljs 提供的 cp、rm 等替换;
  • 部分稍复杂的命令,比如 nyc 可以使用 exec 来执行,也可以使用 istanbul 包来完成;
  • 在 exec 中也可以大胆的使用 npm script 运行时的环境变量,比如 $npm_package_version

4. 让 package.json 指向新脚本

准备好 Node.js 脚本之后,我们需要修改 package.json 里面的命令,使其运行该脚本:

   "scripts": {"test": "cross-env NODE_ENV=test mocha tests/",
-    "cover": "scripty",
+    "cover": "node scripts/cover.js","cover:open": "scripty"},

5. 测试 cover 命名

重新运行 npm run cover 命令,不出意外的话,基本功能是正常的,除了我们新加的绿色输出,如下图:

以上,本小节完,这里只是简单展示了如何组织 Node.js 脚本并且让其与 npm script 关联起来,至于具体在脚本中做什么事情,请你自由发挥吧。


本节用到的代码见 GitHub,想边看边动手练习的同学可以拉下来自己改,注意切换到正确的分支 08-using-nodejs-script-as-replacement


上一篇:高阶篇 02:把庞大的 npm script 拆到单独文件中下一篇:实战篇 01:监听文件变化并自动运行 npm script

用 node.js 脚本替代复杂的 npm script相关推荐

  1. Node.js脚本项目合集(一):Node.js+FFmpeg实现批量从B站导出离线缓存视频到mp4格式,mp4转mp3,实现听歌自由

    Node.js脚本项目合集(一):Node.js+FFmpeg实现批量从B站导出离线缓存视频到mp4格式,mp4转mp3,实现听歌自由 前言 一.准备工作以及介绍 1.什么是FFmpeg 2.FFmp ...

  2. Node.js下载安装及各种npm、cnpm、nvm、nrm配置(保姆式教程—提供全套安装包)—nrm的安装与配置(5)

    Node.js下载安装及各种npm.cnpm.nvm.nrm配置(保姆式教程-提供全套安装包)-nvm的安装与配置(4) 一.nrm安装与使用 1.管理员运行cmd,输入如下,全局安装nrm: npm ...

  3. Node.js下载安装及各种npm、cnpm、nvm、nrm配置(保姆式教程—提供全套安装包)—nvm的安装与配置(4)

    Node.js下载安装及各种npm.cnpm.nvm.nrm配置(保姆式教程-提供全套安装包)-cnpm的安装与配置(3) 五.nvm的下载安装 1.下载 nvm官网下载地址: https://git ...

  4. Node.js下载安装及各种npm、cnpm、nvm、nrm配置(保姆式教程—提供全套安装包)—cnpm的安装与配置(3)

    Node.js下载安装及各种npm.cnpm.nvm.nrm配置(保姆式教程-提供全套安装包)-npm的安装与配置(2) 四.安装cnpm 1.管理员身份运行cmd,输入如下命令 npm instal ...

  5. Node.js下载安装及各种npm、cnpm、nvm、nrm配置(保姆式教程---提供全套安装包)---npm的安装与配置(2)

    Node.js下载安装及各种npm.cnpm.nvm.nrm配置(保姆式教程-提供全套安装包)-node.js的安装与配置(1) 三.配置npm安装的全局模块 需要配置的进行配置(不用C盘的配置,用C ...

  6. Node.js下载安装及各种npm、nvm、nrm配置(保姆式教程---提供全套安装包)---node.js的安装与配置(1)

    Node.js下载安装及各种npm.nvm.nrm配置(保姆式教程-提供全套安装包)-node.js的安装与配置(1) Node.js的完全卸载与下载安装及各种npm.nvm.nrm配置(保姆式教程- ...

  7. node.js常见问题之:解决npm install出错(Cannot find module ‘internal/util/types‘)

    node.js常见问题之:解决npm install出错(Cannot find module 'internal/util/types') 参考文章: (1)node.js常见问题之:解决npm i ...

  8. 下载n站本子的 node.js 脚本

    问题: n站上的本子,虽然每一本都有下载按钮,但是实测通过其提供的种子文件,下载速度并不理想,甚至有时候会卡在一个地方下不动.可是本子毕竟不同于其他东西,它在实质上只是许多图片的合集.用户打开每一个带 ...

  9. Node.js 入门教程 23 使用 npm 的语义版本控制 24 卸载 npm 软件包 25 npm 全局或本地的软件包

    Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录 Node.js 入门教程 23 使用 npm 的语义版本控制 24 ...

最新文章

  1. Java并发之synchronized
  2. 浏览器会缓存js文件
  3. asp.net mysql 读写分离_MySQL读写分离
  4. python文件对象提供了3个读方法、分别是-python3 IO编程:文件读写
  5. Chrome Android 60.X+ 不能自动播放audio音频的解决办法
  6. ActiveMQ –经纪人网络解释–第5部分
  7. regedit或child_process添加注册表
  8. qpython3第三方库_Python第三方库的安装 --Python3
  9. [tips]ubuntu 12.04系统黑屏
  10. 2022考研【王道计算机408】【天勤计算机408】数据结构+操作系统+计算机组成原理+计算机网络
  11. 拓扑结构计算机网络结构,什么是计算机网络的拓扑结构
  12. ICMP隧道检测分析--icmptunnel
  13. 牛客刷题——两种排序方法
  14. 文件批量重命名(Excel+REN)
  15. unity Inspector
  16. 在网页中发起QQ临时对话的方法
  17. php显示cpu温度,cpu温度过高怎么办
  18. msp fet430uif驱动
  19. QIIME2-傻瓜式安装
  20. linux 下执行shutdown.sh命令不能关闭tomcat进程的解决方法

热门文章

  1. php 动态加载JavaScript文件或者css文件
  2. oracle清空回收站
  3. 案例 月工作列表 c# 1614192274
  4. 02 掌握变量的定义和使用方法 1214
  5. 演练 课程导航 1002 html
  6. pptx模块的图片框
  7. img标签设置display:block,宽度无法100%
  8. php-fpm的pool php-fpm慢执行日志 open_basedir php-fpm进程管理
  9. php 执行exec() 操作linux 命令
  10. 操作系统内核的一些事