1. 项目概述:一个轻量级、可定制的个人导航页
最近在折腾自己的浏览器主页,厌倦了那些臃肿、广告满天飞的默认页面,也受够了每次都要在书签栏里翻找常用链接。作为一个喜欢把一切工具都“私有化”和“个性化”的开发者,我决定自己动手,打造一个完全属于自己、能适配所有设备、并且足够轻快的个人导航页。这就是imyelo/clawpage项目的由来。
简单来说,clawpage是一个开源的、自托管的个人起始页(Start Page)。它的核心目标非常明确:让你用一个简洁的网页,聚合你所有高频使用的网站、工具和搜索入口,实现一键直达,提升日常工作和学习效率。它就像你的数字工作台的“控制面板”,所有常用工具都整齐地摆放在你面前。这个项目特别适合开发者、设计师、内容创作者以及任何希望拥有一个干净、高效、无干扰浏览器主页的用户。它不依赖任何复杂的后端服务,就是一个纯粹的静态网页,部署极其简单,你可以把它放在任何能托管静态文件的地方,甚至直接本地打开使用。
2. 核心设计理念与技术选型
2.1 为什么选择纯静态方案?
在项目启动前,我考虑过几种方案:使用现成的浏览器插件、部署一个带数据库的Web应用,或者直接写一个静态页面。最终选择了纯静态方案,原因如下:
- 极致轻量与快速:静态HTML/CSS/JS文件加载速度极快,几乎没有服务器响应延迟。这对于一个“起始页”来说至关重要,你希望它瞬间呈现,而不是等待加载动画。
- 部署成本为零:你可以将它部署在 GitHub Pages、Vercel、Netlify 等免费的静态网站托管服务上,无需购买服务器,也无需维护运行环境。
- 隐私完全自主:所有数据(你的网站链接、分类、图标)都保存在浏览器本地存储(LocalStorage)或你托管的配置文件中,不会上传到任何第三方服务器,隐私性有绝对保障。
- 维护简单:没有后端依赖,意味着没有数据库迁移、没有API版本兼容性问题。你只需要关心前端代码和配置文件。
这个选择决定了项目的技术栈会非常“前端化”和“轻量化”。
2.2 技术栈深度解析
clawpage的技术栈是经过精心挑选的,旨在平衡功能、美观和易用性。
核心框架:Vue 3 + Vite
- Vue 3:提供了响应式数据绑定和组件化开发能力。对于导航页这种交互逻辑不复杂但需要动态更新视图(如添加、编辑、删除书签,切换主题)的场景,Vue 的声明式编程模型非常合适。使用 Composition API 可以让代码逻辑更清晰,尤其是管理本地存储的状态时。
- Vite:作为构建工具,其基于原生 ES Module 的极速冷启动和热更新,带来了无与伦比的开发体验。对于一个小型项目,快速启动和即时反馈至关重要。
样式与组件:UnoCSS + Iconify
- UnoCSS:这是一个原子化CSS引擎。我放弃使用传统的UI组件库(如Element Plus),而选择UnoCSS,是为了获得极致的灵活性和更小的打包体积。通过编写类名就能快速实现样式,比如
p-4代表内边距,bg-gray-100 dark:bg-gray-800实现明暗主题切换,这让自定义样式变得非常高效和直观。 - Iconify:这是一个庞大的图标集合。
clawpage允许你为每个链接设置图标。使用 Iconify,你可以通过一个统一的图标名(如mdi:github)来引用几乎任何图标集的图标,而无需手动下载和管理数百个SVG文件。这极大地丰富了视觉表现力,同时保持了项目的整洁。
- UnoCSS:这是一个原子化CSS引擎。我放弃使用传统的UI组件库(如Element Plus),而选择UnoCSS,是为了获得极致的灵活性和更小的打包体积。通过编写类名就能快速实现样式,比如
数据持久化:浏览器 LocalStorage + 可选的配置文件
- LocalStorage:这是默认的数据存储方式。你的所有书签、分类、设置都保存在浏览器的本地存储中。这意味着你的配置是跟随当前浏览器的,换一台电脑或浏览器就需要重新配置。这种方式最简单,零配置。
- 配置文件:为了满足“一次配置,多处同步”的需求,
clawpage支持通过一个外部的config.json文件来初始化数据。你可以将这个JSON文件放在项目根目录或通过URL引用。这样,你可以在Git仓库里维护一份配置,部署后所有访问者(或你自己的不同设备)都能看到相同的导航页内容。这是实现“配置即代码”的关键。
搜索集成:自定义搜索引擎导航页的核心除了快速链接,就是搜索。
clawpage的搜索框支持自定义搜索引擎。你可以预设多个搜索引擎(如 Google、Bing、百度、知乎、GitHub等),并通过快捷键或下拉菜单快速切换。其实现原理是拼接搜索关键词和搜索引擎的URL模板,例如https://www.google.com/search?q={keyword}。
2.3 项目结构一览
理解项目结构有助于你进行二次开发或深度定制。一个典型的clawpage项目目录如下:
clawpage/ ├── public/ # 静态资源(如favicon.ico,可选的config.json) ├── src/ │ ├── assets/ # 静态资源(如图片、字体) │ ├── components/ # Vue组件 │ │ ├── BookmarkCard.vue # 单个书签卡片 │ │ ├── CategorySection.vue # 书签分类区域 │ │ ├── SearchBar.vue # 搜索框组件 │ │ └── SettingsModal.vue # 设置面板 │ ├── composables/ # Vue组合式函数(逻辑复用) │ │ └── useStorage.js # 封装LocalStorage操作 │ ├── styles/ # 全局样式(UnoCSS配置入口) │ ├── App.vue # 根组件 │ └── main.js # 应用入口 ├── index.html # HTML入口文件 ├── vite.config.js # Vite配置 ├── uno.config.js # UnoCSS配置 ├── config.json.example # 配置文件示例 └── package.json这个结构清晰地将UI组件、业务逻辑和配置分离,遵循了现代前端项目的最佳实践。
3. 从零开始部署与配置你的 Clawpage
3.1 快速部署:五分钟上线你的导航页
对于大多数只想使用的用户,部署clawpage简单到令人发指。这里提供两种最主流的方法:
方法一:使用 Vercel(推荐,最快捷)
- Fork 项目:访问
imyelo/clawpage的 GitHub 仓库,点击右上角的 “Fork” 按钮,将仓库复制到你自己的 GitHub 账户下。 - 登录 Vercel:访问 vercel.com ,使用你的 GitHub 账号登录。
- 导入项目:在 Vercel 控制台点击 “Add New…” -> “Project”,然后从你的 GitHub 仓库列表中找到刚刚 fork 的
clawpage项目,点击 “Import”。 - 一键部署:在配置页面,你通常不需要修改任何设置(框架预设Vite会被自动识别)。直接点击 “Deploy”。几十秒后,你的专属导航页就拥有了一个
*.vercel.app的在线地址。 - (可选)绑定自定义域名:在 Vercel 的项目设置中,你可以绑定自己购买的域名,让导航页的地址更个性化。
注意:Vercel 的默认部署会使用项目根目录下的
config.json(如果存在)作为初始数据。如果你想先使用空白的本地存储模式,可以在部署前删除config.json文件。
方法二:部署到 GitHub Pages
- Fork 项目:同上,先 fork 仓库到你的账户。
- 修改 Vite 配置:在项目根目录的
vite.config.js中,需要设置base为你的仓库名。// vite.config.js export default defineConfig({ base: '/你的仓库名/', // 例如 base: '/clawpage/', // ... 其他配置 }) - 启用 GitHub Pages:在你的仓库设置中,找到 “Pages” 选项。将 “Source” 设置为 “GitHub Actions”。
clawpage项目通常已经配置好了 GitHub Actions 工作流(.github/workflows/deploy.yml),它会自动在你推送代码时构建并部署到 Pages。 - 访问页面:部署完成后,你的页面地址将是
https://你的用户名.github.io/你的仓库名/。
3.2 核心配置详解:打造你的专属工作台
部署完成后,首次打开页面是空白的。你需要进行配置。配置有两种方式:在线编辑和配置文件。
方式一:在线编辑(适用于个人单设备)
这是最直接的方式。点击页面上的“设置”(通常是一个齿轮图标)按钮,你会进入编辑模式。
- 添加分类:点击“添加分类”,输入分类名称(如“开发”、“设计”、“日常”)。
- 添加书签:在分类内点击“添加书签”,弹出表单需要填写:
- 名称:网站的名字,如 “GitHub”。
- URL:网站的完整地址,如
https://github.com。 - 图标:输入 Iconify 图标标识符,如
mdi:github。你可以去 icones.js.org 这个网站搜索和预览图标,找到喜欢的复制其标识符即可。 - 描述:(可选)简短说明。
- 设置搜索:在设置面板中,找到搜索引擎配置。你可以添加、删除或修改搜索引擎。每个引擎需要提供:
- 名称:如 “Google”。
- 关键词:用于快速切换的缩写,如
g。 - URL 模板:其中
{keyword}是占位符,如https://www.google.com/search?q={keyword}。
- 调整外观:在设置中,你可以切换明暗主题、调整布局间距、卡片圆角等。所有更改都会实时保存到浏览器的 LocalStorage 中。
方式二:使用配置文件(适用于团队或多设备同步)
如果你希望导航页一开始就有内容,或者想在团队内共享一套标准书签,使用配置文件是更好的选择。
- 了解配置结构:项目根目录下通常有一个
config.json.example文件,这是配置模板。它的结构大致如下:{ "categories": [ { "name": "开发工具", "bookmarks": [ { "name": "GitHub", "url": "https://github.com", "icon": "mdi:github", "description": "代码托管平台" }, { "name": "Vue.js", "url": "https://vuejs.org", "icon": "mdi:vuejs", "description": "渐进式JavaScript框架" } ] } ], "search": { "engines": [ { "name": "Google", "keyword": "g", "template": "https://www.google.com/search?q={keyword}" }, { "name": "Bing", "keyword": "b", "template": "https://www.bing.com/search?q={keyword}" } ], "default": "g" }, "settings": { "theme": "dark", "layout": "grid" } } - 创建你的配置:复制
config.json.example并重命名为config.json,然后按照你的需求修改其中的内容。你可以用文本编辑器或代码编辑器(如 VS Code)来编辑这个 JSON 文件。 - 应用配置:
- 本地运行:将
config.json放在public/目录下,然后运行npm run dev,页面会自动加载该配置。 - 在线部署:将
config.json放在你 fork 后的仓库根目录或public/目录下,然后重新部署(Vercel 会自动部署,GitHub Pages 需要触发 Actions)。部署后,所有访问者打开页面都会首先加载这份配置。之后,每个用户仍然可以在浏览器本地进行个性化覆盖,但这为他们提供了一个优秀的起点。
- 本地运行:将
实操心得:我强烈建议即使是一个人使用,也维护一份
config.json。这相当于你的导航页的“备份”和“版本记录”。当你换电脑、重装系统,或者想在其他地方快速搭建一个同样的导航页时,只需要这个文件即可。你可以把这个文件放在云盘或者私有Git仓库里。
4. 高级定制与二次开发指南
如果你不满足于基本使用,想调整样式、增加功能,那么可以尝试二次开发。这需要一些前端基础。
4.1 本地开发环境搭建
- 克隆代码:
git clone https://github.com/你的用户名/clawpage.git cd clawpage - 安装依赖:确保你已安装 Node.js(推荐 LTS 版本)。
npm install - 启动开发服务器:
终端会输出一个本地地址(通常是npm run devhttp://localhost:5173),在浏览器中打开它,你将看到一个支持热重载的开发环境。任何代码修改都会实时反映在页面上。
4.2 修改样式与主题
样式主要通过 UnoCSS 和 Vue 组件的<style>块控制。
- 修改全局样式:可以编辑
src/styles/下的文件,或者在App.vue的<style>中编写全局 CSS。UnoCSS 的配置在uno.config.js中,你可以在这里添加自定义的原子类规则或引入新的图标集。 - 修改组件样式:直接找到对应的
.vue文件(如src/components/BookmarkCard.vue),修改其<style>部分。由于使用了 Vue 的scoped属性,这里的样式通常只影响当前组件。 - 添加新主题:
clawpage的明暗主题切换是通过 CSS 变量和 UnoCSS 的dark:变体实现的。如果你想添加一个“蓝色主题”,可以在全局样式中定义一组新的 CSS 变量,并在设置逻辑中增加一个主题选项,在切换时动态修改根元素的类名或变量值。
4.3 扩展功能思路
这里提供几个可以尝试的扩展方向:
- 集成天气组件:在页面上方添加一个显示当地天气的小部件。你可以调用免费的天气API(如 OpenWeatherMap),但需要注意在前端直接调用涉及API密钥暴露问题。一个更安全的做法是写一个简单的无服务器函数(如 Vercel Serverless Function)来代理这个请求。
- 添加快捷命令(Command+K):像 Raycast 或 Spotlight 一样,通过一个快捷键呼出搜索框,不仅可以搜索网页,还可以搜索你本地配置的书签并快速跳转。这需要监听键盘事件并管理一个全局的搜索模态框状态。
- 数据导入/导出:在设置面板中增加一个功能,将当前 LocalStorage 中的数据导出为一个 JSON 文件,也可以从 JSON 文件导入,覆盖或合并现有数据。这比手动编辑
config.json更友好。 - 分组与折叠:当书签分类非常多时,可以允许用户将某些分类折叠起来,节省空间。
- 背景自定义:允许用户上传图片或指定纯色/渐变作为页面背景。
注意事项:在进行任何二次开发前,请先阅读项目的代码,理解其数据流(如何使用
useStoragecomposable)和组件通信方式。尽量遵循项目已有的代码风格和模式,这样你的修改更容易被理解和维护。
5. 常见问题与故障排除实录
在实际使用和部署过程中,你可能会遇到以下问题。这里是我踩过的一些坑和解决方案。
5.1 部署后页面空白或显示异常
- 症状:部署到 Vercel/GitHub Pages 后,打开页面是空白的,或者样式完全错乱,控制台有 JavaScript 错误。
- 排查步骤:
- 检查构建日志:在 Vercel 或 GitHub Actions 的部署日志中,查看是否有构建错误。常见错误是依赖安装失败或语法错误。
- 检查基础路径(Base Path):这是最常见的问题。如果你部署到非根路径(如
username.github.io/repo-name/),必须在vite.config.js中正确配置base选项。对于 GitHub Pages,base必须是'/repo-name/'。Vercel 部署到根域名则通常不需要。 - 检查资源加载:打开浏览器开发者工具(F12)的“网络”(Network)选项卡,刷新页面,查看是否有 CSS 或 JS 文件加载失败(404错误)。这通常也是基础路径配置错误导致的。
- 清除缓存:有时是浏览器缓存了旧版本。尝试强制刷新(Ctrl+F5)或使用无痕模式访问。
5.2 图标不显示
- 症状:书签卡片上的图标显示为一个方框或占位符。
- 排查步骤:
- 检查图标标识符:确认你在配置中填写的 Iconify 图标标识符是正确的。例如
mdi:github,注意冒号是英文冒号。最好的方法是去 icones.js.org 搜索并复制。 - 检查网络:Iconify 图标默认是从在线 CDN 加载的。确保你的网络环境能够访问
https://api.iconify.design。如果网络受限,可以考虑将图标集打包到本地,但这需要修改 UnoCSS 配置,比较复杂。 - 查看控制台错误:在开发者工具的“控制台”(Console)中查看是否有关于图标加载的报错信息。
- 检查图标标识符:确认你在配置中填写的 Iconify 图标标识符是正确的。例如
5.3 配置不生效
- 症状:已经放置了
config.json文件,但打开页面仍然是空的,或者没有加载配置内容。 - 排查步骤:
- 确认文件位置和名称:确保文件名为
config.json(注意是.json后缀,不是.json.example),并且放在正确的位置。对于 Vite 项目,通常放在public/目录下或项目根目录。 - 检查 JSON 格式:JSON 文件对格式要求非常严格。多一个逗号、少一个引号都会导致解析失败。使用在线的 JSON 格式验证工具(如 JSONLint )粘贴你的
config.json内容进行验证。 - 查看网络请求:打开开发者工具的“网络”选项卡,刷新页面,查看浏览器是否发起了一个对
/config.json的请求,以及这个请求的状态码是 200(成功)还是 404(未找到)。 - 优先级问题:
clawpage的逻辑通常是:如果浏览器 LocalStorage 中已有数据,则优先使用 LocalStorage,忽略config.json。如果你想强制使用配置文件,需要先清除浏览器的 LocalStorage 数据(在开发者工具的“应用”(Application)->“存储”(Storage)->“本地存储”(Local Storage)中,找到你的网站域名,右键清除)。
- 确认文件位置和名称:确保文件名为
5.4 搜索功能异常
- 症状:在搜索框输入内容按回车后,没有跳转到搜索页面,或者跳转到了错误的网址。
- 排查步骤:
- 检查搜索引擎配置:确认你配置的搜索引擎 URL 模板是正确的。确保模板中包含
{keyword}这个占位符。例如,百度的模板应该是https://www.baidu.com/s?wd={keyword}。 - 检查默认引擎:确认设置的默认搜索引擎关键词(
default)存在于你配置的引擎列表中。 - URL编码:如果搜索关键词包含空格或特殊字符(如中文),浏览器会自动进行 URL 编码。这是正常行为。如果你的自定义搜索引擎对编码有特殊要求,可能需要在代码中做额外处理。
- 检查搜索引擎配置:确认你配置的搜索引擎 URL 模板是正确的。确保模板中包含
5.5 移动端体验不佳
- 症状:在手机或平板上访问,布局错乱,触摸操作不灵敏。
- 解决方案:
clawpage本身使用了响应式设计,但可能在某些极端屏幕尺寸下效果不佳。你可以通过浏览器的开发者工具模拟移动设备进行调试。- 检查组件是否使用了固定的像素(px)宽度,可以尝试改为相对单位(如
rem、vw)或使用 Flexbox/Grid 布局的弹性特性。 - 确保触摸目标(如书签卡片、按钮)有足够的大小(建议至少 44x44 像素),方便手指点击。
打造一个属于自己的导航页,远不止是技术上的实现,更是一种工作习惯和生活态度的塑造。它强迫你去梳理哪些工具对你来说是真正高频、重要的,从而减少在信息海洋中的无谓徘徊。imyelo/clawpage提供了一个优雅、轻量的起点,它没有试图做所有事情,而是把核心的“快速访问”和“搜索”体验做到了足够好。剩下的,就交给你去填充内容和个性化了。我最享受的时刻,就是在浏览器地址栏输入我的导航页域名,按下回车,那个干净、熟悉、满载着我个人工作流印记的页面瞬间展开——那是一种数字生活尽在掌控的踏实感。如果你也厌倦了千篇一律的主页,不妨就从 fork 这个仓库开始,花上一个下午,构建你的专属入口。