利用Node.js编写跨平台的spawn语句详解


Posted in Javascript onFebruary 12, 2017

前言

Node.js 是跨平台的,也就是说它能运行在 Windows、OSX 和 Linux 平台上。很多 Node.js 开发者都是在 OSX 上做开发的,然后再将代码部署到 Linux 服务器上。由于 OSX 和 Linux 都是基于 Unix 的,因此两者共性很多。Windows 也是 Node.js 官方支持的平台,只要你通过正确的方式写代码,就能在各个平台上毫无压力的跑起来。

Node.js 的子进程 (child_process) 模块下有一 spawn 函数,可以用于调用系统上的命令,如在 Linux, macOS 等系统上,我们可以执行

const spawn = require('child_process').spawn;

spawn('npm', {
 stdio: 'inherit'
});

来调用 npm 命令。

然而,同样的语句在 Windows 上执行则会报错。

Error: spawn npm ENOENT
 at exports._errnoException (util.js:855:11)
 at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32)
 at onErrorNT (internal/child_process.js:344:16)
 at nextTickCallbackWith2Args (node.js:455:9)
 at process._tickCallback (node.js:369:17)
 at Function.Module.runMain (module.js:432:11)
 at startup (node.js:141:18)
 at node.js:980:3

因为在 Windows 上,当我们执行 npm 时,我们实际执行的是 npm.cmd 批处理,而在 Windows 上, .cmd,  .bat 批处理是无法脱离 cmd.exe 这一解释器而单独运行的。

因此,我们需要显式地调用 cmd

spawn('cmd', ['/c', 'npm'], {
 stdio: 'inherit'
});

或者使用在调用 spawn 函数时,设置 shell 选项为 true 以隐式地调用 cmd (该选项添加自 Node.js v6 版本)

spawn('npm', {
 stdio: 'inherit',
 shell: true
});

另外,虽然在 Linux, macOS 等系统上不需要设置 shell 选项,命令也能够正常执行;设置 shell true 也不会妨碍命令的执行,只是会额外的产生一个本不必要的 shell 进程,影响性能。

因此,如果想要编写跨平台的 spawn 命令,而又不想增加额外的开销的话,可以这样写

const process = require('process');
const { spawn } = require('child_process');

spawn('npm', {
 stdio: 'inherit',
 // 仅在当前运行环境为 Windows 时,才使用 shell
 shell: process.platform === 'win32'
});

第三方模块 cross-spawn

关于 spawn 函数的跨平台写法,除了自己编写代码的时候做处理,也有第三方模块封装好了相关细节,如 cross-spawn。

使用该模块,可以在调用 spawn 函数时,自动根据当前的运行平台,来决定是否生成一个 shell 来执行所给的命令。

而且,还能够

  • 支持低于 v6 的 Node.js 版本 (使用 shell 选项需要至少 Node.js v6);
  • 跨平台地支持 shebang;
  • 对命令和参数中的字符进行转义更为方便。

安装

npm install cross-spawn

用法

const spawn = require('cross-spawn');

spawn('npm', {
 stdio: 'inherit'
});

参考文档

在 Windows 上衍生 .bat 和 .cmd 文件

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
jscript之Read an Excel Spreadsheet
Jun 13 Javascript
JS对URL字符串进行编码/解码分析
Oct 25 Javascript
js判断客户端是iOS还是Android等移动终端的方法
Dec 11 Javascript
延时加载JavaScript代码提高速度
Dec 27 Javascript
jQuery EasyUI Tab 选项卡问题小结
Aug 16 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
Feb 16 Javascript
在js中做数字字符串补0(js补零)
Mar 25 Javascript
Node.js pipe实现源码解析
Aug 12 Javascript
前端常见跨域解决方案(全)
Sep 19 Javascript
在小程序中使用Echart图表的示例代码
Aug 02 Javascript
Vue.js仿Select下拉框效果
Feb 18 Javascript
使用PDF.js渲染canvas实现预览pdf的效果示例
Apr 17 Javascript
超全面的vue.js使用总结
Feb 12 #Javascript
Vue-Router实现页面正在加载特效方法示例
Feb 12 #Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
Feb 11 #Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
Feb 11 #Javascript
JavaScript实现瀑布流以及加载效果
Feb 11 #Javascript
JavaScript表单验证的两种实现方法
Feb 11 #Javascript
jQuery实现复制到粘贴板功能
Feb 11 #Javascript
You might like
基于mysql的论坛(7)
2006/10/09 PHP
php 中文字符入库或显示乱码问题的解决方法
2010/04/12 PHP
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
javascript数组的使用
2013/03/28 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
PHP守护进程实例
2015/03/06 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
基于Bootstrap仿淘宝分页控件实现代码
2016/11/07 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
NodeJS实现一个聊天室功能
2019/11/25 NodeJs
Vue+Spring Boot简单用户登录(附Demo)
2020/11/12 Javascript
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
python 求10个数的平均数实例
2019/12/16 Python
openCV提取图像中的矩形区域
2020/07/21 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
幸福家庭事迹材料
2014/02/03 职场文书
党员党性分析材料
2014/02/17 职场文书
婚纱店策划方案
2014/05/22 职场文书
环卫工人节活动总结
2014/08/29 职场文书
医德考评自我评价
2014/09/14 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
爱鸟护鸟的宣传语
2015/07/13 职场文书
办公用品管理制度
2015/08/04 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书