如何理解npm scripts中的&&和&任务连接符号?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
本文虽然是以npm scripts
的名义来讨论&&
和&
的区别,但是,大家要理解这个问题的实质是操作系统在命令行里面,对&&
和&
符号的解析的问题。实际上与node
无关,与npm
项目无关。而且,这个问题的讨论结论中,都是有特殊条件的,并不是放之天下皆准则。而市面上的相关文章,都有意或无意的忽略了这个特殊条件。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码感想感悟。本文测试环境:第一个,win10
+node
+npm
。第二个,mac
+node
+npm
。第三个,centos
+node
+npm
。win
系统下,结论是完全不同的。非win
系统下,则是另外一个完全不同的结论。
结论表格
系统 | && | & | on error && | on error & |
---|---|---|---|---|
win10 | 串行 | 串行 | 整体停止执行 | 不影响其它执行 |
mac13 | 串行 | 并行 | 整体停止执行 | 不影响其它执行 |
centos7 | 串行 | 并行 | 整体停止执行 | 不影响其它执行 |
结论是这样的,对于同样的使用&&
或者&
串联的命令:
win
系统总是顺序执行任务。上一个任务没有完成的话,下一个任务也不会开始。mac
/centos
下,&&
是串行执行代码(前一个结束后一个开始),&
则是并行同时执行。
而对于发生错误的情况,测试中的三个系统的测试结果表现一致。
- &&会整体停止执行。
- &则会转入下一个程序执行。
测试代码
分别编辑三个.js
文件,用于演示执行:1.js
:
setInterval(() => {
console.log('1');
if (performance.now()>5000){
throw new Error("1号发生错误");
}
}, 1000);
2.js
:
setInterval(() => {
console.log('2');
if (performance.now()>7000){
throw new Error("2号发生错误");
}
}, 1000);
3.js
:
setInterval(() => {
console.log('3');
if (performance.now()>9000){
throw new Error("3号发生错误");
}
}, 1000);
使用编辑package.json
文件中的scripts
项目。
{
//...
"scripts": {
"test_then": "node 1.js && node 2.js && node 3.js",
"test_and": "node 1.js & node 2.js & node 3.js"
},
//...
}
执行命令
意图为先后顺序的命令:
npm run test_then
意图为同时无先后顺序的命令:
npm run test_and
测试结果 windows
windows
系统下,都是串行执行任务,在任务发生错误后,&&是全盘结束,&只是结束当前任务。
测试结果 mac
mac
系统下,&&是串行,遇到错误全部停止执行。&并行,遇到错误只结束当前任务。
测试结果 centos
centos
系统下,&&是串行,遇到错误全部停止执行。&并行,遇到错误只结束当前任务。
题外话
对于使用&的情况,可能会出现主线程退出后,子任务才有输出的情况。这个情况下,可以在命令行的最后面加个 & wait
即可解决这个问题。例如:
node 1.js & node 2.js & node 3.js & wait
结束语
如果同时使用&&
和&
的话,可以自行推理其效果。更多npm
的使用经验文章,请点击:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。