浅谈node如何优雅地获取mac系统版本

 更新时间:2023年06月01日 08:38:18   作者:格子熊  
这篇文章主要和大家聊聊node如何优雅地获取mac系统版本,文中有详细的代码示例和流程步骤,对我们学习或工作有一定的帮助,需要的朋友可以参考下

背景

今天突然碰到了一个兼容性需求,需要根据不同 macOS 版本,进行不同的兼容性处理。

没想到看似简单的需求,中间也经历了一番波折,好在最后解决了问题。

在此记录一下解决问题的过程,也方便其他有类似需求的同学参考。

获取系统类型

既然需要针对 mac 系统进行兼容性处理,首先需要区分系统类型,好在 node 提供了相关的 API,只需使用 os.platform() 即可直接获取系统类型。

import { platform } from 'os';
console.log(platform()); // 'darwin'

值得一提的是,macOS 对应的名称不是 macOS 而是 darwin

除了可以通过 os 这个包获取系统类型,我们还可以通过 process.platform 来获取。

import { platform } from 'process';
console.log(platform); // 'darwin'

获取系统版本

很多熟悉 node 的同学这时候会说了,可以通过 os.release() 快速获取系统版本。但是,当你执行 os.release() ,你会发现,它的结果并符合常规认知。

比如,我的系统版本是 12.0.1,但是,os.release() 的执行结果却是 21.1.0

查看 node 官方文档可以发现,node 是通过 uname(3) 来确定操作系统的,所以执行结果比较违背常规认知。

通过命令行获取系统版本

既然 os.release() 获取的系统版本很难让人理解,那么有没有什么方案可以直接获取实际的系统版本号呢?

mac 上存在 sw_vers 命令,可以直接获取系统信息。

$ sw_vers
ProductName:    macOS
ProductVersion: 12.0.1
BuildVersion:   21A559

可以看到 sw_vers 命令直接获取到了系统版本:12.0.1 。

如果不需要其他系统信息,我们可以通过添加命令行参数,过滤命令行结果,直接获取系统版本。

$ sw_vers -ProductVersion
12.0.1

由于命令行不区分大小写,所以命令行参数无所谓大小写,你也可以写成 -productversion 或者 -ProductVersion

既然知道命令行怎么写,接下来我们只需要在 node 中调用命令行即可。

import { execSync } from 'child_process';
console.log(execSync('sw_vers -ProductVersion', { encoding: 'utf-8' })); // 12.0.1

优雅地获取系统版本

通过 node 子进程执行命令行命令,可以获取正确的系统版本。但是这种方式有着性能方面的缺陷,需要创建子进程执行命令行,相对于 os.release() 的方式,开销较大。

之前使用 os.release() 的问题在于返回结果比较违反常规认知,但是它的结果其实是正确的,只不过需要进行一次映射。

所以,通过 os.release() 配合映射表即可优雅地获取系统版本。

import os from 'os';
const macVersionMap = new Map([
  [21, ['Monterey', '12']],
  [20, ['Big Sur', '11']],
  [19, ['Catalina', '10.15']],
  [18, ['Mojave', '10.14']],
  [17, ['High Sierra', '10.13']],
  [16, ['Sierra', '10.12']],
  [15, ['El Capitan', '10.11']],
  [14, ['Yosemite', '10.10']],
  [13, ['Mavericks', '10.9']],
  [12, ['Mountain Lion', '10.8']],
  [11, ['Lion', '10.7']],
  [10, ['Snow Leopard', '10.6']],
  [9, ['Leopard', '10.5']],
  [8, ['Tiger', '10.4']],
  [7, ['Panther', '10.3']],
  [6, ['Jaguar', '10.2']],
  [5, ['Puma', '10.1']],
]);
const getMacRelease = (release: string) => {
  const macRelease = release ?? os.release();
  const firstReleaseVersion = Number(macRelease.split('.')[0]);
  const [name, version] = macVersionMap.get(firstReleaseVersion) || [
    'Unknown',
    '',
  ];
  return {
    name,
    version,
  };
};
console.log(getMacRelease()) // 12

为了方便 mac 新发布系统后依然能够识别,将新系统版本名称识别为 Unknow,新版本识别为空字符串。

此举是学习移动端机型打分平台,如果出现版本为空时,默认为高版本,不影响低版本的兼容性处理。

现在,我们就能够通过 node 优雅地获取系统版本啦。

以上就是浅谈node如何优雅地获取mac系统版本的详细内容,更多关于node获取mac系统版本的资料请关注脚本之家其它相关文章!

相关文章

  • Node批量爬取头条视频并保存方法

    Node批量爬取头条视频并保存方法

    在本篇文章中我们给大家介绍了node爬取头条里面的视频,并进行批量保存的方法,有需要的朋友可以测试以下。
    2018-09-09
  • Nodejs之TCP服务端与客户端聊天程序详解

    Nodejs之TCP服务端与客户端聊天程序详解

    这篇文章主要为大家详细介绍了Nodejs之TCP服务端与客户端聊天程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 快速解决brew安装特定版本flow的问题

    快速解决brew安装特定版本flow的问题

    今天小编就为大家分享一篇快速解决brew安装特定版本flow的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • nodejs对express中next函数的一些理解

    nodejs对express中next函数的一些理解

    这篇文章主要介绍了nodejs对express中next函数的一些理解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • nodejs教程之入门

    nodejs教程之入门

    本文是nodejs教程系列的入门篇,主要讲述nodejs的特点、模块机制/CommonJs(模块引用、模块定义、模块标识、模块实现)、包与NPM等知识,非常的详细,这里推荐给大家作为入门的文章。
    2014-11-11
  • Node.js中的WebSocket底层实现

    Node.js中的WebSocket底层实现

    WebSockets是基于HTTP的双向通信协议,允许客户端和服务器之间实现实时、持久的数据交换,本文详细介绍了使用JavaScript和Node.js创建WebSockets服务器和客户端的过程,感兴趣的可以了解一下
    2024-10-10
  • Node.js动手撸一个静态资源服务器的方法

    Node.js动手撸一个静态资源服务器的方法

    这篇文章主要介绍了Node.js动手撸一个静态资源服务器的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • nodejs使用node-xlsx生成excel的方法示例

    nodejs使用node-xlsx生成excel的方法示例

    这篇文章主要介绍了nodejs使用node-xlsx生成excel,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • node.js 动态执行脚本

    node.js 动态执行脚本

    其中的Script对象,就与require('vm')返回的对象很相似,而实质上,vm模块就是对Script对象的封装。
    2016-06-06
  • 浅析Nodejs npm常用命令

    浅析Nodejs npm常用命令

    这篇文章主要介绍了浅析Nodejs npm常用命令的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06

最新评论