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

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

工程提效 | 前端工程化并行解决方案-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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

软件预构艺术(中文版)

软件预构艺术(中文版)

Ken Pugh / O'Reilly Taiwan公司 / 东南大学 / 2010-6 / 26.00元

利用经验累积而得到的洞察力开发新的解决方案被称为预构。透过重构而获得的专业知识也属于这类经验,而预构的词源即重构。重构是修改程序或软件系统内部结构的实践,以此在保留其现有行为的基础上改良设计。重构的原因有多种:方便后期增加功能、提高可维护性、提升性能。 本书作者是经验老道的软件开发人员。书中,作者运用他个人和其他众多开发人员的丰富经验,展示由其推衍而得的各项实践方针。这些方针把优秀的开发人员......一起来看看 《软件预构艺术(中文版)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具