尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

如何从零用Electron构建一个自定义Web浏览器:Cartographist源码的10个核心借鉴点

如何从零用Electron构建一个自定义Web浏览器:Cartographist源码的10个核心借鉴点 如何从零用Electron构建一个自定义Web浏览器Cartographist源码的10个核心借鉴点【免费下载链接】cartographistexperimental web browser optimized for rabbit-holing项目地址: https://gitcode.com/gh_mirrors/ca/cartographistCartographist 是一个用 Electron 构建的实验性 Web 浏览器它不依赖传统的新窗口和线性历史而是用横向滚动面板、树状浏览记录和可保存的Trail会话来重新定义深度阅读rabbit-holing。读完这份 Cartographist 源码剖析你将获得用 Electron 从零搭建自定义 Web 浏览器所需的 10 个核心借鉴点。上面就是 Cartographist 的实际运行效果左侧是一棵浏览树右侧是可以水平滚动的网页面板。整个项目不到 20 个源文件却被作者设计成了一个功能完整的浏览器非常适合新手学习。1. 用 BrowserWindow webviewTag 搭建浏览器骨架一切从 src/main/index.js 开始。主进程只做了三件事创建BrowserWindow、开启webviewTag、注册应用菜单。关键在webPreferences中打开webviewTag: true。有了它渲染进程就能在页面里嵌入webview标签让每个面板独立加载网页、独立走自己的导航栈——这是自定义浏览器而非套壳网页的分水岭。2. 隐藏原生标题栏用 CSS 打造自定义窗口想做出 Chrome 之外的浏览器观感第一步是去掉系统标题栏。源码用了两个配合的技巧主进程中设置titleBarStyle: hiddenInset保留 macOS 的红黄绿窗口按钮渲染进程里用WebkitAppRegion: drag把顶部 38px 区域变成可拖动区域见src/renderer/index.js。只需两行配置你就拥有了完全自定义的窗口外观。3. 把线性历史升级为树状历史模型传统浏览器的历史是一条直线而 Cartographist 用一棵树记录浏览轨迹每个节点包含url、title、children、timestamp前进后退只是沿着父子关系移动。核心逻辑全部收敛在src/renderer/history.js的 5 个纯函数中navigate从 A 跳到 B 就挂一个子节点、back返回父节点、forward进入最后一个子节点、get和process。纯函数 纯数据天然适合测试和持久化这是最值得偷师的设计。4. 新标签页不是横向滚动的面板CmdT在新浏览器里意味着新窗口在 Cartographist 里意味着右侧滑出一个 640px 宽的新面板src/renderer/index.js中的panes数组 overflow-x-scroll容器。面板可以关闭、全屏、点击历史树上任意节点重新打开。多任务对比阅读从此告别窗口切换这也是rabbit-holing 优化的核心体验。5. 用 Immer 自定义 Hook 管理全局状态整个浏览器——历史树、面板列表、全屏状态——只是一个 React state 对象。作者在src/renderer/use-immer.js中把useState和 Immer 的produce组合成 8 行的小 Hook让更新逻辑写成直接修改 draft的直觉式写法彻底告别冗长的不可变更新样板代码。6. localStorage 持久化关闭浏览器不丢进度src/renderer/use-persisted-immer.js在前一个 Hook 之上加了 18 行每次 state 变化写入localStorage启动时读回。这样关闭再打开浏览器你的浏览树和所有面板原样恢复。做个人效率型浏览器时这种零配置的会话持久化几乎是必备项。7. 主进程与渲染进程的 IPC 命令通道浏览器功能大多由菜单触发但菜单活在主进程、状态活在渲染进程。src/main/menu.js的模式很典型菜单项的click回调只调用webContents.send(NEW_PANE)发一个字符串命令渲染进程在src/renderer/index.js里用ipcRenderer.on监听并执行真正的逻辑。命令名NEW_PANE/NEW_TRAIL/SAVE_TRAIL/LOAD_TRAIL就是两个世界之间的契约。8. Trail把整次研究会话存成一个文件Cartographist 最独特的功能是Trail——把当前完整状态历史树 面板序列化为 JSON 存成.trail文件下次一键加载研究可以跨几周进行。实现在src/renderer/index.js的SAVE_TRAIL/LOAD_TRAIL监听器里配合md5哈希检测未保存改动在新建 Trail 前弹出确认框。这是把会话即数据做到极致的示范。9. preload 脚本注入读取网页里的悬停链接用户悬停任意链接时面板底部会浮现目标 URL 预览。实现是经典三段式src/renderer/inject.js作为webview的 preload 脚本跑在网页上下文中监听mouseover后通过ipcRenderer.sendToHost上报链接src/renderer/webview.js监听ipc-message事件收到链接并显示顺带演示了new-window、did-navigate、page-title-updated等 webview 事件的接管——所有a target_blank点击都被转成开新面板。这就是在不碰 Chromium 的前提下扩展网页行为的轻量方案。10. callcc用异常当跳转写极简树遍历src/renderer/utils.js里有一个 20 行的小工具callcc把回调传进函数想提前退出就调用exit(arg)内部靠抛一个特殊的Exit错误实现从任意深度瞬间返回。配合递归traverse树搜索、父链查找都写得像命令式代码一样直白。写自定义数据结构操作时这个小技巧能省下大量标志位与递归传参。结语小项目里藏着大架构Cartographist 用不足 20 个文件回答了Electron 浏览器怎么造的全部关键问题src/main/负责窗口与菜单src/renderer/webview.js负责页面容器src/renderer/history.js负责数据模型src/renderer/history-visualization.js负责用 SVG 画出浏览树。建议动手顺序先跑npm install npm start体验一遍再按本文 1→10 的顺序对照源码阅读。如果你希望在自己的分支上修改仓库地址如下git clone https://gitcode.com/gh_mirrors/ca/cartographist把一个有趣的想法变成可运行的浏览器只需要一个周末和一个敢拆的开源项目。【免费下载链接】cartographistexperimental web browser optimized for rabbit-holing项目地址: https://gitcode.com/gh_mirrors/ca/cartographist创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表