优化 NPM 脚本

有时候,运行一个工程,可能需要执行多个脚本。如需要执行客户端代码的 webpack 打包,还要执行服务端代码的 webpack 打包,当服务端代码进行 webpack 进行打包后,还要重新启动服务器等。
本文就是基于这样一个需求,使用 npm-run-allbetter-npm-runnodemon 来优化 NPM 脚本。

基本配置

先满足最基本的需求:配置客户端和服务端代码的 webpack 打包命令:

{
...
"scripts": {
    "run:server":"node dist/server.js",
    "dev:server": "cross-env PLANTFORM=SERVER ENV=DEVELOPMENT webpack --config build/webpack.config.js --watch",
    "dev:client": "cross-env PLANTFORM=CLIENT ENV=DEVELOPMENT  webpack --config build/webpack.config.js --watch",
    "build:server": "cross-env PLANTFORM=SERVER ENV=PRODUCTION webpack --config build/webpack.config",
    "build:client": "cross-env PLANTFORM=CLIENT ENV=PRODUCTION webpack --config build/webpack.config",
    "update:check": "ncu",
    "update": "ncu -a"
  }
...
}

在命令行执行 npm run dev:servernpm run dev:client 分别可以在服务端和客户端使用 webpack 打包,并自动监听文件变化。执行 npm run build:servernpm run build:client 分别可以在服务端和客户端执行生产环境构建。
执行 npm run run:server 可以运行服务器。
另外 update:checkupdate 两个命令分别用来检查 package.json 中依赖包的更新版本和强制更新 package.json 中的依赖。
配置完上面的命令后,就可以用来进行开发了。但是使用还比较麻烦:客户端和服务端的构建,需要分别开启两个命令行窗口,再加上启动 Node 服务的窗口,一共三个窗口。同时,当服务端构建的代码发生变化后,无法自动重启服务器,需要手动停止再运行服务,可谓相当麻烦。

服务器自动重启

让我们先来解决服务器自动重启的问题,这需要用到nodemon 这个包,类似的还有supervisor这个包,后面这个包有一段历史了,但是作者已经很久没有更新了。推荐使用nodemon
借助nodemon,优化NPM脚本:

{
...
"scripts": {
    "run:server":"nodemon --watch dist --exec node dist/server.js",
    ...
  }
...
}

现在,当 dist 目录发生变化,就可以自动重启服务器了。

命令并行执行

借助 nodemon,解决了服务器自动重启的问题,但是三个命令行窗口还是很麻烦,我们可以借助 npm-run-all 这个包,来让三个命令在一个命令行窗口中运行:

{
...
"scripts": {
    "start": "npm-run-all --parallel dev:* run:server",
    "build": "npm-run-all --parallel build:*",
    ···
  }
...
}

我们在 scripts 中加了一个 startbuild 命令,运行 npm run startnpm run build 就可以实现在一个命令行窗口中,并行执行开发和生产环境中的命令。
--parallel 用来指定哪些命令需要并行执行,支持通配符。

优化脚本

上面我们已经完成了想要的功能:服务器自动重启和命令并行执行。乍看 scripts 中的命令,很长很凌乱。对于这个问题,可以借助better-npm-run 这个包来进行优化:

{
···
 "scripts": {
    "start": "better-npm-run start",
    "build": "better-npm-run build",
    "dev:server": "better-npm-run  dev:server",
    "dev:client": "better-npm-run dev:client",
    "build:server": "better-npm-run build:server",
    "build:client": "better-npm-run build:client",
    "run:server": "better-npm-run run:server",
    "update:check": "better-npm-run update:check",
    "update": "better-npm-run update"
  },
  "betterScripts":{
    "start": "npm-run-all --parallel dev:* run:server",
    "build": "npm-run-all --parallel build:*",
    "run:server": "nodemon --watch dist --exec node dist/server.js",
    "update:check": "ncu",
    "update": "ncu -a",
    "dev:server":{
      "command":"webpack --config build/webpack.config.js --watch",
      "env":{
        "PLANTFORM":"SERVER",
        "ENV":"DEVELOPMENT"
      }
    },
    "dev:client":{
      "command":"webpack --config build/webpack.config.js --watch",
      "env":{
        "PLANTFORM":"CLIENT",
        "ENV":"DEVELOPMENT"
      }
    },
    "build:server":{
      "command":"webpack --config build/webpack.config.js",
      "env":{
        "PLANTFORM":"SERVER",
        "ENV":"PRODUCTION"
      }
    },
    "build:client":{
      "command":"webpack --config build/webpack.config.js",
      "env":{
        "PLANTFORM":"CLIENT",
        "ENV":"PRODUCTION"
      }
    }
  },
···
}

通过better-npm-run这个包,我们把脚本命令写得更具有层次感,虽然代码量增加了,但结构更加清晰。

完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267