<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>lenmei233&apos;s Blog</title><description>技术分享与日常记录</description><link>https://blog.lenmei233.top/</link><language>zh_CN</language><item><title>苦难就是苦难</title><link>https://blog.lenmei233.top/posts/suffering-is-suffering/</link><guid isPermaLink="true">https://blog.lenmei233.top/posts/suffering-is-suffering/</guid><description>别再把勋章挂在伤口上了，那很疼</description><pubDate>Tue, 23 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;苦难就是苦难&lt;/h2&gt;
&lt;p&gt;我们这个时代，最伟大的发明，不是人工智能，不是基因编辑，而是“苦难美学”。我们成了最顶尖的炼金术士，能将任何一坨散发着恶臭的、由血汗和绝望构成的苦难，提炼成闪闪发光的“正能量”金牌，然后挂在每个人的脖子上，美其名曰“榜样”。&lt;/p&gt;
&lt;p&gt;你看那个凌晨四点就在街角卖早餐的阿姨，她不是被生活逼得没有选择，她是“城市唤醒师”，是“勤劳的化身”。她的关节炎不是病，是“奋斗的勋章”。她那双布满老茧、油污洗不掉的手，不是劳损的证据，而是“最动人的艺术品”。我们举着手机，对着她因常年吸入油烟而嘶哑的嗓门录下视频，配上激昂的音乐，发到网上，收获一片点赞和“阿姨加油！”的评论。然后心安理得地买完早餐，开着空调的汽车去上班，心里还为自己传播了“正能量”而感动不已。&lt;/p&gt;
&lt;p&gt;你看那个为了省钱，一顿饭只吃一个馒头配咸菜的大学生。他不是贫穷，他是在“体验极简主义”，是“自律的典范”。他的胃病不是病，是“对物欲横流社会的无声抗议”。媒体把他请上节目，让他分享“如何用一百块活一个月”的经验，主持人声泪俱下地赞美他的“精神富足”。电视机前的观众们一边吃着外卖，一边感叹“现在的大学生真有毅力”，却绝口不提助学贷款的繁琐和兼职机会的稀少。&lt;/p&gt;
&lt;p&gt;我们最擅长的，就是给苦难裹上一层糖衣，然后逼着你吞下去，还要你面带微笑地说声“谢谢”。那个在暴雨中送货的外卖小哥，不是在用生命换几块钱的配送费，他是“风雨无阻的城市骑士”。那个为了给孩子治病而打三份工的父亲，不是被医疗压垮的普通人，他是“伟大的父爱化身”。那个连续加班一个月后猝死在工位上的年轻人，不是过劳死的牺牲品，他是“燃烧自己，照亮公司的敬业标兵”。&lt;/p&gt;
&lt;p&gt;于是，苦难被神圣化了。痛苦成了荣耀的阶梯，绝望成了励志的鸡汤。我们不再追问：为什么一个社会需要有人凌晨四点起来卖早餐？为什么一个大学生要靠一个馒头度日？为什么外卖小哥要在暴雨中搏命？为什么一个父亲要被逼到那种地步？为什么年轻人要“燃烧”自己？&lt;/p&gt;
&lt;p&gt;不，我们不问。问这些问题，就等于撕开了那层精美的糖纸，露出了里面苦涩的、令人作呕的真相。真相是，很多苦难本可以不发生。真相是，赞美苦难，就是在为制造苦难的体系辩护。它巧妙地将矛头从结构性问题，转向了个人的“意志力”和“心态”。你过得不好，不是社会的问题，是你不够“坚强”，不懂得在“苦难中开花”。&lt;/p&gt;
&lt;p&gt;这是一种极其残忍的集体催眠。我们一边消费着他人的苦难，一边将其包装成精神食粮喂给自己，以此来麻痹自己的良知，消解自己的不安。我们赞美苦难，是因为我们害怕自己成为下一个苦难者，所以我们宁愿相信，苦难是一种值得追求的品质，而不是一个需要被消灭的敌人。&lt;/p&gt;
&lt;p&gt;但炼金术终究是骗术。糖衣融化之后，剩下的还是那坨苦涩的、恶臭的玩意儿。苦难不会因为被赞美就变得甜美，它只会带来创伤、不公和绝望。那个卖早餐的阿姨，她想要的不是“城市唤醒师”的虚名，而是一个能让她睡到自然醒的安稳晚年。那个吃馒头的学生，他想要的不是“极简主义”的标签，而是一顿营养均衡的午餐。&lt;/p&gt;
&lt;p&gt;所以，收起那套“苦难美学”的辞藻吧。苦难就是苦难，它丑陋、痛苦、毫无价值。一个真正健康和文明的社会，不应该是赞美谁更能忍受苦难，而是应该努力去创造一个没有人需要去忍受不必要苦难的环境。&lt;/p&gt;
&lt;p&gt;别再把勋章挂在伤口上了，那很疼。&lt;/p&gt;
</content:encoded></item><item><title>前端开发：为什么要优先选择SVG图标而非PNG/JPG</title><link>https://blog.lenmei233.top/posts/whysvg/</link><guid isPermaLink="true">https://blog.lenmei233.top/posts/whysvg/</guid><description>SVG图标凭什么成为前端首选？看完这篇，你会彻底抛弃那些笨重的位图图标！</description><pubDate>Sun, 14 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;作为一名深耕前端的开发者，我曾在图标选型上踩过不少坑。还记得刚入行时，项目里塞满了PNG格式的图标，每次适配不同分辨率的设备，都要准备  &lt;strong&gt;@1x&lt;/strong&gt; 、 &lt;strong&gt;@2x&lt;/strong&gt; 、 &lt;strong&gt;@3x&lt;/strong&gt;  多套资源，不仅文件夹臃肿不堪，还经常出现图标模糊、拉伸变形的问题。&lt;/p&gt;
&lt;p&gt;后来接触到SVG图标，才发现这才是前端图标的“最优解”。它不仅完美解决了位图的适配痛点，还能大幅优化项目性能、提升开发效率。如今在我的前端项目里，SVG图标已经成为标配，那些PNG、JPG格式的图标，早已被我扔进了“淘汰清单”。&lt;/p&gt;
&lt;p&gt;如果你还在为图标适配、体积优化头疼，那这篇文章一定会给你带来新的启发。&lt;/p&gt;
&lt;h2&gt;让我们开始吧&lt;/h2&gt;
&lt;p&gt;首先我们需要用到下列东西&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;能够独立思考的大脑 x 1：用于理解SVG的矢量特性和前端应用场景&lt;/li&gt;
&lt;li&gt;代码编辑器 x 1：推荐VS Code，搭配SVG相关插件可提升开发效率&lt;/li&gt;
&lt;li&gt;矢量绘图工具 x 1：如Figma、Inkscape，用于设计或编辑SVG图标&lt;/li&gt;
&lt;li&gt;前端项目环境 x 1：用于实战SVG图标的引入与使用&lt;/li&gt;
&lt;li&gt;一颗追求极致性能的心 x 1：毕竟优秀的前端开发者，都对性能有执念&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SVG是什么？为什么前端要优先用它做图标？&lt;/h2&gt;
&lt;p&gt;SVG的全称是可缩放矢量图形，它是一种基于XML的矢量图像格式。与PNG、JPG这类基于像素的位图不同，SVG通过数学公式描述图形的路径、形状和颜色，这就决定了它天生适合作为前端图标使用。&lt;/p&gt;
&lt;h2&gt;图标对比位图图标的核心优势：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;无限缩放不失真：无论放大多少倍，边缘始终清晰锐利，完美适配从手机到4K大屏的所有设备&lt;/li&gt;
&lt;li&gt;体积更小更轻量：结构简单的SVG图标体积远小于同等视觉效果的PNG，尤其在高分辨率场景下优势明显&lt;/li&gt;
&lt;li&gt;灵活可控可定制：可直接通过CSS修改颜色、大小、透明度，甚至实现动画效果，无需更换图片资源&lt;/li&gt;
&lt;li&gt;支持语义化与无障碍：作为XML文档，SVG可添加 title 、 desc 标签，提升页面的无障碍访问性&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;快速上手SVG图标&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;获取SVG图标&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;获取SVG图标的方式有很多，推荐几种常用途径：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开源图标库：如Iconfont、Font Awesome、Material Icons，可直接下载SVG格式图标&lt;/li&gt;
&lt;li&gt;矢量工具绘制：用Figma、Sketch等工具设计图标，导出为SVG文件&lt;/li&gt;
&lt;li&gt;在线转换：将现有位图通过在线工具转换为SVG（注意转换后的文件可能需要手动优化）&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;前端引入SVG图标的三种方式&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;方式一：直接内联到HTML中
这是最灵活的方式，可直接通过CSS控制样式：&lt;/p&gt;
&lt;p&gt;&amp;lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&amp;gt;
&amp;lt;path d=&quot;M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM12 20C7.59 20 4 16.41 4 12C4 7.59 7.59 4 12 4C16.41 4 20 7.59 20 12C20 16.41 16.41 20 12 20ZM16.59 7.58L10 14.17L7.41 11.59L6 13L10 17L18 9L16.59 7.58Z&quot; fill=&quot;#333333&quot;/&amp;gt;
&amp;lt;/svg&amp;gt;&lt;/p&gt;
&lt;p&gt;方式二：作为图片资源引入
与引入PNG的方式类似，简单快捷但样式可控性较弱：&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;./icons/arrow-right.svg&quot; alt=&quot;箭头向右&quot; class=&quot;icon&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;方式三：使用SVG Sprite雪碧图
适合项目中有大量图标的场景，可减少HTTP请求：&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- 定义Sprite --&amp;gt;
&amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; style=&quot;display: none;&quot;&amp;gt;
&amp;lt;symbol id=&quot;icon-user&quot; viewBox=&quot;0 0 24 24&quot;&amp;gt;
&amp;lt;path d=&quot;M12 12C14.21 12 16 10.21 16 8C16 5.79 14.21 4 12 4C9.79 4 8 5.79 8 8C8 10.21 9.79 12 12 12ZM12 14C9.33 14 4 15.34 4 18V20H20V18C20 15.34 14.67 14 12 14Z&quot;/&amp;gt;
&amp;lt;/symbol&amp;gt;
&amp;lt;symbol id=&quot;icon-settings&quot; viewBox=&quot;0 0 24 24&quot;&amp;gt;
&amp;lt;path d=&quot;M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z&quot;/&amp;gt;
&amp;lt;/symbol&amp;gt;
&amp;lt;/svg&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- 使用图标 --&amp;gt;
&amp;lt;svg class=&quot;icon&quot; width=&quot;24&quot; height=&quot;24&quot;&amp;gt;
&amp;lt;use xlink:href=&quot;#icon-user&quot;&amp;gt;&amp;lt;/use&amp;gt;
&amp;lt;/svg&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;给SVG图标添加动画效果&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;SVG的强大之处在于支持丰富的动画，比如给图标加个旋转效果：&lt;/p&gt;
&lt;p&gt;.icon-rotate {
animation: rotate 2s linear infinite;
}&lt;/p&gt;
&lt;p&gt;@keyframes rotate {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}&lt;/p&gt;
&lt;h2&gt;SVG图标使用的最佳实践&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;优化SVG文件体积&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;删除冗余代码：导出的SVG可能包含大量无关的注释、属性，可通过SVGOMG等工具压缩&lt;/li&gt;
&lt;li&gt;合并路径：将多个小路径合并为一个，减少代码量&lt;/li&gt;
&lt;li&gt;使用 viewBox 属性：去掉固定的 width 和 height ，通过 viewBox 实现自适应缩放&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;避免这些常见误区&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;不要滥用位图转SVG：复杂位图转换后的SVG体积可能比原图更大，效果也不佳&lt;/li&gt;
&lt;li&gt;注意兼容性：低版本IE对SVG的支持有限，可通过降级方案或polyfill处理&lt;/li&gt;
&lt;li&gt;避免内联过多大尺寸SVG：大量内联SVG会增加HTML文件体积，影响首屏加载速度&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;常用工具与资源推荐&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;图标库：Iconfont（阿里图标库）、Font Awesome、Remix Icon&lt;/li&gt;
&lt;li&gt;压缩工具：SVGOMG、SVG Cleaner&lt;/li&gt;
&lt;li&gt;编辑工具：Figma、Inkscape、Affinity Designer&lt;/li&gt;
&lt;li&gt;在线生成工具：SVG Repo、Flaticon&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;从位图到SVG，不仅仅是图标的格式切换，更是前端开发理念的升级——追求更优的性能、更灵活的可控性、更极致的用户体验。&lt;/p&gt;
&lt;p&gt;SVG图标凭借其矢量特性、轻量体积和高度可定制性，已经成为现代前端开发的标配。它不仅能帮我们解决多端适配的痛点，还能让图标真正融入前端工程化体系，与代码、样式无缝协作。&lt;/p&gt;
&lt;p&gt;现在，每当我开始一个新的前端项目，第一件事就是搭建SVG图标体系。这已经成为我的开发习惯，也是我推荐给所有前端开发者的最佳实践。&lt;/p&gt;
&lt;p&gt;SVG图标的魅力在于：无限缩放不失真，轻量灵活可定制，简单高效易维护。&lt;/p&gt;
&lt;p&gt;开始使用SVG图标吧，你会发现前端开发的体验会提升一个档次！&lt;/p&gt;
</content:encoded></item><item><title>Docker：轻量级容器化技术的实战指南</title><link>https://blog.lenmei233.top/posts/docker/</link><guid isPermaLink="true">https://blog.lenmei233.top/posts/docker/</guid><description>开始使用Docker吧，你会发现它将成为你开发工具箱中不可或缺的利器！</description><pubDate>Wed, 19 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;最近这段平常的学习空闲时间，闲来无事，回顾我这些年的开发历程，从最初的手动部署环境，到使用虚拟机，再到现在的容器化技术，真是感慨万千。记得刚开始工作的时候，每次为新项目配置开发环境都是一场噩梦——不同项目需要不同版本的依赖，经常出现&quot;在我机器上能跑&quot;的经典问题。&lt;/p&gt;
&lt;p&gt;后来接触了虚拟机，虽然解决了环境隔离的问题，但虚拟机太重了，启动慢，占用资源多，迁移也不方便。直到我发现了Docker这个神器，才真正体会到什么是&quot;一次构建，到处运行&quot;的便利。&lt;/p&gt;
&lt;p&gt;作为一个Coder，怎么能不掌握Docker呢？这相当于是你在云时代的生存技能，是团队协作的基石，更是现代应用部署的标准配置。&lt;/p&gt;
&lt;p&gt;所以在其我的开发流程中，Docker已经成为了不可或缺的一部分。它不仅让我摆脱了环境配置的困扰，还让我的应用部署变得异常简单和可靠。&lt;/p&gt;
&lt;h2&gt;让我们开始吧&lt;/h2&gt;
&lt;h3&gt;首先我们需要用到下列东西&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;能够独立思考的大脑 x 1&lt;/strong&gt;：用于理解Docker的核心概念和解决可能遇到的问题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker Desktop x 1&lt;/strong&gt;：Windows/Mac用户可以直接下载这个集成环境，Linux用户需要单独安装Docker引擎&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker Hub账号 x 1&lt;/strong&gt;：用于拉取和推送镜像，类似于GitHub之于代码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;**Git版本控制工具(链接1)**​ x 1：用于管理你的Dockerfile和docker-compose.yml文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;一个好奇的心 x 1&lt;/strong&gt;：Docker的世界很有趣，值得你深入探索&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Docker是什么？为什么需要它？&lt;/h3&gt;
&lt;p&gt;Docker是一个开源的容器化平台，它让你能够将应用及其所有依赖打包到一个轻量级、可移植的容器中。与传统的虚拟机不同，Docker容器共享主机操作系统内核，因此更加轻量级和高效。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker的核心优势：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;轻量级&lt;/strong&gt;：容器启动秒级完成，资源占用少&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;可移植性&lt;/strong&gt;：一次构建，到处运行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;隔离性&lt;/strong&gt;：每个容器都是独立的运行环境&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;效率&lt;/strong&gt;：比虚拟机更高效，性能损失小&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;快速上手Docker&lt;/h3&gt;
&lt;h4&gt;1. 安装Docker&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Mac/Windows用户：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;直接下载&lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot;&gt;Docker Desktop&lt;/a&gt;并安装，按照向导完成设置即可。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linux用户(Ubuntu为例)：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 安装必要依赖
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 添加Docker官方GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 设置仓库
echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null

# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 验证安装
sudo docker run hello-world
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2. Docker核心概念&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;镜像(Image)&lt;/strong&gt;：只读的模板，包含运行应用所需的代码、运行时、库和环境变量&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;容器(Container)&lt;/strong&gt;：镜像的可运行实例&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt;：定义如何构建镜像的文本文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker Hub&lt;/strong&gt;：官方的镜像仓库，类似于GitHub之于代码&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. 第一个Docker实践：运行一个Nginx web服务器&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 拉取官方Nginx镜像
docker pull nginx

# 运行Nginx容器
docker run -d -p 8080:80 --name my-nginx nginx

# 访问 http://localhost:8080 查看运行结果
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就这么简单！你已经成功运行了一个Web服务器。&lt;/p&gt;
&lt;h4&gt;4. 创建自己的Docker镜像&lt;/h4&gt;
&lt;p&gt;让我们创建一个简单的Node.js应用的Docker镜像：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 项目结构：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;my-node-app/
├── app.js
├── package.json
└── Dockerfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Dockerfile示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 使用官方Node.js镜像作为基础镜像
FROM node:18-alpine

# 设置工作目录
WORKDIR /usr/src/app

# 复制package.json和package-lock.json
COPY package*.json ./

# 安装依赖
RUN npm install

