Cartographist技术栈解剖:Electron + React + immer如何搭建实验性Web浏览器
Cartographist技术栈解剖Electron React immer如何搭建实验性Web浏览器【免费下载链接】cartographistexperimental web browser optimized for rabbit-holing项目地址: https://gitcode.com/gh_mirrors/ca/cartographistCartographist 是一款用Electron React immer技术栈打造的实验性 Web 浏览器专为喜欢兔子洞式深度浏览的用户设计点击链接不再弹出新窗口而是生成一个可横向滚动的窗格浏览历史不是一条线性列表而是一棵可以任意回溯的树整个浏览会话还能保存成一条 Trail随时完整恢复。项目源码只有一个src/目录是学习如何用现代前端技术搭建桌面浏览器的理想标本。它和 Chrome 有什么不同3个反直觉设计在拆技术栈之前先理解这个实验性浏览器想解决什么问题详见 README.md传统浏览器Cartographist 的做法Cmd点击打开新窗口生成一个水平可滚动的窗格Pane线性历史记录只能往前/往后树状大纲直观展示浏览的分支结构关闭即丢失会话保存/加载Trail长期跟踪研究主题一句话概括它不是让你更快打开网页而是让你不迷路地迷路。技术栈一览Electron 9 React 16 immer 7核心依赖在 package.json 中非常精简技术版本在项目中承担的角色Electron^9.1.2桌面壳提供BrowserWindow与webview渲染容器React / react-dom^16.13.1UI 框架渲染窗格列表与历史树immer^7.0.7状态管理把不可变更新写得像可变操作electron-webpack^2.8.2构建工具本地开发服务器 热重载tachyons^4.12.0原子化 CSS零自定义样式搞定界面md5 / normalize-url^2.2.1 / ^5.0.0Trail 未保存变更检测、URL 规范化整套架构是 Electron 经典的双进程模型src/main/是主进程src/renderer/是渲染进程中间靠 IPC 通信。下面逐层解剖。主进程一个窗口 一份菜单撑起整个浏览器 src/main/index.js 中创建窗口的代码不到 20 行但 3 个配置项决定了整个浏览器的形态titleBarStyle: hiddenInset— 隐藏系统标题栏浏览器自己画一条可拖拽的深色顶栏配合WebkitAppRegion: drag这就是截图中那种紧凑的专业工具质感webviewTag: true— 开启webview标签这是一个窗格装一个网页的物理基础nodeIntegration: true— 让渲染进程能直接require(fs)后面的 Trail 保存/加载全靠它。再看 src/main/menu.jsFile 菜单下的New Pane / New Trail / Save Trail / Load Trail四个自定义项本质都只是mainWindow.webContents.send(cmd)发一条 IPC 消息。主进程不做任何业务逻辑——它只是把键盘快捷键转发给渲染进程这种薄主进程的写法值得学习。渲染进程每个窗格都是一个 webview渲染进程的核心状态定义在 src/renderer/index.js{ history, panes, fullscreenId }panes是一个 URL 数组map一下就是界面右侧并排的窗格每个固定 640px 宽水平滚动。每个窗格由 webview.js 组件渲染关键就三行webview src{url}加载网页本体preloadinject.js预载一段脚本监听鼠标悬停并回传链接地址见 inject.js实现截图底部那条悬停 URL 提示监听new-window事件网页里target_blank打开的新窗口被劫持成新的 Pane——这就是不弹新窗口的魔法入口。状态管理immer 如何让不可变数据改得像可变数据React 官方要求状态更新必须返回新对象但树状浏览历史里有几十层嵌套手动slicemapspread写起来极其痛苦。immer的 draft 模式解决了这个问题——项目里 use-immer.js 把它包成了一个 5 行的 HooksetState((draft) { draft.panes.push(newUrl); // 直接改immer 自动生成新对象 });进阶的 use-persisted-immer.js 在此基础上加了localStorage自动读写启动时恢复上次会话每次变更自动落盘。一个 Hook 同时拿到不可变更新 本地持久化是 immer 最优雅的用法之一。而 Trail 功能index.js则演示了 Electron 特有的能力渲染进程用remote.dialog弹系统对话框再用fs把整个 state 序列化写成.trail文件并用md5 哈希判断当前会话是否有未保存的修改避免误覆盖。核心算法浏览历史是一棵树不是列表传统浏览器的历史是链表而 Cartographist 把每次跳转建模为在父节点下挂一个子节点于是历史天然长成树。核心逻辑在 src/renderer/history.jsnavigate(history, fromUrl, toUrl)— 从fromUrl节点下找到或创建toUrl子节点back/forward/get— 在树中定位节点取父节点或最后访问的子节点。难点在于如何在深层递归的遍历中提前退出。作者在 utils.js 里给出了一个非常实验性的答案——callcccontinuation-passing 风格用throw new Exit(arg)模拟从任意深度直接跳回顶层的语义traverse负责递归走树callcc负责携带结果逃离。这套组合拳只有 40 行代码却同时被历史操作和可视化复用是全项目最值得咀嚼的一段。history-visualization.js 则把这棵树画成了截图中左侧的 SVG竖线表示分支跨度横线连接同层节点点开任意节点即可沿着祖先路径直达那个窗格。快速上手两条命令跑起这个实验性浏览器项目目前只提供源码运行方式README 原话No binary builds are available right now, purely out of lazinessgit clone https://gitcode.com/gh_mirrors/ca/cartographist cd cartographist npm install npm start运行后就是一个带历史树的实验性浏览器Ctrl/CmdT开新窗格Ctrl/CmdS保存 Trail。总结这个小项目值得抄的三个作业薄主进程 厚渲染进程主进程只做窗口、菜单和 IPC 转发src/main/业务全在 React 里架构边界清晰immer 的 draft 模式管理深层嵌套状态时像改可变对象一样写代码拿到的却是不可变更新配合 5 行自定义 Hook 即可叠加持久化src/renderer/use-persisted-immer.js用数据模型而非 UI 驱动行为窗格是数组、历史是树界面只是这两个数据结构的投影——状态对了UI 几乎自动就对了。如果你想给自己的浏览器加空间感或者研究 Electron 中webview IPC immer 的完整闭环Cartographist 这个千行级小项目就是最好的起点。️【免费下载链接】cartographistexperimental web browser optimized for rabbit-holing项目地址: https://gitcode.com/gh_mirrors/ca/cartographist创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

