把庞大的 npm script 拆到单独文件中

当 npm script 不断累积、膨胀的时候,全部放在 package.json 里面可能并不是个好主意,因为这样会导致 package.json 糟乱,可读性降低。

借助 scripty 我们可以将 npm script 剥离到单独的文件中,从而把复杂性隔到单独的模块里面,让代码整体看起来更加清晰。

示例项目中的覆盖率相关的 npm script 占据了很大的篇幅,如下:

  "scripts": {"cover": "nyc --reporter=html npm test","cover:cleanup": "rimraf coverage && rimraf .nyc_output","cover:archive": "cross-var \"make-dir coverage_archive/$npm_package_version && cpr coverage/* coverage_archive/$npm_package_version -o\"","cover:serve": "cross-var http-server coverage_archive/$npm_package_version -p $npm_package_config_port","cover:open": "cross-var opn http://localhost:$npm_package_config_port","precover": "npm run cover:cleanup","postcover": "npm-run-all cover:archive --parallel cover:serve cover:open"},

如果要隔离复杂性,我们可以考虑从 cover 相关的 script 入手,具体操作步骤如下:

1. 安装依赖

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

2. 准备目录和文件

mkdir -p scripts/cover

先创建两层的目录,因为我们计划把 cover 脚本写成多个,方便单独去执行,这里命名为 scripts 是 scripty 默认的,实际上是可以自定义的。

touch scripts/cover.sh
touch scripts/cover/serve.sh
touch scripts/cover/open.sh

然后创建空白的脚本文件,因为有了单独的脚本,我们可以把原来的 precover、cover、postcover、cover:archive、cover:cleanup 合并到一个文件中。

按照 scripty 的默认约定,npm script 命令和上面各文件的对应关系如下:

命令

文件

备注

cover

scripts/cover.sh

内含 precover、postcover 的逻辑

cover:serve

scripts/cover/serve.sh

启动服务

cover:open

scripts/cover/open.sh

打开预览

特别注意的是,给所有脚本增加可执行权限是必须的,否则 scripty 执行时会报错,我们可以给所有的脚本增加可执行权限:

chmod -R a+x scripts/**/*.sh

3. 修改 scripty 脚本

准备好目录和文件之后,接下来需要给脚本填充内容,脚本内容如下(因为脚本使用的是 bash,所以直接忽略了跨平台兼容的处理,跨平台兼容脚本最好使用 Node.js 编写,下节会介绍):

scripts/cover.sh 内容如下(cleanup --> cover --> archive --> preview):

