利用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 相关文章推荐
Js日期选择器并自动加入到输入框中示例代码
Aug 02 Javascript
jquery插件开发之实现md5插件
Mar 17 Javascript
JavaScript中的包装对象介绍
Jan 27 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
Sep 30 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
Jan 27 Javascript
JS实现简易刻度时钟示例代码
Mar 11 Javascript
vue.js全局API之nextTick全面解析
Jul 07 Javascript
Vue.js中extend选项和delimiters选项的比较
Jul 17 Javascript
layer弹出层全屏及关闭方法
Aug 17 Javascript
200行HTML+JavaScript实现年会抽奖程序
Jan 22 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
Jan 26 Javascript
js之ajax文件上传
May 13 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 Mysql编程之高级技巧
2008/08/27 PHP
php中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
jQuery动态添加
2016/04/07 Javascript
Angularjs的Controller间通信机制实例分析
2016/11/07 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
利用原生JS与jQuery实现数字线性变化的动画
2017/02/24 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
前端路由&webpack基础配置详解
2019/06/10 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
Python读取指定目录下指定后缀文件并保存为docx
2017/04/23 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
基于python实现百度翻译功能
2019/05/09 Python
Django 过滤器汇总及自定义过滤器使用详解
2019/07/19 Python
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
吨的认识教学反思
2014/04/27 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
长城导游词400字
2015/01/30 职场文书
农村结婚典礼主持词
2015/06/29 职场文书
中学团支部工作总结
2015/08/13 职场文书
PO模式在selenium自动化测试框架的优势
2022/03/20 Python