COMSOL2-几何建模和CAD导入

COMSOL2-几何建模和CAD导入

几何内核 几何内核在数学上比较复杂,如果几何是在COMSOL里面,那么可以直接使用,如果不是,用CAD内核导入。单击模型开发器里面的几何,几何表示几何对象和实体,就是点构成边,边构成面,…

2026/8/26 19:54:41 阅读更多 →
深入理解C++ 智能指针std::unique_ptr<二>自定义删除器

深入理解C++ 智能指针std::unique_ptr<二>自定义删除器

自定义删除器 (Custom Deleter)&#xff1a;unique_ptr 允许通过模板参数指定删除器。由于其类型包含删除器&#xff0c;因此可以在编译期绑定&#xff0c;无额外运行时开销。#include <iostream>#include <memory> // unique_ptr// 一个简单的测试类class Test {p…

2026/8/26 19:54:41 阅读更多 →
「道显知微」v3.0 全新发布:紫微斗数/八字排盘软件全面升级(附完整使用指南)

「道显知微」v3.0 全新发布:紫微斗数/八字排盘软件全面升级(附完整使用指南)

「道显知微」v3.0 全新发布&#xff1a;紫微斗数/八字排盘软件全面升级&#xff08;附完整使用指南&#xff09; 一、写在前面 很多老朋友是从「道显紫微斗数排盘」&#xff08;楚天云阔四化排盘软件&#xff09;一路关注过来的。从 v14、v16 一路迭代至今&#xff0c;我们收…