#!/usr/bin/env bash# remove old coverage reports
rimraf coverage && rimraf .nyc_output# run test and collect new coverage
nyc --reporter=html npm run test# achive coverage report by version
mkdir -p coverage_archive/$npm_package_version
cp -r coverage/* coverage_archive/$npm_package_version# open coverage report for preview
npm-run-all --parallel cover:serve cover:open

scripts/cover/serve.sh 内容如下:

#!/usr/bin/env bashhttp-server coverage_archive/$npm_package_version -p $npm_package_config_port

scripts/cover/open.sh 内容如下(这里有个 sleep,是为了确保文件系统写入完成):

#!/usr/bin/env bashsleep 1
opn http://localhost:$npm_package_config_port

细心的同学可能注意到了,在 shell 脚本里面是可以随意使用 npm 的内置变量和自定义变量的。

4. 修改 package.json

主要改动是清理 cover:* 命令,接入 scripty,具体的 diff 如下:

   "scripts": {"test": "cross-env NODE_ENV=test mocha tests/",
-    "cover": "nyc --reporter=html npm test",
-    "cover:cleanup": "rimraf coverage && rimraf .nyc_output",
-    "cover:archive": "cross-var \"make-dir coverage_archive/$npm_package_version && cpr coverage/* coverage_archive/$npm_package_version -o\"",
-    "cover:serve": "cross-var http-server coverage_archive/$npm_package_version -p $npm_package_config_port",
-    "cover:open": "cross-var opn http://localhost:$npm_package_config_port",
-    "precover": "npm run cover:cleanup",
-    "postcover": "npm-run-all cover:archive --parallel cover:serve cover:open"
+    "cover": "scripty",
+    "cover:serve": "scripty",
+    "cover:open": "scripty"},

这里我们只保留了 cover、cover:serve、cover:open 等 3 个命令,让它们都指向 scripty,调用哪个脚本都由 scripty 来处理。

5. 实际测试

修改完毕之后,重新运行 npm run cover,不出意外的话,我们能得到和原来完全相同的结果,仔细观察运行的日志,会发现在代码执行前有段额外的输出,如下图中红色框中的内容,scripty 在实际执行的时候会把执行的命令内容打印出来,方便调试:

高级技巧

scripty 比上面演示的要更强大,也支持通配符运行、脚本并行等特性、静默模式,如果有需求可以阅读官方的 README.md,毕竟咱们已经入门了,不是么?


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


上一篇:高阶篇 01:实现 npm script 跨平台兼容下一篇:高阶篇 03:用 node.js 脚本替代复杂的 npm script

把庞大的 npm script 拆到单独文件中相关推荐

  1. [转]npm生成的package.json文件中依赖项版本号前的波浪号(~)和插入符号(^)是啥意思?

    package.json一般也就长这么模样: {"name": "","description": "","v ...

  2. npm生成的package.json文件中依赖项版本号前的波浪号(~)和插入符号(^)是啥意思?

    package.json一般也就长这么模样: {"name": "","description": "","v ...

  3. 实现 npm script 跨平台兼容

    实现 npm script 跨平台兼容 到目前为止,如果你在 Linux.Mac 平台做开发,所有的 npm script 都会顺利运行,但是 Windows 下面的同学可能就比较痛苦了,因为不是所有 ...

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

    用 node.js 脚本替代复杂的 npm script Node.js 丰富的生态能赋予我们更强的能力,对于前端工程师来说,使用 Node.js 来编写复杂的 npm script 具有明显的 2 ...

  5. npm script 的实践

    打包环节 要实现 假设我们的项目结构是这样的 src ├── images │ ├── a.png │ └── b.png ├── index.html ├── scripts │ └── index ...

  6. npm run buil构建后页面白屏_从Npm Script到Webpack,6种常见的前端构建工具对比

    从Npm Script到Webpack,6种常见的前端构建工具对比 小编说:历史上先后出现了一系列构建工具,它们各有优缺点.由于前端工程师很熟悉JavaScript,Node.js又可以胜任所有构建需 ...

  7. 从Npm Script到Webpack,6种常见的前端构建工具对比

    从Npm Script到Webpack,6种常见的前端构建工具对比 小编说:历史上先后出现了一系列构建工具,它们各有优缺点.由于前端工程师很熟悉JavaScript,Node.js又可以胜任所有构建需 ...

  8. 实现 npm script 命令自动补全

    实现 npm script 命令自动补全 当 npm script 里面积累的命令越来越多时,重度命令行用户肯定会好奇,能不能实现类似 bash.zsh 里面的命令自动补全?答案是肯定的,下面来逐一介 ...

  9. 给 npm script 传递参数和添加注释

    给 npm script 传递参数和添加注释 本小节会介绍 3 个知识点:给 npm script 传递参数以减少重复的 npm script:增加注释提高 npm script 脚本的可读性:控制运 ...

最新文章

  1. 在ATS 5.3.0上测试域名统计插件channel_stats
  2. poj1651(区间dp)
  3. 基于沙盒环境,安装python3.6
  4. 正确使用Core Data多线程的3种方式
  5. 操作系统第一章作业(2020@usc)
  6. stcisp一直检测单片机_三种方法对比:STC51单片机实现免冷启动
  7. hadoop学习之:Map、Reduce详解
  8. oracle错误:1067进程意外终止
  9. 使用.Net 1.1的项目,TreeView控件不能正常显示
  10. 给matlab图加图注,matlab学习5-数据可视化4-gai.ppt
  11. 数据结构期末复习之归并排序和基数排序
  12. 12306 登录验证数据下载(未标定)
  13. python MySQL操作(增删改查)
  14. 求问解决方法,感激不尽
  15. 外星人 AW3423DWF 评测
  16. 【程序人生】:一些编程语言及发展方向
  17. mybatis之(Oracle,MySql)批量更新
  18. PostgreSQL中的查询:1.查询执行阶段
  19. 选择、操作web元素-2
  20. uboot环境变量保存到EMMC

热门文章

  1. 2款在线FM音乐聚合播放PHP源码 带搜索
  2. GIT学习笔记1--基本使用
  3. 袁大头 如何辨别假货
  4. 无处不在的xss攻击
  5. CyberArticle和Live Writer的比较
  6. MongoDB 教程索引 (附有视频)
  7. 如何使用社会化媒体网络建立个人品牌(国外篇)
  8. 使用 jQuery Mobile 与 HTML5 开发 Web App (十五) —— jQuery Mobile 与响应式
  9. 针对文字加密的简单 JS 加密算法 --进制乱序法改良版
  10. 轻量级的 JavaScript 弹出框脚本:TinyBox