浅谈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系统版本的资料请关注脚本之家其它相关文章!

相关文章

  • nodejs前端自动化构建环境的搭建

    nodejs前端自动化构建环境的搭建

    本文这里给大家介绍的是nodejs中前端自动化构建环境的搭建方法,非常的细致全面,有需要的小伙伴可以参考下
    2017-07-07
  • 在Express中提供静态文件的实现方法

    在Express中提供静态文件的实现方法

    这篇文章主要介绍了在Express中提供静态文件的实现方法,将包含静态资源的目录的名称传递给 express.static 中间件函数,以便开始直接提供这些文件,感兴趣的可以了解一下
    2019-10-10
  • 浅谈Node.js:Buffer模块

    浅谈Node.js:Buffer模块

    本篇文章主要介绍了Node.js:Buffer模块,详细的介绍了创建Buffer实例,具有一定的参考价值,有需要的可以了解一下。
    2016-12-12
  • 如何用node优雅地打印全链路日志

    如何用node优雅地打印全链路日志

    这篇文章主要给大家介绍了关于如何用node优雅地打印全链路日志的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • node.js-fs文件系统模块这是你知道吗

    node.js-fs文件系统模块这是你知道吗

    这篇文章主要为大家详细介绍了node.js-fs文件系统模块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Node.js中利用js-xlsx处理xlsx文件的实现

    Node.js中利用js-xlsx处理xlsx文件的实现

    js-xlsx库是目前Github上star数量最多的处理Excel的库,本文介绍用 Node.js中的js-xls库来处理Excel文件,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 详解node.js 事件循环

    详解node.js 事件循环

    这篇文章主要介绍了node.js 事件循环的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 在Node.js中判断路径是否绝对的解决方法

    在Node.js中判断路径是否绝对的解决方法

    在不同的操作系统中,路径的表示方式有很大的差异,当编写跨平台的 Node.js 应用时,正确判断路径的绝对性变得至关重要,本文提供了path-is-absolute模块的详细使用指南,它是一个兼容 Node.js 早期版本且适用于所有操作系统的解决方案,需要的朋友可以参考下
    2024-04-04
  • nodejs个人博客开发第五步 分配数据

    nodejs个人博客开发第五步 分配数据

    这篇文章主要为大家详细介绍了nodejs个人博客开发的分配数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Node.js使用express写接口的具体代码

    Node.js使用express写接口的具体代码

    这篇文章主要介绍了Node.js使用express写接口,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03

最新评论