2026/8/26 19:54:41 阅读更多 →

最新新闻

llama.cpp在3090上部署Qwen3.8-27B

llama.cpp在3090上部署Qwen3.8-27B

1 unsloth/Qwen3.8-27B-GGUF at main 最高画质4bit量化 2 ./llama-server -m ..\models\Qwen3.8-27B-UD-Q4_K_XL.gguf --mmproj ..\models\mmproj-Qwen3.8-27B-Uncensored-HauhauCS-Aggressive-BF16.gguf -ngl 999 -fa on -c 65536 -ctk q4_0 -ctv q4_0 -b 2048 -ub 512 --te…

2026/8/26 20:49:05 阅读更多 →
用TypeScript手写AI Agent骨架:核心是自主调用工具的循环

用TypeScript手写AI Agent骨架:核心是自主调用工具的循环

先说一个结论&#xff1a;AI Agent 的真正核心不是“聊天”&#xff0c;而是“一个能自主调用工具的循环”。如果你已经在用 TypeScript 做前端或 Node.js 开发&#xff0c;想入门 AI Agent&#xff0c;或者想把一个 Demo 升级成企业级架构&#xff0c;那么这篇内容比其他“概念…

2026/8/26 20:49:05 阅读更多 →
运放频率补偿深度解析:从自激振荡到相位裕度的实战指南

运放频率补偿深度解析:从自激振荡到相位裕度的实战指南

做模拟电路的人&#xff0c;迟早都会撞上一个问题&#xff1a;放大器自激。明明原理图看着没问题&#xff0c;上电却开始振荡&#xff0c;示波器上全是毛刺&#xff0c;或者干脆整片电路变成射频振荡器&#xff0c;摸哪儿哪儿发热。我当年第一次用高速运放搭跟随器&#xff0c;…

2026/8/26 20:49:05 阅读更多 →
STM32 LL库驱动IIC:从时序原理到OLED实战的底层开发指南

STM32 LL库驱动IIC:从时序原理到OLED实战的底层开发指南

1. 项目概述&#xff1a;为什么选择LL库来驱动IIC&#xff1f; 如果你正在用STM32做项目&#xff0c;大概率绕不开IIC这个经典又“磨人”的通信协议。网上关于HAL库配置IIC的教程铺天盖地&#xff0c;但一提到LL库&#xff0c;很多人就犯怵了&#xff0c;觉得它太底层、太复杂。…

2026/8/26 20:49:05 阅读更多 →
SpringBoot自动配置原理浅析:它到底帮你做了什么

SpringBoot自动配置原理浅析:它到底帮你做了什么

SpringBoot最蛊惑人心的承诺是&#xff1a;你什么都不用做&#xff0c;它就能帮你把一切安排好。但真相是&#xff0c;它只是把你的懒惰包装成了“约定优于配置”&#xff0c;再用一套精密的机械流程&#xff0c;把“默认”两个字变成了条件反射式的加载。许多开发者用了几年Sp…

2026/8/26 20:48:05 阅读更多 →
基于STM32与半导体制冷片的DIY智能温控小冰箱全流程实战

基于STM32与半导体制冷片的DIY智能温控小冰箱全流程实战

1. 项目概述&#xff1a;从想法到实物的DIY制冷之旅 几年前&#xff0c;我在一个闷热的夏天突发奇想&#xff1a;能不能自己动手做一个能放在桌边、随时冰镇饮料的小冰箱&#xff1f;市面上虽然有迷你冰箱&#xff0c;但大多体积不小&#xff0c;噪音还大。于是&#xff0c;一个…

2026/8/26 20:48:05 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要&#xff1a; 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数&#xff08;random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录&#xff1a; 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中&#xff0c;主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段&#xff0c;转入了政务服务的常态化落地应用&#xff1b;在实际使用过程中&#xff0c;它能自主理解办事需求、辅助完成填报申报、开展材料预审&#xff0c;并联动多个系统协同作业&#xff0c;真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →