介绍
在前端开发中,常常需要进行命令行操作,比如打包、部署等,而这些操作可以通过使用Shelljs来实现。@platform-os/shelljs
是一个基于Node.js的轻量级库,该库仿照Unix shell命令的形式编写,提供了一组简单的、可跨平台的API来操作命令行。使用该库可以方便地在Node.js环境下执行命令行任务,避免了在终端中手动敲命令的繁琐操作。
安装
在项目中使用npm安装@platform-os/shelljs
,并将其保存在依赖项中。
npm install @platform-os/shelljs --save
基本用法
执行命令
require('shelljs/global'); // 向全局环境中添加shelljs方法 const result = exec('ls -l'); // 执行Linux平台上的"ls -l"命令 console.log(result.stdout); // 输出命令行的标准输出(stdout)
上述代码已经默认添加了全局的shelljs方法,在脚本中可以直接使用exec
等方法,执行命令行操作。上述代码先是执行ls -l
命令,然后获取该命令的输出,并将其打印到控制台中。
处理结果
运行结果和输出结果的数据类型不同。一般来说,它们都是字符串,但有时它们可能是其他类型。特别是,当执行exec
方法的时候,它会返回一个类似于子进程的实例。ShellJS底层会返回一个子进程,并将其stdout/stderr/stdin流连接到Shell脚本。这个方法的返回值是这个子进程的一个代表,但只有在这个子进程退出后,你才能获取到子进程的退出码、stdout和stderr。因此需要在exec
方法前面添加sync,来让其执行并等待命令执行完毕。
-- -------------------- ---- ------- -------------------------- -- ----------------- -- --------------- - -- ---------- ------------ ---- ------ -------- ------ -------- -- ------------------------ - -- ------ ----- ------ - --------- ----------- -------- --------------------- ----- ------- - ------ - ------ - ------ ---------------------------------
上述代码在执行命令行操作前,先检测git是否已经安装。在执行命令时,为了不输出执行信息,使用了{silent: true}
参数。接着,获取命令行的标准输出,并通过trim
方法去掉命令行输出的首尾空格。最后输出运行结果。
判断命令是否存在
ShellJS提供了一个非常有用的方法which
,可以检测是否安装了指定的命令。如果返回的结果是一个非空字符串,则表示该命令存在,否则不存在。在判断命令是否存在时,可以使用which
方法。
-- -------------------- ---- ------- -------------------------- -- ----------------- -- -------------- - -- ----------------- ---------------- --------- ----- ------------------------------------------------- - ---- - -- ---------- ----------------- -------- -
上述代码检测系统中是否安装了git命令,如果安装了,则执行git clone操作。否则,输出错误提示信息并退出进程。这个判断命令是否存在的方法,常常在安装依赖包以及执行打包、上传等操作时使用。
错误处理
当执行命令过程中发生错误时,Shelljs提供了error
对象来表示错误。使用exec
方法可以获取命令行返回的错误信息。
require('shelljs/global'); // 向全局环境中添加shelljs方法 const result = exec('git commit -m “commit message”', {silent: true}); // 必须使用sync参数,否则不会报错 if (result.code !== 0) { // 判断退出状态码是否为0 echo(result.stderr); // 输出错误信息 exit(1); }
引入其他方法
按需引入ShellJS中的方法,可以提高代码的执行效率。
const { ls, echo } = require('shelljs'); // 打印文件名 const fileName = 'app.js'; const files = ls(fileName); echo(files);
上述代码仅引入了ls
和echo
方法,以减少代码量和提高执行效率。
执行管道操作
ShellJS支持Linux平台上的管道操作。比如,上一个命令的结果作为下一个命令的参数,实现链式操作。
const result = shell.ls('-R', './tmp/*') .grep(/file\.txt/) .sed(/\..*$/, '') .sort(); console.log(result.stdout);
上述代码,首先列出以./tmp
开头的目录下的所有文件和目录,然后通过grep命令筛选出所有名字含有file.txt
文件,再通过sed方法将文件后缀中的字符串替换为空,最后用sort方法进行排序。
示例代码
下面给出几个具体的例子,帮助你更快地了解@platform-os/shelljs
的使用方法。
例子1:文件拷贝
-- -------------------- ---- ------- -------------------------- -- ----------- ----- ------ - ------ ----- ------- - ------- -- ------------ -------- - -- ----------- ---------------- -------- - -- ------------ --------- - -- ------------------ --------------- - ----- ---- - -------- ---------------- -- ------------- ---------------- -- - ----- ----------- - ------------------- --------- ----------- ------------- -- --------- -------- ----------- ------------- -- ---------- ---
在上述脚本中,首先获取了src文件夹下的所有子目录,然后通过遍历子目录,将所有子目录的文件拷贝到对应的目标文件夹中。
例子2:文件合并
-- -------------------- ---- ------- -------------------------- ----- ------------ - ---------- ----- -------- - - ------------ ------------- ------------- ----------------- -- --- ----------- - --- --------------------- -- - ----------- -- ------------------- ----------- -- ------- --- ---------------------------------------------
在上述脚本中,首先定义了要合并文件的目录和文件名。然后,通过循环遍历,找到目标文件夹中需要合并的文件,将其内容存入fileContent
中,并通过echo
方法将fileContent
输出到对应的目标文件夹中。
例子3:文件压缩
-- -------------------- ---- ------- -------------------------- ----- -- - -------------- ----- ---- - ---------------- ----- -------- - ------------------------------- -- ------ ----- -------------- - ------------------------------------ -- ------ ----- ---------- - -------------------------- -- -------- ----- ------------ - -------------------- -- ------------ ------------------------------ - -- ----- --------- ----- -- ------ ------- - ----------- ---- -- -------- ------- ----- ----- - -- ------ -------------------------------- -------------- -- --------------
上述脚本将指定的文件进行压缩,并将压缩后的代码存入输出文件夹中。在脚本中,通过fs
模块对文件进行读写,通过uglify-js
对指定的js文件进行压缩。
总结
在前端开发过程中,使用ShellJS可以方便地在Node.js中执行命令行任务,包括打包、上传、安装依赖等操作。通过@platform-os/shelljs
,我们可以轻松地执行需要的操作,且不需要手动敲入命令。同时,ShellJS还提供了一系列常用的方法,比如全局方法、文件拷贝、文件合并、文件压缩等,让我们的开发更加高效。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6006734b890c4f727758376e