Node.js 优雅获取 macOS 系统版本的方法与实现

作者:后端茶话时间:2026-10-30 19:45:39浏览:266

本文介绍在 Node.js 中获取 macOS 系统版本的两种方法。os.release() 返回内核版本号,不符合常规认知。通过映射 os.release() 结果与 macOS 版本号的对应关系,可以优雅地获取如 macOS 12.0.1 这样的实际系统版本,适用于前端兼容性判断场景。

背景

今日遇到一个兼容性需求,需根据不同 macOS 版本执行不同的兼容逻辑。

该需求看似简单,实则经历了一些波折,最终得以解决。

在此记录解决过程,供有类似需求的开发者参考。

获取系统类型

针对 macOS 进行兼容性处理,首要步骤是区分系统类型。Node.js 提供了相关 API,使用 os.platform() 即可直接获取系统类型。

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

需注意,macOS 在 Node.js 中对应的标识并非 macOS,而是 darwin。

除通过 os 模块获取系统类型外,还可利用 process.platform 进行获取。

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

获取系统版本

熟悉 Node.js 的开发者可能会想到使用 os.release() 快速获取系统版本。然而,执行 os.release() 后,其返回结果往往与常规认知不符。

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

查阅 Node.js 官方文档可知,Node.js 通过 uname(3) 确定操作系统,因此该结果虽违背常规认知,但属于正常现象。

通过命令行获取系统版本

鉴于 os.release() 返回的系统版本难以理解,是否存在方案可直接获取实际的系统版本号?

macOS 系统内置了 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.js 中调用该命令行即可。

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

优雅地获取系统版本

通过 Node.js 子进程执行命令行命令可获取正确的系统版本,但此方式存在性能缺陷,需创建子进程,相比 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

为方便识别 macOS 新发布系统,将新系统版本名称识别为 Unknow,新版本识别为空字符串。

此举借鉴了移动端机型打分平台的思路,当版本为空时,默认为高版本,不影响低版本的兼容性处理。

现在,即可通过 Node.js 优雅地获取系统版本。

以上为 Node.js 优雅获取 macOS 系统版本的详细内容,更多相关资料请关注本站其他文章。

作者最新文章