
在阅读大量关于 Linux、银河麒麟、自研操作系统的讨论时很多人会产生一个疑问写一个操作系统是不是只是一个存在于教科书和巨头公司里的“黑科技”这个门槛不低涉及汇编、C 语言、中断、内存管理、进程调度看起来离普通开发者很远。但最近看到一个名为 BifluxOS 的项目它被标注为“小学生自研的图行化操作系统”这让我重新思考了这个话题。如果一个小学生能完成一个可展示桌面、窗口和基本交互的图形化操作系统那么问题可能不在于“能不能做”而在于“用什么样的路径去做”。这里需要先给一个明确判断BifluxOS 这类项目本质上是采用 Web 前端技术和浏览器能力模拟了一个操作系统的图形化外壳和交互逻辑。它不是从引导扇区开始编写的裸机操作系统而是跑在浏览器里的“图形化操作系统体验环境”。这一点很重要。如果带着“它能跑在真实硬件上吗”的预期去读会非常失望但如果带着“它在教学演示、前端工程实践、操作系统原理可视化方面有独到价值”的预期去分析会发现这是一个非常适合上手的实验型项目。这篇文章会分析这类项目的价值边界、典型设计思路并给出一套可以在本地跑通的图形化操作系统示例代码。读完这篇文章你会得到三个收获理解“操作系统”和“图形化用户界面”之间的边界避免被“自研操作系统”的概念误导。掌握一个纯前端图形化操作系统的分层设计方法包括桌面、窗口管理器、任务栏、事件分发等模块。拿到一份可直接复制的 HTML/CSS/JavaScript 示例在浏览器里快速搭建一个可拖动、可打开、可关闭窗口的“迷你操作系统”Demo。1. 为什么一个“小学生做的操作系统”值得关注操作系统是计算机科学里公认难啃的硬骨头大学生学《操作系统原理》时经常要面对进程同步、虚拟内存、页面置换、文件系统这些抽象概念。学习曲线陡峭实验环境重很多人还没写出一行代码就已经被概念劝退了。所以当“小学生自研的图行化操作系统”这个标签出现时它真正触动大家的是原来操作系统并不天然等于“汇编和 C 语言写内核”。从材料来看BifluxOS 的重点不是底层内核而是“图形化”和“交互设计”这恰恰是当前操作系统学习中容易被忽略的部分。Linux 的命令行再强大对初学者仍然有很高的学习成本而图形化操作系统能把进程、窗口、事件这些抽象概念变成用户可见、可操作的对象。另一个值得关注的点是这类项目验证了一种低门槛的学习路径。一个小学生如果使用 HTML、CSS、JavaScript就能把“打开应用”“拖动窗口”“切换任务”这些操作系统交互展示出来那么普通开发者完全可以通过类似项目理解 GUI 系统的工作原理。这比一开始就陷入驱动开发和内核调试现实得多。当然必须承认这个“操作系统”和 Windows、Linux、银河麒麟这些真实系统不是同一层面的东西。真实操作系统要管理硬件、分配 CPU 时间片、隔离内存空间而 BifluxOS 这类项目更多是模拟操作系统的外观和部分交互逻辑。但这不意味着它没有价值。把复杂系统的核心概念用简单技术复现出来这正是工程教育里最有效的方式。建议读者放弃“能不能替代 Windows”这种问题把目光放在“它用什么结构组织代码”“窗口系统是怎么绘制和响应事件的”“这类实现能迁移到真实系统开发的哪些环节”。从教学价值看一个能交互的图形化外壳比厚厚的原理书更容易让人建立初步模型。2. 操作系统的本质与图形化外壳在深入 BifluxOS 之前需要先厘清两个概念操作系统的内核和操作系统的图形界面。简单来说操作系统是管理计算机硬件资源、为应用程序提供服务的基础软件。它负责 CPU 调度、内存分配、文件系统、设备驱动以及对外提供系统调用接口。真正的操作系统能直接运行在裸机上比如 Linux 内核可以在服务器、手机、嵌入式设备上启动。图形化用户界面GUI只是操作系统的一个子系统它的作用是让用户通过窗口、图标、菜单、按钮来操作系统。Windows 的桌面、macOS 的 Dock、Linux 的 GNOME 和 KDE都是 GUI Shell。这个 Shell 依赖底层的图形栈和窗口系统但在架构上它是可替换的一部分。换句话说操作系统的内核可以没有图形界面比如 Linux 服务器只跑命令行反过来一个图形界面也可以不依赖完整内核比如大多数网页应用本身就有窗口和面板。这就为 BifluxOS 这类 Web 图形化操作系统提供了存在空间。它不需要理会中断和页表只需要聚焦在“图形外壳”上。它模拟的任务栏、桌面图标、窗口拖拽和事件响应都是 GUI 系统的核心交互逻辑。这里有一个容易被误解的地方不要把“图形化模拟”和“系统仿真”混为一谈。BifluxOS 如果只是用浏览器画出一个桌面它没有真正去创建进程也没有分配内存。它更像一个以操作系统为题材的 Web 应用。但这不代表它没有技术含量因为它要实现窗口层级、焦点管理、拖动算法、组件生命周期这些在工程上都有一套成熟方案。为了更好地理解可以把 GUI 操作系统拆成几个层次内核与驱动层负责硬件交互比如键盘输入、鼠标移动、屏幕输出。图形栈与窗口系统负责把图形指令渲染到屏幕上管理窗口的 z-index、焦点和输入事件。桌面环境与 Shell负责桌面背景、任务栏、图标、启动器。应用程序层运行在桌面环境内的各类应用比如文件管理器、浏览器、编辑器。BifluxOS 这类项目的常见做法是直接站在 Web 技术之上实现后面三层。它的底层是浏览器而不是 CPU它的事件来源是 DOM 事件而不是硬件中断。但对于学习界面逻辑的人来说这个抽象层次已经足够感知“操作系统风格”的交互。因此文章后续以“Web 图形化操作系统”来称呼 BifluxOS 这一类项目。如果你已经有一门编程语言基础这个方向非常适合作为深入理解 GUI 架构的项目实践。3. 从零做一个图形化操作系统的技术选型开始动手之前必须先做选型。常用的方案有三类各有优劣。第一类是使用 C/C 配合图形库比如 SDL、Qt、GTK。这种方案最接近真实桌面应用能直接打开原生窗口也更容易理解事件循环和绘图上下文。但环境搭建繁琐Windows、Linux、macOS 的编译依赖各不相同对新手不友好。如果是跨平台演示Qt 是最好的选择之一但它不是一个纯粹的学习项目而是一个成熟的 GUI 框架。第二类是使用 Python 配合 Tkinter、PyQt 或 Pygame。Python 语法简单开发速度快适合做“迷你操作系统模拟器”。比如用 Pygame 绘制桌面和窗口可以自定义事件循环和窗口拖动逻辑。优点是代码可读性好适合教学缺点是分发时需要 Python 环境用户体验不如 Web。第三类是使用纯前端技术也就是 HTML、CSS、JavaScript直接在浏览器里实现桌面环境和窗口系统。这是 BifluxOS 最可能采用的路线也是本文推荐的重点。理由是无需安装任何编译器和图形库浏览器就是运行环境。天然支持鼠标、键盘、触控事件处理窗口拖动和点击非常直观。可以用 CSS 控制视觉样式实现桌面、任务栏、状态栏的成本很低。方便分享把一个 HTML 文件或用 Vite 构建的静态站点部署到任意服务器即可访问。JavaScript 的事件循环和对象模型很适合模拟操作系统的消息分发机制。从项目定位来说如果目标是让学生理解“操作系统风格交互”前端改造是效率最高的路径。如果目标是真正理解内核调度和硬件驱动那就应该转向 QEMU、C 语言和裸机开发那是一个完全不同的深水区。本文的示例采用纯 HTML/CSS/JavaScript 实现不需要任何构建工具复制到一个 HTML 文件里就能跑。这个 Demo 会模拟一个最小可用的图形化操作系统外壳有桌面图标、有窗口管理器、有任务栏支持打开和关闭窗口支持拖动窗口支持窗口层级切换。4. 环境准备与前置工具这个 Part 会列举运行示例代码所需的环境。为了方便读者我们尽量保持最简配置。操作系统Windows 10/11、Linux、macOS 均可没有平台限制。浏览器Chrome、Edge、Firefox 或 Safari 较新版本推荐 Chrome。编辑器Visual Studio Code 或其他纯文本编辑器。本地服务器可选。如果只是打开单个 HTML 文件直接双击运行即可。如果后续要拆分成多个 JS 文件建议使用 VS Code 插件 Live Server 或 Node.js 的npx serve启动一个静态服务器。关于 Node.js 版本本文不限定具体版本。示例代码不依赖任何 npm 包所以 Node.js 不是必需项。如果你希望使用高版本浏览器测试 ES6 Module可以安装 Node.js 18 或更高版本但这不属于硬性要求。前置知识要求不高。懂得基本的 HTML 标签、CSS 选择器、JavaScript 的数组和对象操作就可以读懂全部代码。如果对事件绑定不熟悉文章中的代码也附有注释说明。另外需要明确一点不要在真实生产环境里用这套代码承载重要业务。它只是学习项目没有进程隔离、权限控制、系统调用等安全机制适合作为教学演示和前端实验。5. Web 图形化操作系统的分层设计与核心模块一个完整的浏览器内“操作系统”至少需要四个模块桌面环境模块负责桌面背景、图标布局和启动窗口。窗口管理器模块维护所有打开的窗口列表处理窗口的创建、销毁、层级和焦点。任务栏模块显示已打开窗口的入口支持点击切换窗口。应用渲染模块根据窗口需求渲染不同的应用内容比如“计算器”“记事本”“关于系统”。在编写代码时建议把逻辑分为三层表现层DOM/CSS渲染桌面、窗口、任务栏。逻辑层JavaScript 类管理 Window 对象、应用注册表、焦点状态。事件层Event Listeners统一接收鼠标事件通过事件委托交给对应窗口处理。这里特别说明事件分发机制。真实操作系统的鼠标事件会先进入内核内核根据鼠标位置找到顶层窗口然后发送给对应的应用程序。浏览器里的逻辑类似监听 document 或桌面容器上的 mousedown、mousemove、mouseup计算坐标判断点击落在哪个窗口上再触发对应的窗口处理函数。用一个状态机来维护“当前拖动的窗口”和“偏移量”就能实现窗口拖动。窗口层级管理是另一个容易出错的地方。真实操作系统的窗口系统有一个 Z 序点击哪个窗口哪个窗口就放到最前面。Web 实现里可以用动态设置元素的 z-index 来实现。维护一个全局索引每次点击递增然后把该窗口的 z-index 设为最新值。为了让窗口管理器更高效最好采用注册表模式。定义一个应用注册表里面存放每个应用的名称、图标、默认尺寸、渲染函数。打开应用时窗口管理器从注册表读取配置创建对应窗体的 DOM。关闭窗口时从注册表中移除动态生成的 DOM 节点。这套模式类似“以数据驱动界面”比手动操作 DOM 更利于后续扩展。6. 完整示例代码实现现在直接进入代码。为了阅读方便先提供整体文件结构说明。这个示例可以用单个 HTML 文件完成也可以拆分成三个文件。推荐结构如下bifluxos-demo/ ├── index.html └── style.css └── app.js不过单个 HTML 文件在初学者分享时更方便。以下示例默认使用一个index.html文件演示。读者可以整体复制保存为index.html后直接打开。6.1 HTML 骨架!DOCTYPE html html langzh-CN head meta charsetUTF-8 / meta nameviewport contentwidthdevice-width, initial-scale1.0 / titleBifluxOS 图形化操作系统 Demo/title style /* 样式放在后面会展示也可以直接写在 style.css */ /style /head body !-- 桌面容器 -- div iddesktop !-- 桌面图标由 JS 动态生成 -- /div !-- 任务栏 -- div idtaskbar div idtaskbar-apps/div div idtaskbar-clock00:00:00/div /div !-- 窗口挂载点 -- div idwindows-layer/div /body /html这个 HTML 里desktop是桌面区域windows-layer是所有窗口的容器taskbar是任务栏。窗口挂载点单独一层可以提高 z-index 管理效率。6.2 CSS 核心样式* { margin: 0; padding: 0; box-sizing: border-box; user-select: none; } body { overflow: hidden; font-family: Microsoft YaHei, PingFang SC, sans-serif; background: #1e90ff; } #desktop { position: fixed; inset: 0; background: linear-gradient(135deg, #4a90d9 0%, #7b68ee 100%); background-size: cover; padding: 16px; } .desktop-icon { display: inline-flex; flex-direction: column; align-items: center; width: 80px; padding: 10px 4px; margin: 8px; border-radius: 8px; cursor: pointer; color: #fff; transition: background 0.2s; } .desktop-icon:hover { background: rgba(255, 255, 255, 0.2); } .desktop-icon .icon-img { font-size: 32px; line-height: 42px; } .desktop-icon .icon-title { font-size: 13px; margin-top: 4px; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); } .window { position: absolute; min-width: 360px; min-height: 240px; background: #fff; border-radius: 8px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25); display: flex; flex-direction: column; overflow: hidden; } .window-titlebar { height: 40px; background: #2b3e50; color: #fff; display: flex; align-items: center; padding: 0 12px; cursor: move; justify-content: space-between; } .window-title { font-size: 14px; font-weight: 600; } .window-controls button { background: transparent; border: none; color: #fff; font-size: 16px; margin-left: 8px; cursor: pointer; padding: 2px 6px; } .window-body { flex: 1; padding: 16px; overflow: auto; font-size: 14px; color: #333; } #taskbar { position: fixed; bottom: 0; left: 0; right: 0; height: 48px; background: rgba(15, 23, 42, 0.85); backdrop-filter: blur(8px); display: flex; align-items: center; justify-content: space-between; padding: 0 12px; z-index: 9999; } #taskbar-apps { display: flex; gap: 4px; } .taskbar-item { background: rgba(255, 255, 255, 0.12); border: none; color: #fff; font-size: 13px; padding: 6px 14px; border-radius: 6px; cursor: pointer; } .taskbar-item.active { background: rgba(255, 255, 255, 0.32); } #taskbar-clock { color: #fff; font-size: 13px; }样式里最需要注意的是user-select: none它能防止用户拖动窗口时选中文本否则体验会非常差。窗口使用绝对定位初始位置统一由 JS 控制。6.3 JavaScript 窗口管理器逻辑// 应用注册表可以很方便地添加新应用 const APP_REGISTRY [ { id: about, name: 关于系统, icon: ️, width: 420, height: 300, render: () h3BifluxOS/h3 p这是一个纯前端实现的图形化操作系统 Demo。/p p支持窗口打开、关闭、拖动、层级切换。/p , }, { id: notepad, name: 记事本, icon: , width: 480, height: 360, render: () textarea stylewidth:100%;height:100%;border:none;outline:none;resize:none;font-size:14px; placeholder在这里输入文字……/textarea , }, { id: calc, name: 迷你计算器, icon: , width: 320, height: 380, render: () div classcalc-box input typetext idcalc-input readonly value0 / div classcalc-buttons button onclickcalcInput(1)1/button button onclickcalcInput(2)2/button button onclickcalcInput(3)3/button button onclickcalcInput()/button button onclickcalcInput(4)4/button button onclickcalcInput(5)5/button button onclickcalcInput(6)6/button button onclickcalcInput(-)-/button button onclickcalcInput(7)7/button button onclickcalcInput(8)8/button button onclickcalcInput(9)9/button button onclickcalcInput(*)*/button button onclickcalcInput(C)C/button button onclickcalcInput(0)0/button button onclickcalcInput()/button button onclickcalcInput(/)//button /div /div , }, ]; // 窗口管理器对象 const WindowManager { windows: [], zIndexCounter: 10, activeWindowId: null, uuid() { return win- Date.now() - Math.floor(Math.random() * 1000); }, open(appId) { const app APP_REGISTRY.find((a) a.id appId); if (!app) return; // 如果该应用已存在窗口激活它不重复创建 const existing this.windows.find((w) w.appId appId); if (existing) { this.focus(existing.id); return; } const id this.uuid(); const layer document.getElementById(windows-layer); const win document.createElement(div); win.className window; win.dataset.windowId id; win.style.width app.width px; win.style.height app.height px; win.style.left Math.max(20, Math.floor(Math.random() * (window.innerWidth - app.width - 40))) px; win.style.top Math.max(20, Math.floor(Math.random() * (window.innerHeight - app.height - 80))) px; win.style.zIndex this.zIndexCounter; win.innerHTML div classwindow-titlebar span classwindow-title${app.icon} ${app.name}/span div classwindow-controls button>.calc-box { display: flex; flex-direction: column; height: 100%; gap: 8px; } #calc-input { width: 100%; padding: 12px; font-size: 20px; border: 1px solid #ddd; border-radius: 6px; text-align: right; } .calc-buttons { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; flex: 1; } .calc-buttons button { font-size: 18px; border: none; border-radius: 6px; background: #f1f5f9; cursor: pointer; } .calc-buttons button:hover { background: #e2e8f0; }这部分不是核心逻辑但能明显提升演示效果。如果读者只想要最简窗口系统不想要计算器可以考虑删除APP_REGISTRY中的calc应用不影响主流程。7. 运行结果与效果验证运行方式很简单新建一个文件命名为index.html。把上面的 HTML 代码完整复制进去。用 Chrome 或 Edge 打开该文件。如果在某一行 CSS 中遗漏了标签建议直接使用单独文件方式组织。运行后你首先会看到蓝色渐变桌面桌面上有三个图标关于系统、记事本、迷你计算器。任务栏底部显示三个应用按钮和当前时间。验证清单如下双击“记事本”图标桌面中间应出现一个白色窗口。鼠标按住窗口标题栏并移动窗口应跟随移动。点击另一个窗口时当前窗口应置顶并且 z-index 改变。点击窗口右上角“✕”窗口关闭任务栏中的按钮状态恢复。再点击任务栏中的“迷你计算器”计算器窗口打开按钮可以执行基础运算。页面底部时间每秒更新一次说明setInterval正常执行。如果发现双击图标没有反应最常见的原因是在文件内联 JS 里DOMContentLoaded事件绑定之前APP_REGISTRY存在语法错误。这时需要打开浏览器开发者工具在 Console 面板查看红字报错。另外如果页面文件是 ES6 的 module 形式双击打开会受到浏览器安全限制但本例不是 module 形式所以直接打开也是安全的。对于想做更深层验证的读者可以在浏览器控制台手动输入WindowManager.open(notepad) WindowManager.open(about) WindowManager.close(win-xxx)把win-xxx替换成控制台WindowManager.windows里打印出来的真实 id。通过直接调用窗口管理器接口能更快理解状态管理逻辑。8. 常见问题与排查思路以下表格列出了这个示例中可能出现的典型问题。真实项目开发时这些排查思路同样适用。问题现象可能原因排查方式解决方案页面打开后一片空白JavaScript 语法错误或 DOM 元素未加载打开开发者工具 Console查看报错信息检查APP_REGISTRY中模板字符串是否闭合或把 JS 放到DOMContentLoaded内双击图标没有反应renderDesktopIcons没有执行在init函数里加console.log(init)确认DOMContentLoaded事件绑定存在且没有拼写错误窗口无法拖动initDrag未初始化或事件对象里closest找不到标题栏检查标题栏 class 是否包含window-titlebar确保 HTML 和 CSS 类名一致关闭按钮无反应事件委托没有捕获到按钮在closeBtn判断前打印e.target确认[data-actionclose]存在且按钮在窗口内窗口拖出屏幕无法找回移动限制逻辑有问题检查Math.min和Math.max条件使用window.innerWidth和window.innerHeight限制边界计算器显示“错误”手动输入了非法表达式查看calcInput的new Function逻辑学习和演示时保持表达式合法生产环境不要使用new Function字体或图标显示异常浏览器字体不支持某些 emoji更换字体族或使用图片图标使用系统自带 emoji 字体或替换为文字图标值得强调的是这一类问题里80% 都和 class 名称不一致有关。前端开发中模块越拆越细命名不统一的坑就越常见。建议从一开始就规划好统一前缀比如所有桌面元素以desktop-开头窗口元素以window-开头这样定位问题时能更快缩小范围。生产环境迁移时不推荐直接使用这个 Demo。原因有两个一是业务代码和应用注册表耦合过紧二是new Function这类动态执行存在安全风险。如果要在团队项目中使用应当把窗口管理器抽象成独立类把应用内容替换成安全的 iframe 或组件渲染器。9. 工程化与性能优化建议从“能跑的 Demo”到“能维护的工程”中间还有几条关键经验。第一模块化拆分。不要把所有代码写到一个 HTML 文件中。把WindowManager、AppRegistry、DesktopRenderer都拆成独立的 JavaScript 文件甚至使用原生 ES Module 的 import/export 语法。这样后续增加新应用时只需要在注册表里添加一条配置而不需要动窗口管理代码。第二用数据驱动 UI。上面的示例中APP_REGISTRY已经具备了数据驱动的雏形。但如果应用数量增长建议给每个应用补充onOpen、onClose、onDestroy生命周期方法。窗口管理器负责创建和销毁 DOM应用自身负责业务逻辑。这样架构才清晰。第三事件处理要做防抖和销毁。现代前端框架会在组件卸载时自动清理事件监听但原生 DOM 写多了容易积累多余监听器。拖动窗口时mousemove事件绑定在 document 上如果窗口每次打开都绑定一次页面会越来越卡。建议用 window 级别的全局监听只在拖动开始时启用在鼠标松开时移除。第四动画和渲染性能。窗口拖动过程中样式变更触发重排和重绘。这个 Demo 的窗口数量少感觉不到性能问题。但真实环境里如果同时打开几十个窗口建议使用transform: translate()替代直接修改left和top因为transform不会影响文档流性能更好。拖动的实时频率也可以使用requestAnimationFrame控制把每次 mousemove 的位置缓存到变量中在动画帧里统一更新 DOM。第五安全边界。new Function执行用户输入在真实系统里极其危险它可以被注入恶意代码。迷你计算器演示时可以用Function构造器但工程代码里应该改成词法解析器或调用数学库比如 math.js。任何窗口管理器都不要暴露可被页面脚本直接控制的全局方法否则一旦页面被注入恶意脚本攻击者就能伪造窗口、诱骗用户交互。第六权限与隔离。真实操作系统最重要的职责之一是隔离而 Web 图形化操作系统天然继承了浏览器的隔离能力。但要注意如果你用 iframe 渲染应用会给 iframe 设置sandbox属性限制同源访问。如果只是用 innerHTML 渲染应用片段就要严格防范 XSS 注入所有来自用户的内容必须经过转义。10. 从“图行化外壳”到真正操作系统开发看完前面的实现你应该已经体会到“操作系统图形外壳”是一个可以落地的前端工程问题。那么如果想从这个起点继续深入应该怎么走这里提供三条路径。第一条路径是深入图形界面方向。研究浏览器渲染原理、图层合成、事件模型、前端框架的虚拟 DOM学习如何用 Canvas 或 WebGL 实现自绘窗口系统。这条路径的终点是成为一个优秀的前端或图形学开发者。第二条路径是转向桌面级 GUI 开发。搜索 Qt、wxWidgets、GTK 的窗口管理源码理解它们如何封装事件循环和绘图上下文。这条路径对 C 或 Python 开发者来说很顺理成章尤其适合做 Linux 桌面环境的定制开发。第三条路径是真正切入操作系统内核。从模拟器开始比如使用 QEMU 虚拟机配合一个简单的引导程序和串口输出逐步接触 CPU 的实模式和保护模式、中断描述符表、内存分页、进程调度。这条路径门槛高但成就感也最强。对大多数读者来说第一条路径的性价比最高因为 Web 技术生态最繁荣也最容易找到工作。如果你只是对 BifluxOS 感兴趣想搞清楚“图行化操作系统”听起来神奇实际是怎么做出来的那么看完本文的 Demo 并动手改一改就已经超过 90% 只看不做的围观者了。从更宏观的角度看BifluxOS 这类项目的意义不在于“它是真的操作系统”而在于它用图形化、可操作的方式降低了系统软件的学习门槛。它演示了窗口管理、事件分发、状态注册这些概念这些概念在任何真实操作系统中都不可或缺。能把复杂的系统拆解成一个个可运行的模块是很重要的工程能力。与其纠结它能不能用来做真实产品不如想想它教会了我们什么然后顺着这个思路去设计自己的“迷你操作系统”。建议大家在本地跑通这段代码之后至少做三个小改进增加一个“文件管理器”应用模拟文件树结构。给窗口增加最小化和最大化按钮。把窗口管理逻辑改成类并在控制台输出每次窗口状态变更的日志。这三点做完你就已经拥有一个具备基本可扩展性的图形化桌面环境了。继续迭代下去未来的项目积累可以为你在操作系统可视化、前端架构或系统工具开发方向提供很好的基础。最后提一句很实际的建议动手写的价值永远大于反复阅读。先复制跑起来再拆开重构最后如果你还有兴趣可以参考开源项目里的桌面环境源码比如 GNOME Shell、KDE Plasma或者基于 Web 的在线操作系统框架。沿着这条路线走BifluxOS 会是你了解“操作系统如何呈现给用户”的最好起点。