Node.js 优雅获取 macOS 系统版本的方法与实现
本文介绍在 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 系统版本的详细内容,更多相关资料请关注本站其他文章。
Node.js中使用path模块获取文件名
2026-11-05 15:15:15
Node.js中url模块与querystring模块处理查询字符串的区别
2026-11-05 15:04:45
JavaScript(JS)主要用来做什么
2026-11-05 10:10:47
怎么修改Node.js和npm的全局安装路径与缓存目录
2026-11-04 19:48:28
NW.js 常见问题排查:Node 模块加载失败与版本兼容解决
2026-11-04 11:22:45