# 复制应用源代码
COPY . .

# 暴露端口
EXPOSE 3000

# 定义容器启动时执行的命令
CMD [&quot;node&quot;, &quot;app.js&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. 构建和运行：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 在项目目录下构建镜像
docker build -t my-node-app .

# 运行容器
docker run -d -p 3000:3000 --name my-running-app my-node-app

# 访问 http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Docker Compose：多容器应用管理&lt;/h3&gt;
&lt;p&gt;对于复杂的应用，通常需要多个服务协同工作（如Web应用+数据库）。这时候就需要Docker Compose了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;docker-compose.yml示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.8&apos;

services:
  web:
    build: .
    ports:
      - &quot;3000:3000&quot;
    depends_on:
      - redis
    environment:
      - NODE_ENV=production

  redis:
    image: redis:alpine
    ports:
      - &quot;6379:6379&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;使用方法：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 启动所有服务
docker-compose up -d

# 查看运行中的服务
docker-compose ps

# 停止并删除服务
docker-compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;实战技巧和最佳实践&lt;/h3&gt;
&lt;h4&gt;1. Dockerfile优化技巧&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用官方镜像&lt;/strong&gt;：尽量使用官方维护的镜像&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;选择合适的基础镜像&lt;/strong&gt;：如使用alpine版本减小镜像大小&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;多阶段构建&lt;/strong&gt;：减小最终镜像大小&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;合理使用缓存&lt;/strong&gt;：正确排序Dockerfile指令以利用构建缓存&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;多阶段构建示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install &amp;amp;&amp;amp; npm run build

# 生产阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/dist ./dist
RUN npm install --production
EXPOSE 3000
CMD [&quot;node&quot;, &quot;dist/app.js&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2. 常用命令速查&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 镜像相关
docker images                  # 列出所有镜像
docker pull &amp;lt;image&amp;gt;            # 拉取镜像
docker rmi &amp;lt;image&amp;gt;             # 删除镜像

# 容器相关
docker ps                      # 列出运行中的容器
docker ps -a                   # 列出所有容器
docker run [options] &amp;lt;image&amp;gt;   # 运行容器
docker start/stop/restart &amp;lt;container&amp;gt;  # 控制容器
docker exec -it &amp;lt;container&amp;gt; /bin/bash  # 进入容器
docker logs &amp;lt;container&amp;gt;        # 查看容器日志
docker rm &amp;lt;container&amp;gt;          # 删除容器

# 镜像构建
docker build -t &amp;lt;tag&amp;gt; .        # 构建镜像

# 清理
docker system prune            # 清理无用资源
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. 数据持久化&lt;/h4&gt;
&lt;p&gt;容器是临时的，要持久化数据需要使用卷(volumes)或绑定挂载(bind mounts)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建卷
docker volume create my-volume

# 运行容器并挂载卷
docker run -d -v my-volume:/app/data my-image

# 或者使用绑定挂载(宿主机目录映射到容器)
docker run -d -v /host/path:/container/path my-image
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;结语&lt;/h3&gt;
&lt;p&gt;Docker真的改变了我的开发方式。它不仅解决了环境一致性的问题，还让部署变得如此简单。还记得我第一次在生产环境使用Docker部署应用时，那种&quot;无论在哪里都能完美运行&quot;的安心感，是传统部署方式无法给予的。&lt;/p&gt;
&lt;p&gt;作为一个Coder，掌握Docker不仅仅是为了部署应用，更是为了理解现代软件架构和DevOps实践的基础。它让我们能够更专注于业务逻辑的开发，而不是环境配置的琐事。&lt;/p&gt;
&lt;p&gt;现在，每当我开始一个新项目，第一件事就是写Dockerfile和docker-compose.yml。这已经成为了我的标准工作流程，也是我推荐给所有开发者的最佳实践。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker的魅力在于：一次构建，到处运行；简单配置，复杂管理；小而强大，轻而可靠。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;开始使用Docker吧，你会发现它将成为你开发工具箱中不可或缺的利器！&lt;/p&gt;
</content:encoded></item><item><title>使用Cloudflare部署你的免费网站统计 -- Web-Analytics</title><link>https://blog.lenmei233.top/posts/hananalytics/</link><guid isPermaLink="true">https://blog.lenmei233.top/posts/hananalytics/</guid><description>本站统计功能实现的方法 </description><pubDate>Sat, 18 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;我的博客部署在 Cloudflare Pages 上，Cloudflare 作为 “赛博菩萨” 免费提供边缘服务器托管网站，还提供了 Web-Analytics 供站长查看网站统计数据。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/Screenshot%202025-10-18%20at%2020-04-29%20%E5%88%86%E6%9E%90%E5%92%8C%E6%97%A5%E5%BF%97%20Web%20Analytics%20Cloudflare.png&quot; alt=&quot;博客统计截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这一切看似不错，但在其他设备上查看数据时，需要登录 Cloudflare 并逐层打开菜单，非常不便，且数据仅限自己查看。经过一番搜索，我发现了一个 GitHub 开源项目可以解决这个问题。&lt;/p&gt;
&lt;h2&gt;一、HanAnalytics 特点&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;uxiaohan/HanAnalytics&quot;}&lt;/p&gt;
&lt;p&gt;Han-Analytics 是一个简单的网络分析跟踪器和仪表板，托管在被称为 “赛博菩萨” 的 Cloudflare 上，可无成本稳定运行，每天可达 10 万次免费统计。无需域名、服务器、数据库，托管在 Cloudflare Pages 上即可快速部署网站分析仪表板。&lt;/p&gt;
&lt;h2&gt;二、实测部署&lt;/h2&gt;
&lt;p&gt;通过阅读 GitHub 仓库的 Readme.md，我了解到其作用和&lt;a href=&quot;https://www.vvhan.com/article/han-analytics&quot;&gt;部署教程&lt;/a&gt;，于是准备尝试。&lt;/p&gt;
&lt;p&gt;需要准备：&lt;/p&gt;
&lt;p&gt;• CloudFlare 账号 x1&lt;/p&gt;
&lt;p&gt;• Github 账号 x1&lt;/p&gt;
&lt;p&gt;• 能用的大脑🧠 x1&lt;/p&gt;
&lt;p&gt;• 良好的网络环境 x1&lt;/p&gt;
&lt;h3&gt;1. Fork 仓库&lt;/h3&gt;
&lt;p&gt;首先进入 HanAnalytics 的 GitHub 仓库&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;uxiaohan/HanAnalytics&quot;}&lt;/p&gt;
&lt;p&gt;然后点击 “Use this template”，在弹出的菜单中选择 “Create a new repository”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/e5bb5d834fa4ae78f30849151cd10bef.png&quot; alt=&quot;创建新仓库截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;之后根据自身需求选择是否公开仓库。&lt;/p&gt;
&lt;h3&gt;2. 登录 CloudFlare&lt;/h3&gt;
&lt;p&gt;进入 Cloudflare 主页后，按照提示点击左侧 “计算和 AI” 菜单，在二级菜单中点击 “Workers 和 Pages”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/693fc725bd4ee201e909e726858aef22.png&quot; alt=&quot;Workers和Pages截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入 Workers 和 Pages 页面后，点击右侧 Account ID 进行复制备用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/326c1d17e4ac72508154168205fbd34e.png&quot; alt=&quot;复制Account ID截图&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3. 创建 Cloudflare API token&lt;/h3&gt;
&lt;p&gt;访问&lt;a href=&quot;https://dash.cloudflare.com/profile/api-tokens&quot;&gt;Cloudflare API token&lt;/a&gt;页面，按照操作截图指引创建 API token 并保存备用。创建时需注意权限配置，确保能满足 HanAnalytics 的运行需求。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/8736d3b2c0af89f3498f9bd54f0469c3.png&quot; alt=&quot;API token创建截图1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/80cfcaa5f48e8ad80ab3eb089f605b0a.png&quot; alt=&quot;API token创建截图2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/fcee8f37-b259-436d-ad4e-6c9da2ab193e.png&quot; alt=&quot;API token创建截图3&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;4. 开启分析引擎&lt;/h3&gt;
&lt;p&gt;在 Cloudflare 中，点击 Analytics Engine，填写下面的信息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 变量名
AnalyticsBinding
# 数据集
AnalyticsDataset
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/images/Pasted%20image%2020251018202650.png&quot; alt=&quot;分析引擎设置截图1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/Pasted%20image%2020251018202904.png&quot; alt=&quot;分析引擎设置截图2&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;5. 创建 Pages 项目&lt;/h3&gt;
&lt;p&gt;登录 Cloudflare，创建 Pages 项目，链接之前 Fork 的 GitHub 仓库。架构选择 Vue，然后填入环境变量，环境变量含义如下,大部分人只需要按图片一样填写二个：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/Pasted%20image%2020251018203216.png&quot; alt=&quot;环境变量设置截图&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Cloudflare Workers ID
CLOUDFLARE_ACCOUNT_ID = 你的 Cloudflare Workers ID
# 你的 Cloudflare API token
CLOUDFLARE_API_TOKEN = 你的 Cloudflare API token
CLOUDFLARE_WEBSITE_PWD = # 网站访问密码 (不设置即无需密码访问)
CLOUDFLARE_WEBSITE_WHITELIST = # 可统计的白名单 
格式：  域名,WebSite|域名,WebSite，多个站点使用|分隔 例如：api.vvhan.com,Hello-Han-Api|www.vvhan.com,Hello-HanHexoBlog  (不设置即允许任何统计)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成后部署项目。&lt;/p&gt;
&lt;h3&gt;6. 配置绑定&lt;/h3&gt;
&lt;p&gt;Cloudflare Pages 部署完成后，在项目的 “设置” 中配置 “绑定”，添加 “Analytics Engine”，变量名称填写 “AnalyticsBinding”，数据集填写 “AnalyticsDataset” 并保存，然后重新部署。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/8ad2647d310002722106f5d5e27c48c6.png&quot; alt=&quot;绑定设置截图&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;7. 访问仪表板&lt;/h3&gt;
&lt;p&gt;重新部署完成后，访问 &lt;a href=&quot;https://xxxxxx.pages.dev&quot;&gt;https://xxxxxx.pages.dev&lt;/a&gt; 即可访问网站分析仪表板（注意：首次部署生成的域名可能需要几分钟时间生效，请耐心等待）。&lt;/p&gt;
&lt;p&gt;本站演示:&lt;a href=&quot;https://analytics.lenmei233.top/&quot;&gt;https://analytics.lenmei233.top/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;三、集成到网站&lt;/h2&gt;
&lt;p&gt;部署成功后，首次打开页面没有数据，需要集成到自己的网站。在网站底部插入以下代码即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 在网站底部插入以下代码即可集成网站分析仪表板
&amp;lt;script defer src=&quot;https://xxxxxx.pages.dev/tracker.min.js&quot; data-website-id=&quot;自定义网站唯一标识&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当出现有效访问后，再次打开仪表板页面即可看到数据。&lt;/p&gt;
&lt;h2&gt;四、功能补充&lt;/h2&gt;
&lt;p&gt;HanAnalytics 还新增了 “密码访问” 及 “网站白名单” 功能。开启密码后，输入密码才可访问（默认无需密码）；网站白名单功能开启后，只有加白的网站才可计入统计（默认任意网站都可统计）。&lt;/p&gt;
&lt;h2&gt;五、数据相关说明&lt;/h2&gt;
&lt;p&gt;数据问题一般是由于 Cloudflare Analytics Engine 无法访问网站导致的，请确保网站可以正常访问，并且 Cloudflare Analytics Engine 已经开启。&lt;/p&gt;
&lt;p&gt;HanAnalytics 使用 Cloudflare Analytics Engine 数据集，完全通过 HTTP 使用 Cloudflare 的 API 进行通信，数据来源于 Cloudflare Analytics Engine 数据集。Cloudflare Analytics Engine 使用抽样技术，以可承受的规模化方式实现大量数据提取 / 查询（这类似于大多数其他分析工具，如 Google Analytics 上的抽样）。&lt;/p&gt;
</content:encoded></item><item><title>Leapcell 免费云容器实测：能否替代 Cloud Run,Vercel？</title><link>https://blog.lenmei233.top/posts/leapcell/</link><guid isPermaLink="true">https://blog.lenmei233.top/posts/leapcell/</guid><description>Leapcell 免费云容器实测</description><pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;作为一名常年折腾各类云部署工具的开发者，我始终在寻找更高效、更经济的项目上线方案。今天在浏览技术社区时，一个号称 “&lt;strong&gt;Cloud Run/Vercel 完美替代品&lt;/strong&gt;” 的免费云容器平台 ——Leapcell，瞬间吸引了我的注意力。其官网明确标注 “永久免费”“GitHub 一键部署” 等核心卖点，这对于个人开发者和小型项目来说无疑是巨大诱惑。带着 “它是否真能替代主流平台” 的疑问，我展开了本次实测。&lt;/p&gt;
&lt;h2&gt;一、Leapcell 核心特点速览&lt;/h2&gt;
&lt;p&gt;在开始测试前，先梳理下 Leapcell 官方宣传的核心优势，也为后续实测提供对比依据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;永久免费无套路&lt;/strong&gt;：无需试用到期、无需升级付费，明确标注 “永久免费”，对预算有限的个人开发者和小型项目友好，能直接降低部署成本。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GitHub 一键部署&lt;/strong&gt;：深度集成 GitHub，支持直接关联仓库快速部署，省去手动配置服务器、上传代码的繁琐步骤，大幅缩短项目上线周期。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;轻量可移植&lt;/strong&gt;：基于容器技术，将应用及依赖完整打包，可在不同操作系统、云平台间无缝迁移，灵活性远超传统虚拟机部署。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;快速部署与弹性扩展&lt;/strong&gt;：容器启动速度快，部署流程自动化；支持通过编排工具实现弹性伸缩和负载均衡，能应对突发流量波动。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;高效资源利用&lt;/strong&gt;：容器共享宿主机操作系统内核，避免资源冗余，同时保持相互隔离，兼顾资源利用率与安全性。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;二、实测过程：从访问到部署的全记录&lt;/h2&gt;
&lt;h3&gt;1. 初始访问：先遇 “门槛”&lt;/h3&gt;
&lt;p&gt;首先打开 Leapcell 官网（&lt;a href=&quot;https://leapcell.io&quot;&gt;https://leapcell.io&lt;/a&gt;），但页面始终无法加载。通过 ping 测试发现，其服务器在中国区域&lt;strong&gt;全部无法访问&lt;/strong&gt;，必须借助 “魔法上网” 才能正常打开 —— 这一点从一开始就与 Vercel 形成差距，后者无需特殊工具即可在国内访问，显然 Leapcell 若想成为 “替代品”，在访问门槛上先失一分。&lt;/p&gt;
&lt;p&gt;成功打开官网后，首页醒目的 “免费部署你的项目” 标语极具吸引力，简洁的界面也让操作预期变得清晰，接下来便是注册账号进入实测环节。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/Screenshot%202025-10-03%20at%2019-01-53%20Leapcell%20Ship%20All%20Your%20Code%20Online%201.png&quot; alt=&quot;官网截图&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2. 项目部署：GitHub 关联 + 框架适配很贴心&lt;/h3&gt;
&lt;p&gt;注册并登录账号后，进入 “创建服务” 页面，我选择了自己博客的 GitHub 仓库（基于 Astro 框架）进行测试。令人惊喜的是，Leapcell&lt;strong&gt;原生支持 Astro 项目&lt;/strong&gt;，且自动识别并填写好了部署参数（如构建命令、输出目录等），无需手动配置 —— 对于不熟悉部署细节的开发者来说，这种 “无脑操作” 的体验非常友好。&lt;/p&gt;
&lt;p&gt;确认参数无误后，直接点击 “Deploy” 按钮，平台开始自动拉取代码、构建项目。从部署日志来看，整个过程流畅无报错，进度条实时更新，最终耗时约 2 分钟完成部署，速度处于同类平台的中上水平。
&lt;img src=&quot;/images/Screenshot%202025-10-03%20at%2019-06-11%20Create%20Service%20Leapcell.png&quot; alt=&quot;部署页面截图&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3. 部署完成：仪表盘与访问体验&lt;/h3&gt;
&lt;p&gt;部署成功后，自动跳转至服务仪表盘，界面清晰展示了服务状态、部署记录、访问统计等信息，便于后续管理。点击仪表盘提供的默认域名（格式为 xxx.leapcell.app），在 “魔法上网” 状态下，页面加载速度很快，博客的静态资源、动态交互均正常显示，无卡顿或样式错乱问题。
&lt;img src=&quot;/images/QQ20251003-190944.png&quot; alt=&quot;部署效果截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;为了进一步验证访问情况，我进行了国内多线路测速（结果如下图），发现未使用 “魔法” 时，国内地区无法访问，与 Vercel 的国内访问体验（延迟约 100-200ms）差距明显。
&lt;img src=&quot;/images/Screenshot%202025-10-03%20at%2019-29-16%20fuwari-1b8k8ui%20-%20Service%20Leapcell%201.png&quot; alt=&quot;仪表盘截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/Screenshot%202025-10-03%20at%2019-11-08%20apn.leapcell.app_%E5%9C%A8%E7%BA%BFping_%E5%A4%9A%E5%9C%B0ping_%E5%A4%9A%E7%BA%BF%E8%B7%AFping_%E6%8C%81%E7%BB%ADping_%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E6%B5%8B%E8%AF%95_%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BB%B6%E8%BF%9F%E6%B5%8B%E8%AF%95%201.png&quot; alt=&quot;测速截图&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;4. 自定义域名绑定：操作简单但效果有限&lt;/h3&gt;
&lt;p&gt;考虑到实际使用中通常会绑定自定义域名，我尝试将自己的域名（&lt;a href=&quot;https://lenmei.eu.org&quot;&gt;lenmei.eu.org&lt;/a&gt;）关联到 Leapcell 服务。在 “域名管理” 页面，按照提示添加 DNS 记录后，等待约 10 分钟完成解析。绑定后通过自定义域名访问，在 “魔法” 加持下速度依旧流畅，但国内无 “魔法” 访问时，仍面临无法打开的问题 —— 这说明域名绑定仅解决了 “域名个性化”，并未改善国内访问体验,对比Vercel只需要绑定域名即可正常访问,这一点决定无法替代Vercel。
&lt;img src=&quot;/images/Screenshot%202025-10-03%20at%2019-15-09%20lenmei.eu.org%20-%20Domain%20Leapcell%201.png&quot; alt=&quot;绑定域名截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;三、实测总结：优势明显但短板突出&lt;/h2&gt;
&lt;h3&gt;1. 值得肯定的亮点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;免费无门槛&lt;/strong&gt;：永久免费政策真实有效，无隐藏收费项，适合个人测试、小型静态项目（如博客、作品集）使用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;部署体验佳&lt;/strong&gt;：GitHub 一键关联、框架自动适配、部署流程自动化，对新手友好，能大幅提升部署效率。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;管理便捷&lt;/strong&gt;：仪表盘功能清晰，服务状态、访问数据一目了然，日常维护成本低。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 无法忽视的短板&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;国内访问受限&lt;/strong&gt;：必须使用 “魔法上网” 才能正常访问，且国内无加速节点，完全无法满足面向国内用户的项目需求 —— 这是其无法替代 Vercel 的核心瓶颈。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;功能丰富度不足&lt;/strong&gt;：对比 Vercel，Leapcell 缺少边缘缓存、国内 CDN、Serverless 函数等进阶功能，对于复杂项目的支持有限。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 适用场景与不适用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;推荐场景&lt;/strong&gt;：个人开发者的海外项目测试、面向海外用户的静态网站（如英文博客、外贸展示页）、无需国内访问的学习类项目。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不推荐场景&lt;/strong&gt;：面向国内用户的项目、需要高可用性的生产环境、依赖边缘计算或 Serverless 的复杂应用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;Leapcell 作为一款免费云容器平台，在部署便捷性、成本控制上表现亮眼，确实能满足部分海外导向的开发需求。但受限于国内访问门槛和功能丰富度，它目前&lt;strong&gt;无法真正替代 Vercel 或 Cloud Run&lt;/strong&gt;，尤其是对于需要服务国内用户的开发者来说，仍需选择更贴合国内网络环境的平台。&lt;/p&gt;
&lt;p&gt;若未来 Leapcell 能新增国内节点、优化访问体验，或许能成为更具竞争力的选择。但就目前而言，它更适合作为 “备用部署工具”，而非主力平台。&lt;/p&gt;
</content:encoded></item><item><title>Hello-Fuwari</title><link>https://blog.lenmei233.top/posts/hello-fuwari/</link><guid isPermaLink="true">https://blog.lenmei233.top/posts/hello-fuwari/</guid><description>记录小站搭建过程</description><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;最近国庆假期闲来无事，前段时间我的Typecho搭建的博客的服务商跑路了，导致我失去了我的博客。之前的博客也没什么内容，倒也不感觉可惜，但身为一个Coder，怎么能没有自己的博客呢？这相当于是你在互联网上的存在证明，是交友的渠道，也是精神的延续。&lt;/p&gt;
&lt;p&gt;所以其实在我的博客消失后，我就计划用一个更稳定的方案搭建新博客。因为本人经济实力不足，无力长期购买服务器，且本着“能不花钱就不花钱”的原则，果断抛弃了动态博客——像&lt;strong&gt;Wordpress&lt;/strong&gt;、&lt;strong&gt;Typecho&lt;/strong&gt;这类系统虽好，但依赖服务器（至少需要PHP环境），因此我选择了静态博客方案。&lt;/p&gt;
&lt;p&gt;于是我通过Google搜索了解到，目前主流的静态博客方案有&lt;strong&gt;Hexo&lt;/strong&gt;、&lt;strong&gt;Vitepress&lt;/strong&gt;、&lt;strong&gt;Vuepress&lt;/strong&gt;等。我简单折腾了一下发现，想要配置一个好看、易上手的博客其实很麻烦：不仅要安装各种环境，关键是配置周期长，无法及时看到效果，导致我在配置阶段就失去了耐心。&lt;/p&gt;
&lt;p&gt;直到一次偶然的机会，我发现了Fuwari这个静态博客框架，而且那篇介绍文章还提供了详细教程（&lt;a href=&quot;https://2x.nz/posts/fuwari/&quot;&gt;原文链接&lt;/a&gt;）。我跟着教程快速上手，很快就搭建出了一个“能让人看到无限可能”的博客雏形。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/Pasted%20image%2020251001201156.png&quot; alt=&quot;博客雏形截图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;让我们开始吧&lt;/h2&gt;
&lt;h6&gt;首先我们需要准备这些工具&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;能够独立思考的大脑 x 1：用于看懂本文，以及独立解决可能遇到的问题&lt;/li&gt;
&lt;li&gt;Github账号 x 1：用于Fork仓库和存储博客代码&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/downloads&quot;&gt;Git 版本控制工具&lt;/a&gt; x 1：用于将Github仓库克隆到本地，以及后续上传博客内容&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nodejs.org/en&quot;&gt;Node.js&lt;/a&gt; x 1：Fuwari基于Node.js开发，需安装此环境才能运行&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflare.com&quot;&gt;Cloudflare&lt;/a&gt;账号 x 1：用于将博客部署到Cloudflare Pages，同时获取免费SSL证书等服务&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://obsidian.md/&quot;&gt;Obsidian&lt;/a&gt; x 1：一款非常好用的Markdown编辑器，能实时预览文本效果，用来写博客刚刚好&lt;/li&gt;
&lt;/ul&gt;
&lt;h6&gt;第一步：Fork Fuwari仓库&lt;/h6&gt;
&lt;ol&gt;
&lt;li&gt;登录你的Github账号&lt;/li&gt;
&lt;li&gt;访问Fuwari的官方模板仓库：&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;https://github.com/saicaca/fuwari&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;点击仓库页面右上角的「Fork」按钮（如下图）
&lt;img src=&quot;/caac1edd66059c5431084ef9b6886510.png&quot; alt=&quot;点击Fork按钮截图&quot; /&gt;&lt;/li&gt;
&lt;li&gt;跳转后无需修改其他配置，直接点击绿色的「Create fork」按钮即可（注：若已Fork过，此按钮会显示为「Sync fork」）&lt;/li&gt;
&lt;li&gt;进入你Fork后的仓库页面，点击绿色的「Code」按钮，复制弹出窗口中最上方的Git地址（示例：&lt;code&gt;https://github.com/你的用户名/fuwari.git&lt;/code&gt;）
&lt;img src=&quot;/55c6638f552a22673b8cd78a58cd3dfe.png&quot; alt=&quot;复制Git地址截图&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h6&gt;第二步：本地部署环境&lt;/h6&gt;
&lt;ol&gt;
&lt;li&gt;在电脑上新建一个文件夹（如命名为「blog」），用于存放博客代码&lt;/li&gt;
&lt;li&gt;打开终端，通过&lt;code&gt;cd 文件夹路径&lt;/code&gt;命令导航到这个新建文件夹（例：&lt;code&gt;cd /Users/你的用户名/Documents/blog&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;在终端执行刚才复制的Git命令，克隆仓库：&lt;code&gt;git clone https://github.com/你的用户名/fuwari.git&lt;/code&gt;（网络稳定的情况下，等待克隆完成后，文件夹内会出现「fuwari」子文件夹）&lt;/li&gt;
&lt;li&gt;安装pnpm包管理工具：在终端执行&lt;code&gt;npm install -g pnpm&lt;/code&gt;（全局安装，后续可重复使用）&lt;/li&gt;
&lt;li&gt;进入Fuwari项目根目录：&lt;code&gt;cd fuwari&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;安装项目依赖：依次执行&lt;code&gt;pnpm install&lt;/code&gt;和&lt;code&gt;pnpm add sharp&lt;/code&gt;（sharp用于处理图片资源，是Fuwari的必要依赖）&lt;/li&gt;
&lt;li&gt;完成以上步骤后，本地环境就搭建好了，可通过后续命令预览博客效果&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最后，你可以参考Fuwari官方仓库的&lt;a href=&quot;https://github.com/saicaca/fuwari/blob/main/README.md&quot;&gt;Readme.md&lt;/a&gt;，进行博客的基础配置（如修改站点名称、作者信息等）。&lt;/p&gt;
&lt;h2&gt;配置后常用命令汇总&lt;/h2&gt;
&lt;h6&gt;1. 新建文章&lt;/h6&gt;
&lt;pre&gt;&lt;code&gt;pnpm new-post &amp;lt;你的文章标题&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行后会在项目根目录的 &lt;code&gt;src/content/posts&lt;/code&gt; 文件夹中，自动生成一个名为「你的文章标题.md」的文件。&lt;/p&gt;
&lt;h6&gt;2. 本地调试（预览效果）&lt;/h6&gt;
&lt;pre&gt;&lt;code&gt;pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行后终端会显示本地访问地址（通常是 &lt;code&gt;http://localhost:4321&lt;/code&gt;），打开浏览器访问即可实时预览博客效果，修改内容后页面会自动刷新。&lt;/p&gt;
&lt;h6&gt;3. 构建生产版本&lt;/h6&gt;
&lt;pre&gt;&lt;code&gt;pnpm build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将博客构建为可部署的静态文件，输出到项目根目录的 &lt;code&gt;./dist/&lt;/code&gt; 文件夹中（部署时需上传此文件夹内的内容）。&lt;/p&gt;
&lt;h6&gt;4. 配置Git全局账号（首次使用Git需执行）&lt;/h6&gt;
&lt;pre&gt;&lt;code&gt;git config --global user.name &quot;你的Github用户名&quot;
git config --global user.email &quot;你的Github注册邮箱&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;5. 上传代码到Github（更新博客后）&lt;/h6&gt;
&lt;ol&gt;
&lt;li&gt;提交所有修改的文件：&lt;code&gt;git add .&lt;/code&gt;（注意末尾的点，表示“所有文件”）&lt;/li&gt;
&lt;li&gt;添加提交说明：&lt;code&gt;git commit -m &quot;你的提交信息&quot;&lt;/code&gt;（示例：&lt;code&gt;git commit -m &quot;新增Hello-Fuwar文章&quot;&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;推送到远程仓库：&lt;code&gt;git push&lt;/code&gt;（首次推送可能需要输入Github账号密码或Token，按提示操作即可）&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item></channel></rss>