一.Shell && Shelljs
码农界存在着无数条鄙视链,linux
使用者对windows
的鄙视便是其中之一,cli
使用者对GUI
用户的嘲讽也是如此,在这样一个讲究逼格的时代,如果你的桌面上没有一个小黑窗时不时地从下往上翻滚并抛出一些亮绿色的字符串,你真不好意思跟人打招呼。而前端
这种天生几乎不用和命令行打交道的物种,自然再一次莫名其妙地处在了鄙视链的末端,没错,是再一次。
Shell
是linux
下的脚本语言解析器,拥有丰富且强大的底层操作权限。Shelljs
就是基于node
的一层命令封装插件,让前端开发者可以不依赖linux
也不依赖类似于cmder
的转换工具,而是直接在我们最熟悉不过的javascript
代码中编写shell
命令实现功能。
二.前端开发人员学Shelljs干嘛
shell
跟自动化
是强相关的,个人理解其用途主要是两方面:
- 1.从业务逻辑的需求来看,
shelljs
并不是什么具有非凡意义的插件,它只是对node
的底层API进行了一些封装,方便我们以类似shell
的语法去编写代码梳理逻辑,实现一些业务逻辑需求,如果你所在的项目组恰好需要这样的能力,用它会很方便;
- 2.
cli
相对于GUI
或许是更快,但它依然是一种重复劳作,有了shelljs和全栈能力,开发者可以将团队中耗时的重复性常规动作编写为自动化脚本,并利用前端的天然优势为其配备GUI
,用页面上的一键点击来替代重复劳作,在紧张的开发节奏中,平均每天为你节约个30-40分钟起来走走喝杯水难道不好吗?
想要一统江湖,大前端的深度和广度是缺一不可的,你可以说你不精通shell,但不要说自己不懂shell,更不要一脸天真地反问面试官“前端还能搞shell?这么神奇?”他不会觉得你对知识有好奇心,只会觉得你很low,哦不对,是大写的LOW.
三.官方示例(包含注释)
废话说完了,开始学习,拿好小本子,我要开车了。
var shell = require('shelljs')
if (!shell.which('git')) {
shell.echo('Sorry, this script requires git');
shell.exit(1);
}
shell.rm('-rf','out/Release');
shell.cp('-R','stuff/','out/Release');
shell.cd('lib');
shell.ls('*.js').forEach(function (file) {
shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file);
shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file);
});
shell.cd('..');
if (shell.exec('git commit -am "Auto-commit"').code !== 0){
shell.echo('Error: Git commit failed');
shell.exit(1);
}
继续阅读shell.js——给node插上隐形的翅膀