尧图精选

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

🕒 发布时间:2026/9/20 0:00:17 📁 来源:尧图网络
1. 项目概述1.1 核心需求解析做独立开发者这几年说实话第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年流量惨淡、功能臃肿、代码自己都懒得看第二遍之后我才慢慢琢磨明白一个道理第一个网站是练手第二个网站才是真正开始思考“用户要什么”和“我能维护得起什么”的起点。“我的第二个网站”这个标题乍一看没什么技术含量但干过这行的人都懂它背后藏着一整套关于选型、架构、部署、迭代的决策链。这篇文章我就拿自己从第一个站到第二个站踩过的坑、做过的新选择作为主线掰开揉碎讲讲一个“非新手也非大牛”的开发者是怎么把一个从零开始的网站落实到服务器上、并让它持续产出价值的。这篇文章适合谁看两类人第一类刚做完第一个练手项目、准备认真做一个能上线能用的站点的开发者第二类做了一两个站但总觉得哪里别扭说不上来是代码问题还是思路问题想找个参照系的独立开发者。我会尽量把技术决策背后的“为什么”讲透而不是只给结论。1.2 从第一个站到第二个站到底发生了什么变化先交代一下背景。我的第一个网站是个博客系统当时用了最熟悉的组合前端 Vue 2 Element UI后端 Spring Boot数据库 MySQL整套东西放在一台学生优惠买的云服务器上。功能倒是很全文章管理、标签、评论、分类、用户系统甚至还有后台管理界面。但问题出在这个项目从有想法到上线只用了两周大部分代码都是照着教程敲的表结构设计得稀烂评论和文章之间没有做分表数据一多就明显卡顿。更要命的是我几乎没有想过“谁会来看这个网站”“我凭什么让别人来看”所以上线之后基本就是自己自嗨写了十几篇文章搜索引擎收录不到一百页访客全是自己点的。到了第二个网站心态完全变了。我给自己定了三个和以前不同的硬指标技术栈不再求“大而全”而是够用且自己能长期维护。内容和技术两条腿走路网站首先要有明确的服务对象。从第一天起就考虑部署、备份、监控而不是等项目写完再补。这三点基本决定了后面所有选型。说句实在话独立开发者做的非商业站点最大的隐形杀手不是流量贵而是你的兴趣和精力撑不过三个月。所以第二个网站我一开始就冲着“轻、稳、快”去所有增加维护成本的东西除非收益极高否则一律不做。2. 第二个网站的整体设计与技术选型2.1 静态站还是动态站先想清楚再动手做第二个网站之前我在“动态站”和“静态站”之间纠结了很久。第一个站是动态的后端服务器常年要跑着 Java 进程光内存就吃掉 1G 多时不时还要处理数据库慢查询、依赖包漏洞更新这些琐碎的事情非常消耗热情。第二个网站我最终选择了静态站方案。静态站的意思是服务器不跑程序只存放 HTML、CSS、JavaScript 以及图片等静态文件用户访问时由 Web 服务器或者 CDN 直接返回这些文件。这样做的好处极其明显服务器负载几乎为零一台最低配的机器都能扛住大量访问。安全性大幅提升没有数据库连接、没有服务端脚本执行想入侵也少了很多攻击面。部署极其简单改完本地内容推送到远程仓库或者服务器就行。成本极低甚至可以部署在对象存储加上 CDN 上域名钱就是全部开销。适合几个人用、更新频率不高的工具站、个人博客、作品集静态站是绝对的首选。如果你的网站需要用户登录、实时交互、存储用户数据那静态站就不合适了老老实实动态站。我当时给第二个网站的定义是“一个面向独立开发者的工具箱站点”把平时自己常用的一些效率工具做成网页版集合比如时间戳转换、JSON 格式校验、正则表达式测试、字符串编码解码等等。这种站点的特点是功能明确、交互简单、数据不需要持久化非常适合做成静态站。2.2 技术栈怎么选Hugo 还是 VuePress还是别的静态站生成器市面上一大堆主流的包括 Hugo、Hexo、VuePress、Astro、Docusaurus 等。每个都有自己的特点HugoGo 语言编写构建速度极快适合内容型站点主题生态丰富。HexoNode.js 生态老牌主题多但因为依赖较多几百篇文章后构建速度会变慢。VuePress基于 Vue适合做技术文档类站点自定义组件很方便。Astro比较新主打“默认零 JavaScript”性能优化很激进组件化思维也很好。我第一个站是纯手工撸的 HTML 页面后来觉得维护成本太高所以第二个站一开始就锁定静态站点生成器。比对了一圈我最终选了 Hugo。原因有三构建速度快文章和页面多了也不担心。单二进制文件不需要 Node.js 环境部署时拷贝一个可执行文件就行。内容用 Markdown 写对我来说写作体验最舒服。Hugo 的不足在于如果你想做非常复杂的自定义前端交互Hugo 的模板语言Go Template上手曲线比 Vue 组件要陡一些。但我的第二个网站每个工具页都是独立页面只需要少量 JavaScript 做交互完全在可控范围内。2.3 界面设计思路工具类网站的可用性优先工具类网站最忌讳的是花哨。用户进来是要快速完成一个任务而不是欣赏你的视觉设计。所以整个界面设计我遵循了几个原则首屏只放一个核心功能输入框和操作按钮其他信息全部后置。色板统一主色调用一个沉稳的蓝灰色系强调色只用在一个行动按钮上。字体用系统字体栈不额外加载 Web 字体减少请求数提升首屏速度。移动端适配做扎实因为很多人是用手机临时查个时间戳或校验 JSON。每个工具页面的布局也很固定顶部标题栏包含返回首页的链接中间是操作区底部是简要的使用说明。这样用户从 A 工具切到 B 工具时认知负担为零。还有个细节我专门做了一个“工具导航”页面把所有工具按类别排列比如开发辅助、文本处理、编码转换、正则测试。这样搜索引擎抓取时也能把整站的主题串联起来对 SEO 很友好。3. 实操过程从零搭建我的第二个网站3.1 第一步初始化 Hugo 项目Hugo 的安装很省事。在 macOS 上我用 Homebrew 直接安装brew install hugo然后创建新站点hugo new site my-second-website cd my-second-website此时目录结构大概是这样的config.toml archetypes/ content/ data/ layouts/ static/ themes/我对默认目录做了裁剪data和archetypes暂时用不到就先留着layouts是自定义模板目录后面要改东西会用到static放自己写的 CSS、JS 和图片content里面按工具分类建子目录。接下来是主题选择。Hugo 官方主题库里有非常多选择我挑了一个轻量、没有复杂动画、支持响应式的主题做基座然后自己改掉一些不需要的模块。如果你不想折腾主题直接用默认的 Ananke 主题也可以跑得很顺但对我来说基座的 HTML 结构太臃肿我最后是拿一个极简主题做了大量二次修改。3.2 第二步配置 config.toml 的关键参数Hugo 的核心配置都在config.toml文件里。这里我踩过一个坑默认配置里很多东西没开比如preserveTaxonomyNames、pygmentsUseClasses导致后面分类页中文乱码、代码高亮出问题。我最终的配置文件长这样baseURL https://tools.example.com/ languageCode zh-cn title 独立开发者工具箱 theme my-custom-theme enableRobotsTXT true pygmentsStyle monokai pygmentsCodeFences true pygmentsUseClasses true paginate 10 [params] description 面向独立开发者的在线效率工具集合 keywords 开发者工具,JSON格式化,时间戳,正则测试 [taxonomies] tag tags category categories重点解释几个参数enableRobotsTXT true自动生成 robots.txt告诉搜索引擎哪些路径可以抓取。注意如果你不想让某些工具页被抓取后面可以手动改。pygmentsUseClasses true代码高亮采用 CSS 类方式渲染而不是直接输出内联样式。这样我可以通过自定义 CSS 统一管理高亮配色改起来方便。paginate 10列表页每页显示 10 条内容对工具导航页来说够用多了显得乱。3.3 第三步内容组织结构设计第二个网站我把它定位成一个“工具集合”所以内容组织逻辑不是“按时间线”而是“按功能分类”。在content目录下我分了四个大类dev开发辅助工具比如 base64 编码解码、URL 编解码、时间戳转换。text文本处理工具比如大小写转换、行去重、字数统计。regex正则表达式相关一个是在线测试器一个是常用正则速查表。misc杂项比如随机密码生成、UUID 生成。每个工具一个 Markdown 文件文件头部加 front matter--- title: 时间戳转换 description: Unix 时间戳与日期时间互转支持毫秒级时间戳 date: 2024-01-15 type: tool tooljs: /js/tools/timestamp.js ---这里的type: tool是关键。Hugo 允许你定义不同的 content type我利用它让工具页和普通文章页走不同的模板。工具页模板只渲染一个大的输入框和结果展示区域不渲染文章正文的排版组件这样页面干净很多。tooljs是自定义参数对应这个工具的 JavaScript 文件名。我在模板里判断这个字段是否存在存在就在页面底部引入对应的脚本。这种方式让每个工具的逻辑都独立在一个 JS 文件里后期维护非常清晰。3.4 第四步前端交互实现工具类网站的门面是输入框和按钮但灵魂是即时反馈。三个原则输入即执行、结果即时展示、操作尽量不用鼠标。以时间戳转换工具为例核心逻辑并不复杂// /js/tools/timestamp.js document.addEventListener(DOMContentLoaded, function () { const inputField document.getElementById(tsInput); const resultField document.getElementById(tsResult); function parseTimestamp() { const raw inputField.value.trim(); if (!raw) { resultField.textContent ; return; } // 判断是秒还是毫秒级时间戳 let timestamp Number(raw); if (isNaN(timestamp)) { resultField.textContent 请输入合法的数字时间戳; return; } if (timestamp 1e12) { timestamp * 1000; } const date new Date(timestamp); resultField.textContent date.toString(); } inputField.addEventListener(input, parseTimestamp); });一个很容易被忽略的坑时间戳到底是秒还是毫秒。很多在线工具不做兼容用户一把 10 位的秒级时间戳放进去就得到错误结果。我在代码里做了自动判断小于 1e12 的视为秒级自动乘 1000这样用户不用关心单位问题。这个工具还有一个改进支持反向转换就是输入日期时间输出时间戳。我做了个 Tab 切换两套输入框共用结果区。交互变得更顺手了。3.5 第五步本地预览与性能检查Hugo 自带开发服务器支持热更新hugo server -D-D表示也渲染草稿内容。开发时我习惯开着浏览器开发者工具主要盯三块Console 有没有报错、Network 面板里每个资源加载时长、Performance 面板看首屏渲染时间。本地确定了没问题之后我先构建一次看看产物hugo --minify--minify会压缩 HTML、CSS、JS 文件能省不少流量。构建完成后public目录下就能看到最终静态文件。我习惯先把整个public目录扔到自己的本地 Nginx 里模拟线上环境确认所有路径正常后再部署到服务器。这一步能提前暴露很多问题尤其是相对路径、绝对路径的坑。3.6 第六步部署上线部署我选择了一个最不折腾的方案服务器用 Nginx 托管静态文件配合 Lets Encrypt 免费 SSL 证书。流程不复杂把构建好的public目录上传到服务器某个路径然后配置 Nginx 站点server { listen 80; server_name tools.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name tools.example.com; root /var/www/my-second-website; index index.html; ssl_certificate /etc/letsencrypt/live/tools.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/tools.example.com/privkey.pem; location / { try_files $uri $uri/ 404; } location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp)$ { expires 30d; add_header Cache-Control public, immutable; } }重点说明两点HTTP 强制跳转到 HTTPS现在这个时代不搞 HTTPS 说不过去搜索引擎也会降权。静态资源设置 30 天缓存。因为我的 JS 文件名在更新时是固定的可能存在缓存不刷新的问题所以我后来又给资源名加上了哈希后缀。Hugo 默认不会给 JS 加哈希但你可以通过模板和构建脚本组合实现。具体做法是在页面模板里引用$tooljs时拼一个版本参数比如/js/tools/timestamp.js?v20240115。这样我每次更新完手动改版本号就能强制浏览器拉取新文件简单粗暴但有效。当然如果你不想自己搞定服务器也可以把整个public目录扔到 GitHub Pages、Cloudflare Pages 或者腾讯云 COS 这类对象存储上成本更低还自带 CDN。第二种方式对国内用户访问速度也不错但域名备案是个绕不过去的事情所以我最终还是用了自己的服务器加 Nginx 的方案灵活度高一些。4. 常见问题与排查技巧实录4.1 Hugo 版本差异引发的构建错误Hugo 更新频率很高而且有些版本的配置语法会变化。我第一次在服务器上直接安装 Hugo 的二进制结果因为版本太新本地用的主题某个模板写法在新版本被移除了构建直接失败。解决办法构建那一步我改用 Docker以特定版本镜像构建保证本地和线上环境完全一致。配合一个简单的脚本docker run --rm -v $(pwd):/src -w /src jojomi/hugo:latest hugo --minify如果你不用 Docker那就务必修一个extended版本并用hugo version确认版本号一致后再继续。盲目加--minify有时候会触发其他问题具体看版本。4.2 相对路径和绝对路径的坑经常有人问为什么本地预览图片正常传上服务器就 404十有八九是路径问题。Hugo 默认生成的资源路径是绝对路径以/开头如果站点不是部署在域名根目录比如暂存在子目录下路径就全部失效了。解决方式是在配置里加上baseURL https://tools.example.com/Hugo 会以这个地址为基准生成所有绝对路径。注意baseURL要以斜杠结尾否则拼接时会出问题。另一个方式是启用relativeURLs true但我个人不推荐因为relativeURLs在嵌套路径比较深的页面很容易生成奇怪的相对路径尤其是你的页面里既有工具页又有文章页时。4.3 中文 SEO 索引慢怎么办这是很多中文静态站都会遇到的问题。搜索引擎对中文内容的收录速度比英文内容的站点普遍慢一些尤其是新域名。我试过一些手段最有效的三个主动在搜索引擎站长平台提交站点地图sitemap.xmlHugo 自带生成 sitemap在config.toml里开enableSitemap true就行。每个页面的 title 和 meta description 都要写清楚不能空着Hugo 会自动读取 front matter 中的title和description渲染到 HTML head 里。内部链接要做好工具页之间互相推荐相关工具形成站内链接网络能有效提升收录深度和权重。另外提醒一句不要为了 SEO 去堆关键词现在的搜索引擎算法对低质量内容识别能力非常强踏踏实实做内容才是正途。4.4 常见问题速查表为了让你少踩坑我把实践中遇到的高频问题整理成一个表问题现象可能原因解决办法页面样式丢失baseURL 配置错误检查 config.toml 中 baseURL 是否以 / 结尾图片显示 404图片路径写成了相对路径统一用/images/xxx.jpg绝对路径部署后访问是旧版本Nginx 缓存或浏览器缓存清理 Nginx 缓存资源链接加版本参数中文 URL 乱码文件名使用了非 ASCII 字符改用英文文件名front matter 中设中文 title代码高亮不生效pygmentsUseClasses 未开启开启该配置并引入对应 CSS提交 sitemap 后收录无变化sitemap 路径未知检查/sitemap.xml是否能直接访问这些坑每一个我都实际踩过尤其是缓存那一条上线早期经常改了代码用户还是看到旧页面后来加了版本参数才好很多。5. 运营与持续迭代的几点体会网站上线不是终点而是另一场马拉松的起点。第二个网站上线三个月后我开始尝试从几个维度做持续优化。首先是数据观测。我这个工具站没有注册登录体系所以拿不到特别精确的用户画像但通过访问日志可以分析出很多信息用户从哪个渠道来、在哪个页面停留时间最长、哪些工具搜索点击最多、哪个时段访问量高峰。我用的方案是 Nginx 的 access log 配合一个简单的 GoAccess 分析工具。GoAccess 的好处是直接在终端生成报告不用额外部署一套 ELK 或者 Grafana 全家桶轻量够用。其次是内容更新节奏。与文章类博客不同工具站的更新是以“新增工具”和“优化已有工具”为主。我给自己定的目标是一到两周迭代一个小工具同时修复一些已上线工具暴露出的边界问题。更新频率太高会把精力耗尽太低则没什么存在感一周到两周是比较舒服的节奏。接着是“付费墙”的思考。工具站积累了一定用户后很多人会问我你怎么变现我的答案是不一定每个工具站都要变现但如果要做最自然的方式是“高级版功能”或“去除广告”而不是一进来就弹窗付费。工具的价值在于即时性和效率用户愿意为其付费的前提是你已经帮他省下了大量时间。我在第十一个工具上线后尝试加了一个“捐赠”入口效果还算可以虽然收入不足以覆盖服务器成本但至少验证了一条可持续路径先提供免费价值再谈回报。6. 回望第二个网站我学到了什么做完第二个网站我最大的体会是技术不是最难的最难的是“克制”。第一个网站的问题在于我什么都想做最终什么都没做好第二个网站从第一天就锁定了边界只做工具箱这一件事。每加一个功能前我都会问自己这个功能会不会让用户更高效会不会增加我的维护负担两难取舍时我偏向“不加”。事实证明克制带来了稳定也带来了口碑。回到最初的问题第二个网站到底意味着什么它是一次技术上的简化也是一次心态上的成熟。它让我明白一个产品能够长期存在下去靠的不是炫技而是持续稳定的价值输出。如果你也正打算做自己的第二个网站我唯一的建议是少即是多先跑起来再优化。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →