利用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 相关文章推荐
把textarea中字符串里含有的回车换行替换成<br>的javascript代码
Apr 20 Javascript
JScript中使用ADODB.Stream判断文件编码的代码
Jun 09 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
Feb 11 Javascript
DIV始终居中的js代码
Feb 17 Javascript
AngularJs学习第八篇 过滤器filter创建
Jun 08 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
Mar 31 Javascript
利用types增强vscode中js代码提示功能详解
Jul 07 Javascript
Bootstrap与Angularjs的模态框实例代码
Aug 03 Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
Jul 05 Javascript
js计算两个时间差 天 时 分 秒 毫秒的代码
May 21 Javascript
Vue 技巧之控制父类的 slot
Feb 24 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
Jul 30 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
c#中的实现php中的preg_replace
2009/12/21 PHP
PHP中的integer类型使用分析
2010/07/27 PHP
深入解析php中的foreach函数
2013/08/31 PHP
php 启动报错如何解决
2014/01/17 PHP
php数组使用规则分析
2015/02/27 PHP
提高代码性能技巧谈—以创建千行表格为例
2006/07/01 Javascript
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
js渐变显示渐变消失示例代码
2013/08/01 Javascript
理解javascript封装
2016/02/23 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
MockJs结合json-server模拟后台数据
2020/08/26 Javascript
jquery获取input输入框中的值
2019/11/13 jQuery
JS使用Chrome浏览器实现调试线上代码
2020/07/23 Javascript
Vue props中Object和Array设置默认值操作
2020/07/30 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
2019/04/29 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
python pyinstaller打包exe报错的解决方法
2019/11/02 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
工业设计专业推荐信
2013/10/29 职场文书
测试工程师岗位职责
2013/11/28 职场文书
爱心捐款倡议书
2014/04/14 职场文书
协议书样本
2014/04/23 职场文书
家具公司总经理岗位职责
2014/07/08 职场文书
人口与计划生育责任书
2015/05/09 职场文书
2016年大学生就业指导课心得体会
2015/10/09 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
Python数据分析入门之数据读取与存储
2021/05/13 Python