戳蓝字「 高级前端进阶 」关注我们哦!
编者注:作者是网易资深前端@金炳,当前负责网易严选自研Node框架建设工作。做过前端、后端、产品设计,是一名全栈工程师。目前致力于Node应用框架研究开发与生态建设,实践Node应用在Serverless、Faas场景下的迁移和落地,探索Service Mesh在Node应用中的价值。
原文:https://zhuanlan.zhihu.com/p/65564606(点击『阅读原文』查看)
一、介绍
主要是方便我们写前端工程化的时候,我们可以同时启动多个命令用。
比如我的前端代码运行起来,既要有一个web工程,同时又要启动一个mock进程。这时候我们就可以使用这个并行解决方案。
文档地址:https://www.npmjs.com/package/concurrently
github地址:https://github.com/kimmobrunfeldt/concurrently
截止2019年5月13日.
各项指标: star数量2669,issue数量在100左右
周下载量:39万
二、安装
2.1 全局安装
npm install concurrently -g
2.2 项目安装
npm install concurrently -D
以上果是开发阶段写 工具 用的时候的安装方法。
如果比如node项目在生产环境使用则用以下安装方法:
npm install concurrently -S
三、使用方法
3.1 命令行使用方式
语法:
concurrently "command1 arg" "command2 arg"
比如我要启动两个node程序:
然后当我们ctrl + c后,他就会把两个进程都停止了。
方式1:
如果我们在package.json里面则要注意引号的问题:
"start": "concurrently \"command1 arg\" \"command2 arg\""
就是将"变成\".
方式2:
然后我们要让这个进行并行有两个方式,在命令行执行:
或者:
这块-n之后的两个单词,只能用,间隔,不能加空格。
方式三:
如果我们的package.json里面有以下三个watch类型的
{
//...
"scripts": {
// ...
"watch-js": "...",
"watch-css": "...",
"watch-node": "...",
// ...
},
// ...
}
那可以批量执行的方式:
concurrently "npm:watch-*" # Equivalent to: concurrently -n js,css,node "npm run watch-js" "npm run watch-css" "npm run watch-node" # Any name provided for the wildcard command will be used as a prefix to the wildcard # part of the script name: concurrently -n w: npm:watch-* # Equivalent to: concurrently -n w:js,w:css,w:node "npm run watch-js" "npm run watch-css" "npm run watch-node"
3.2 代码方式使用
3.2.1 构建成功场景
然后我们可以书写一个node程序来调用concurrently。
我们写一个main.js的代码
var concurrently = require('concurrently');
concurrently(['npm:index', "npm:hello"]).then(()=>{
console.log("success");
}, ()=>{
console.log("fail")
});
然后它的效果,就是concurrently "npm:index" "npm:hello"
然后当我们按了ctrl + c之后,他会打出success.
上面的index和hello对应的代码是:
index:
var koa = require('koa');
var axios = require('axios')
const app = new koa();
app.use(async (ctx, next)=>{
ctx.body = (await axios.get("http://127.0.0.1:8001/hello")).data;
})
app.listen(8000)
hello:
var koa = require('koa');
const app = new koa();
app.use((ctx, next)=>{
ctx.body = 'hello world2';
})
app.listen(8001)
3.2.2 构建失败场景
我们修改上面的hello的代码:
hello:
var koa = require('koa');
const app = new koa();
app.use((ctx, next)=>{
ctx.body = 'hello world2';
})
process.exit(-1);
然后我们在运行"node ./main.js"
我们会看到报错,但是程序不会退出。
然后当我们再按ctrl + c后,效果如下:
所以得出一个结论:当我们有一个进程返回失败的话,总体会进入fail的callback中。
四、原理
4.1 启动进程原理
这块代码比较好理解,这块基本是用spawn去启动进程。
但是这块关于nodejs中,应用了rxjs,这个有学习的地方。
就是后期在node代码中也可以看看rxjs的应用。
5.2 启动进程的spawn
默认使用的是spawn-command,同时我们也可以传入我们的options.spawn来替换。
5.3 如何杀进程
通过treeKill这个npm包来处理。
五、应用场景
5.1 开发工具
比如当我们跑npm run start的时候,我们同时需要让sass编译,同时webpack也要跑hot 模式,则这个使用可以使用concurrently运行这两个command。
这块我们可以查看grafana里面的前端代码中,关于工具这块代码查看一下就可以看到这块的使用。
grafana地址: https://github.com/grafana/grafana
六、常见需求
6.1 当一个进程起来失败,整体concurrently失败?
我们可以通过killOthers这个参数来解决。
这样当我们有一个程序失败,则直接进入fail callback。也就把所有进程关闭了。
6.2 当一个进程起来失败,但是有可能是跟另外进程有关,这时候需要尝试几次?
六、参考文档
-
grafana的前端源码里面有用: https://github.com/grafana/grafana
-
npm官网的readme: https://www.npmjs.com/package/concurrently
-
github的源码: https://github.com/kimmobrunfeldt/concurrently
以上所述就是小编给大家介绍的《工程提效 | 前端工程化并行解决方案-concurrently》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learn Python the Hard Way
Zed Shaw / Example Product Manufacturer / 2011
This is a very beginner book for people who want to learn to code. If you can already code then the book will probably drive you insane. It's intended for people who have no coding chops to build up t......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!