利用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 相关文章推荐
Document.location.href和.replace的区别示例介绍
Mar 04 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
Sep 26 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
Mar 03 Javascript
JavaScript返回上一页的三种方法及区别介绍
Jul 04 Javascript
javascript之Array 数组对象详解
Jun 07 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
Jul 01 Javascript
jQuery实现搜索页面关键字的功能
Feb 16 Javascript
关于vue.js过渡css类名的理解(推荐)
Apr 10 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
May 18 Javascript
关于vue中的ajax请求和axios包问题
Apr 19 Javascript
看看“疫苗查询”小程序有温度的代码
Jul 31 Javascript
javascript遍历对象的五种方式实例代码
Oct 24 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
使用php4加速网络传输
2006/10/09 PHP
PHP采集腾讯微博的实现代码
2012/01/19 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
浅析LigerUi开发中谨慎载入common.css文件
2013/07/09 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
js读取配置文件自写
2014/02/11 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
jquery实现弹出层效果实例
2015/05/19 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
JavaScript数组操作函数汇总
2016/08/05 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
使用D3.js创建物流地图的示例代码
2018/01/27 Javascript
微信小程序wepy框架学习和使用心得详解
2019/05/24 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
[01:29:46]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第二局
2016/02/27 DOTA
Python Grid使用和布局详解
2018/06/30 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
自荐信封面
2013/12/04 职场文书
人力资源部副职的竞聘演讲稿
2014/01/07 职场文书
消防安全检查制度
2014/02/04 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
党员承诺书范文2015
2015/04/27 职场文书
2015年七一建党节活动方案
2015/05/05 职场文书
庆七一晚会主持词
2015/06/30 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
Linux安装apache服务器的配置过程
2021/11/27 Servers
Python绘制散乱的点构成的图的方法
2022/04/21 Python