工程提效 | 前端工程化并行解决方案-concurrently

栏目: Node.js · 发布时间: 5年前

工程提效 | 前端工程化并行解决方案-concurrently

戳蓝字「 高级前端进阶 」关注我们哦!

工程提效 | 前端工程化并行解决方案-concurrently

编者注:作者是网易资深前端@金炳,当前负责网易严选自研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左右

工程提效 | 前端工程化并行解决方案-concurrently
image.png

周下载量:39万

工程提效 | 前端工程化并行解决方案-concurrently
image.png

二、安装

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程序:

image.png

然后当我们ctrl + c后,他就会把两个进程都停止了。

image.png

方式1:

如果我们在package.json里面则要注意引号的问题:

"start": "concurrently \"command1 arg\" \"command2 arg\""

就是将"变成\".

方式2:

工程提效 | 前端工程化并行解决方案-concurrently
image.png

然后我们要让这个进行并行有两个方式,在命令行执行:

工程提效 | 前端工程化并行解决方案-concurrently
image.png

或者:

工程提效 | 前端工程化并行解决方案-concurrently
image.png

这块-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.

工程提效 | 前端工程化并行解决方案-concurrently
image.png

上面的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"

我们会看到报错,但是程序不会退出。

工程提效 | 前端工程化并行解决方案-concurrently
image.png

然后当我们再按ctrl + c后,效果如下:

工程提效 | 前端工程化并行解决方案-concurrently
image.png

所以得出一个结论:当我们有一个进程返回失败的话,总体会进入fail的callback中。

工程提效 | 前端工程化并行解决方案-concurrently
image.png

四、原理

4.1 启动进程原理

工程提效 | 前端工程化并行解决方案-concurrently
image.png

这块代码比较好理解,这块基本是用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失败?

工程提效 | 前端工程化并行解决方案-concurrently
image.png

我们可以通过killOthers这个参数来解决。

这样当我们有一个程序失败,则直接进入fail callback。也就把所有进程关闭了。

6.2 当一个进程起来失败,但是有可能是跟另外进程有关,这时候需要尝试几次?

工程提效 | 前端工程化并行解决方案-concurrently
image.png
这种情况,如上比如npm:index能启动的,npm:hello不能启动,虽然试了三次npm:hello,一直失败, 但整体最终不会退出,只有我们按ctrl + c才有用,相当于killOthers就失效了。

六、参考文档

  1. grafana的前端源码里面有用: https://github.com/grafana/grafana

  2. npm官网的readme: https://www.npmjs.com/package/concurrently

  3. github的源码: https://github.com/kimmobrunfeldt/concurrently

工程提效 | 前端工程化并行解决方案-concurrently


以上所述就是小编给大家介绍的《工程提效 | 前端工程化并行解决方案-concurrently》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入理解OpenCV

深入理解OpenCV

[巴西]Daniel Lelis Baggio / 刘波 / 机械工业出版社 / 2014-9 / 59

opencv是最常见的计算机视觉库之一,它提供了许多经过优化的复杂算法。本书对已掌握基本opencv技术同时想提高计算机视觉的实践经验的开发者来讲是一本非常好的书。每章都有一个单独的项目,其背景也在这些章节中进行了介绍。因此,读者可以依次学习这些项目,也可以直接跳到感兴趣的项目进行学习。 《深入理解opencv:实用计算机视觉项目解析》详细讲解9个实用的计算机视觉项目,通过本书的学习,读者可......一起来看看 《深入理解OpenCV》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具