<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[EMLOG]]></title> 
<atom:link href="https://e.3zpp.cn/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[使用emlog搭建的站点]]></description>
<link>https://e.3zpp.cn/</link>
<language>zh-cn</language>
<generator>emlog</generator>

<item>
    <title>教你写出带“人味”的技术博客</title>
    <link>https://e.3zpp.cn/post/5</link>
    <description><![CDATA[<p>早上好！周二了，各位搬砖辛苦。<br />
不知道你有没有这种感觉：现在网上的技术文章越来越多了，但真正能让人耐着性子看完的却越来越少。满屏都是干巴巴的“首先、其次、最后”，或者干脆把官方文档复制粘贴一遍，配上几行没注释的代码，这就叫一篇博文了。这种文章，读起来就像嚼蜡，完全没有灵魂。<br />
其实，写技术博客绝不仅仅是知识搬运。通过教学分享来学习，本身就是一种高效进步的方式，它不仅能加深理解，还能弥补盲点。今天咱们就结合前人的经验，好好聊聊怎么写出既有干货、又有“人味”的优质技术博客。<br />
一、别贪大，聚焦具体的“小”痛点<br />
很多新手写博客最容易犯的错就是“大而全”。比如起个标题叫“Vue 3 完全指南”，结果写到一半发现自己兜不住，最后成了东拼西凑的大杂烩。<br />
优秀的博文往往从一个具体的痛点切入。与其写“PHP 性能优化大全”，不如写“如何解决 PHP 多条件筛选时的 SQL 注入与性能隐患”。越具体、越垂直，越能精准击中读者的需求。这就好比医生看病，你列出具体的症状（场景），说明你想解决什么问题（任务），采取了什么手段（行动），最后效果如何（结果），顺便提炼点经验（教训）。这种“小而精”的文章，远比泛泛而谈的理论更有生命力。<br />
二、结构是骨架，别让读者在文字里迷路<br />
一篇好的技术文章，骨架必须清晰。咱们写代码讲究高内聚低耦合，写文章也是一个道理——逻辑要循序渐进，从已知到未知，从问题到解决方案。<br />
最经典的结构莫过于“问题-解决方案-结论”：</p>
<p>引言：一两句话点明痛点，设定预期，告诉读者看完能获得什么。<br />
主体：使用小标题划分章节，按步骤或模块组织内容，避免长篇大论。<br />
代码与图示：这是技术博客的灵魂，后面细说。<br />
总结与延伸：回顾核心要点，提供进一步思考的方向或参考资料。</p>
<p>记住，段落千万别太长，控制在3-5行为宜，每300字左右最好插入图表或代码片段来调节阅读节奏。现在的读者耐心都有限，别用一整屏的纯文字挑战他们的视力。<br />
三、代码与图表：文章的硬核实力<br />
技术博客如果只有文字，就像做菜不放盐。代码示例和可视化表达，是体现专业竞争力的关键。<br />
代码怎么贴？<br />
千万别直接扔一段无说明的代码过去，那叫“纯文档”，网络上一抓一大把，毫无参考价值。精选最核心的片段，加上清晰的注释，解释每一步的逻辑和“为什么”。最好能提供完整的上下文，比如告诉读者这段代码该放在项目的哪个位置，或者附上 GitHub 仓库链接。<br />
图表怎么画？<br />
复杂的概念，用图表简化效果远胜文字。比如讲系统架构，画个流程图；讲性能优化，上张对比曲线图。工具也很多，Mermaid、Draw.io 甚至手绘草图都行。记住，图表是为了降低理解门槛，别搞得太花哨喧宾夺主。<br />
四、注入灵魂：经验、踩坑与真实的声音<br />
这是区分“机器文档”和“人气博客”最核心的一点。很多文章之所以让人觉得是 AI 生成的塑料渣子，就是因为缺少了作者独特的视角和情感色彩。</p>
<p>交代环境与陷阱：技术实施的环境很复杂，文章必须交代清楚软件版本、操作系统等背景信息，否则就是在挖坑。同时，一定要指出你踩过的坑和排错过程，这才是最宝贵的经验。<br />
展示真实的学习过程：你不必是世界级专家才能写作。把你解决一个棘手 Bug 的真实过程，哪怕是试错的过程记录下来，这种真实感比冰冷完美的说明书更能引起共鸣。<br />
说人话，加人情味：文字要简洁，避免拗口抽象的长难句。技术写作不必像学术论文，适度口语化，用生活中的类比来解释抽象概念，让读者感觉是在跟你喝茶聊天，而不是听机器念经。</p>
<p>五、别等完美了，先写起来！<br />
很多人迟迟不动笔，总觉得“等我研究透了再写”。但其实，完成比完美更重要。先从解决一个小问题的短文开始，把写作融入日常学习和工作中。发布后根据反馈修正，在回顾与反思中不断打磨。<br />
最后，在文末别忘了加个互动的引子，比如“你在实际项目中遇到过类似问题吗？欢迎分享你的解决方案”。写作不仅是思考的显性化，更是连接社区的桥梁。<br />
所以，别再犹豫了。打开你的编辑器，把你昨晚刚解决的那个小 Bug 写下来吧！</p>]]></description>
    <pubDate>Tue, 14 Apr 2026 18:01:24 +0800</pubDate>
    <dc:creator>夕梦</dc:creator>
    <guid>https://e.3zpp.cn/post/5</guid>
</item>
<item>
    <title>PHP 多条件筛选</title>
    <link>https://e.3zpp.cn/post/4</link>
    <description><![CDATA[<p>早上好！周二了，各位搬砖辛苦。<br />
不知道你有没有这种感觉：现在网上的技术文章越来越多了，但真正能让人耐着性子看完的却越来越少。满屏都是干巴巴的“首先、其次、最后”，或者干脆把官方文档复制粘贴一遍，配上几行没注释的代码，这就叫一篇博文了。这种文章，读起来就像嚼蜡，完全没有灵魂。<br />
其实，写技术博客绝不仅仅是知识搬运。通过教学分享来学习，本身就是一种高效进步的方式，它不仅能加深理解，还能弥补盲点。今天咱们就结合前人的经验，好好聊聊怎么写出既有干货、又有“人味”的优质技术博客。<br />
一、别贪大，聚焦具体的“小”痛点<br />
很多新手写博客最容易犯的错就是“大而全”。比如起个标题叫“Vue 3 完全指南”，结果写到一半发现自己兜不住，最后成了东拼西凑的大杂烩。<br />
优秀的博文往往从一个具体的痛点切入。与其写“PHP 性能优化大全”，不如写“如何解决 PHP 多条件筛选时的 SQL 注入与性能隐患”。越具体、越垂直，越能精准击中读者的需求。这就好比医生看病，你列出具体的症状（场景），说明你想解决什么问题（任务），采取了什么手段（行动），最后效果如何（结果），顺便提炼点经验（教训）。这种“小而精”的文章，远比泛泛而谈的理论更有生命力。<br />
二、结构是骨架，别让读者在文字里迷路<br />
一篇好的技术文章，骨架必须清晰。咱们写代码讲究高内聚低耦合，写文章也是一个道理——逻辑要循序渐进，从已知到未知，从问题到解决方案。<br />
最经典的结构莫过于“问题-解决方案-结论”：</p>
<p>引言：一两句话点明痛点，设定预期，告诉读者看完能获得什么。<br />
主体：使用小标题划分章节，按步骤或模块组织内容，避免长篇大论。<br />
代码与图示：这是技术博客的灵魂，后面细说。<br />
总结与延伸：回顾核心要点，提供进一步思考的方向或参考资料。</p>
<p>记住，段落千万别太长，控制在3-5行为宜，每300字左右最好插入图表或代码片段来调节阅读节奏。现在的读者耐心都有限，别用一整屏的纯文字挑战他们的视力。<br />
三、代码与图表：文章的硬核实力<br />
技术博客如果只有文字，就像做菜不放盐。代码示例和可视化表达，是体现专业竞争力的关键。<br />
代码怎么贴？<br />
千万别直接扔一段无说明的代码过去，那叫“纯文档”，网络上一抓一大把，毫无参考价值。精选最核心的片段，加上清晰的注释，解释每一步的逻辑和“为什么”。最好能提供完整的上下文，比如告诉读者这段代码该放在项目的哪个位置，或者附上 GitHub 仓库链接。<br />
图表怎么画？<br />
复杂的概念，用图表简化效果远胜文字。比如讲系统架构，画个流程图；讲性能优化，上张对比曲线图。工具也很多，Mermaid、Draw.io 甚至手绘草图都行。记住，图表是为了降低理解门槛，别搞得太花哨喧宾夺主。<br />
四、注入灵魂：经验、踩坑与真实的声音<br />
这是区分“机器文档”和“人气博客”最核心的一点。很多文章之所以让人觉得是 AI 生成的塑料渣子，就是因为缺少了作者独特的视角和情感色彩。</p>
<p>交代环境与陷阱：技术实施的环境很复杂，文章必须交代清楚软件版本、操作系统等背景信息，否则就是在挖坑。同时，一定要指出你踩过的坑和排错过程，这才是最宝贵的经验。<br />
展示真实的学习过程：你不必是世界级专家才能写作。把你解决一个棘手 Bug 的真实过程，哪怕是试错的过程记录下来，这种真实感比冰冷完美的说明书更能引起共鸣。<br />
说人话，加人情味：文字要简洁，避免拗口抽象的长难句。技术写作不必像学术论文，适度口语化，用生活中的类比来解释抽象概念，让读者感觉是在跟你喝茶聊天，而不是听机器念经。</p>
<p>五、别等完美了，先写起来！<br />
很多人迟迟不动笔，总觉得“等我研究透了再写”。但其实，完成比完美更重要。先从解决一个小问题的短文开始，把写作融入日常学习和工作中。发布后根据反馈修正，在回顾与反思中不断打磨。<br />
最后，在文末别忘了加个互动的引子，比如“你在实际项目中遇到过类似问题吗？欢迎分享你的解决方案”。写作不仅是思考的显性化，更是连接社区的桥梁。<br />
所以，别再犹豫了。打开你的编辑器，把你昨晚刚解决的那个小 Bug 写下来吧！</p>]]></description>
    <pubDate>Mon, 13 Apr 2026 11:29:51 +0800</pubDate>
    <dc:creator>夕梦</dc:creator>
    <guid>https://e.3zpp.cn/post/4</guid>
</item>
<item>
    <title>昨晚跟 Nuxt 4 和 PHP 死磕到凌晨：全栈开发避坑实录</title>
    <link>https://e.3zpp.cn/post/3</link>
    <description><![CDATA[<p>昨晚两点半，我死死盯着屏幕上 Nuxt 4 抛出的那个 Hydration Mismatch 报错，手里的冰美式差点直接浇在机械键盘上。<br />
事情的起因很简单：我想用 Nuxt 4 做个 SSR 前端，去拉取后端老项目 PHP 接口的数据。听起来多简单一事儿，结果硬是让我从晚上十点折腾到半夜。其实咱们写代码的都知道，很多时候业务逻辑没多复杂，反而是环境配置、前后端对接这些边角料的坑，能把人折磨疯。<br />
今天这篇不整那些虚头巴脑的理论，就把昨晚我踩过的三个大坑扒出来。算是个复盘，也希望能救各位全栈同仁一命。<br />
一、跨域这老生常谈的破事，咋又在 SSR 上发作了？<br />
本地刚起项目，用 fetch 去请求 PHP 接口，浏览器控制台立马给我甩脸：CORS 报错。<br />
这题我熟啊！马上跑去 PHP 接口文件顶部加上 header(&quot;Access-Control-Allow-Origin: <em>&quot;)。刷新，还是报错。当时我脑子里嗡的一声。<br />
后来查了半天才发现，Nuxt 4 在 SSR 模式下，服务端渲染时的请求根本不走浏览器，自然也不带那些跨域头。而且开发环境下，前端跑在 localhost:3000，PHP 跑在 localhost:80，端口不同就是跨域。<br />
怎么爬出来的：<br />
别在 PHP 代码里乱加 </em> 了，生产环境这不安全。在 nuxt.config.ts 里配个路由规则（Route Rules），让 Nuxt 自带的代理把 API 请求转发过去。</p>
<pre><code class="language-typescript">// nuxt.config.ts
export default defineNuxtConfig({
  routeRules: {
    // 把 /api 的请求都转发到你的 PHP 后端去
    '/api/**': { proxy: 'http://localhost:80' }
  }
})</code></pre>
<p>这样在代码里直接 fetch('/api/xxx')，不仅本地开发丝滑，部署到生产环境也能避免跨域和暴露后端真实地址的风险。<br />
二、服务端和客户端数据打架：Hydration Mismatch<br />
跨域搞定，数据也拿到了，结果页面一渲染，控制台飘红：Hydration Mismatch。<br />
这玩意的意思大概是：Nuxt 在服务端（Node.js 环境）先把你页面画出来，等到了浏览器，Vue 接手再画一遍，发现两边画出来的东西不一样！这在技术写作里属于必须要交代清楚的“环境背景”和“陷阱提示”。<br />
我排查了半天，发现问题出在 PHP 返回的时间戳上。我在模板里直接对时间戳调用了 new Date().toLocaleString()。要知道，服务端渲染时的时间，和客户端浏览器拿到数据渲染时的时间，哪怕只差几百毫秒，转换出来的字符串也不一样，这就导致两边比对不上。<br />
怎么爬出来的：<br />
把依赖客户端环境的逻辑，推迟到组件挂载后再执行。技术博客写作的核心要点之一就是“提供具体的示例”，来看代码：</p>
<pre><code class="language-html">l&lt;script setup&gt;
const article = ref({})
const formattedDate = ref('')

// 这里的请求在服务端和客户端都会跑，数据是一致的
const { data } = await useFetch('/api/article/1')
article.value = data.value

// 用 onMounted，这段逻辑只在浏览器端执行，完美避开水合报错
onMounted(() =&gt; {
  formattedDate.value = new Date(article.value.timestamp).toLocaleString()
})
&lt;/script&gt;</code></pre>
<p>三、写技术文章别当“复读机”<br />
折腾完这两个坑，天都快亮了。我一边吃早点一边想，为什么之前看官方文档和别人的教程，碰到这些坑还是得自己摸索？<br />
因为很多技术文章就像冷冰冰的“纯文档”，缺少博主真实的踩坑过程和经验总结。互联网上最不缺的就是文档翻译，如果只是把官方文档抄一遍，那这篇文章的价值就失去了。<br />
写博客也好，写软文也罢，一定要有“人情味”。用语直接一点，不要通篇都是“赋能”、“必要性”这种大词儿。比如我写跨域，我不写“配置代理以实现异构系统间的通信赋能”，我就写“别在 PHP 里加星号了，前端配个代理搞定”。这样读者看着才像是在跟人聊天，而不是对着四面白墙听机器念经。<br />
写文章结构要完整，要有“结果测试和排错过程”。我如果只贴一段代理的配置代码，不告诉你为什么这么配，不告诉你我昨晚踩了什么坑，那你遇到别的报错还是抓瞎。<br />
这就是写博客的初衷：巩固自己的学习，记录成长历程，同时用真实、接地气的经验帮别人少走弯路。添加个人的接触点和情感色彩，哪怕是昨晚差点泼键盘的吐槽，也能让枯燥的技术文章产生共鸣，这种真实性是赢得读者信任的最强指标。<br />
行了，今天的坑就先填到这。代码推上去了，我也得补个觉。如果你在搞 SSR 的时候也遇到什么鬼畜问题，评论区见。</p>]]></description>
    <pubDate>Fri, 10 Apr 2026 23:15:47 +0800</pubDate>
    <dc:creator>夕梦</dc:creator>
    <guid>https://e.3zpp.cn/post/3</guid>
</item>
<item>
    <title>PHP后端如何优雅地与Vue 3前端对话</title>
    <link>https://e.3zpp.cn/post/2</link>
    <description><![CDATA[<p>对于刚接触前后端分离的开发者来说，如何让 PHP 后端和 Vue 3 前端顺利交互，往往是第一只拦路虎。今天我们不搞深奥的架构探讨，只用最简单直白的方式，带你跑通一个“前端请求-后端响应”的完整闭环！<br />
一、后端：用 PHP 写个简单的 API 接口<br />
PHP 是一种广泛用于 Web 开发的服务器端脚本语言，它允许开发者创建动态网页 。在前后端分离的模式下，PHP 不再负责输出 HTML，而是纯粹地返回数据。<br />
我们可以通过 PHP 处理客户端提交的数据，并根据数据生成动态内容 。最简单的做法就是返回一段 JSON。创建一个 api.php 文件，写上以下代码：</p>
<pre><code class="language-php">&lt;?php
// 允许所有源跨域请求（开发阶段为了方便，生产环境请替换为具体域名）
header("Access-Control-Allow-Origin: *");
header('Content-Type: application/json');

// 模拟从数据库获取的数据
$data = [
    'status' =&gt; 'success',
    'message' =&gt; 'Hello from PHP!',
    'articles' =&gt; [
        ['id' =&gt; 1, 'title' =&gt; 'Vue3 极简入门'],
        ['id' =&gt; 2, 'title' =&gt; 'PHP API 实战']
    ]
];

// 将数组转换为 JSON 字符串输出
echo json_encode($data);
?&gt;</code></pre>
<p>这样，一个返回 JSON 数据的 RESTful API 接口就搞定了 ！<br />
二、前端：用 Vue 3 接收并展示数据<br />
Vue 3 引入了 Composition API，允许开发者更灵活地组织组件逻辑 。我们可以利用 ref 来定义响应式数据 ，并在组件挂载时请求 PHP 接口。<br />
在 Vue 3 的 <code>&lt;script setup&gt;</code> 语法中，代码更加简洁直观 ：</p>
<pre><code class="language-html">&lt;template&gt;
  &lt;div&gt;
    &lt;h2&gt;{{ message }}&lt;/h2&gt;
    &lt;ul&gt;
      &lt;li v-for="article in articles" :key="article.id"&gt;
        {{ article.title }}
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
&lt;/template&gt;

&lt;script setup&gt;
import { ref, onMounted } from 'vue'

// 使用 ref 创建响应式引用 [10](@ref)[11](@ref)
const message = ref('')
const articles = ref([])

// 组件挂载时执行请求 [9](@ref)
onMounted(async () =&gt; {
  try {
    // 请求 PHP 后端接口
    const response = await fetch('http://localhost/your-path/api.php')
    const data = await response.json()
    // 更新响应式数据，视图会自动更新 [11](@ref)
    message.value = data.message
    articles.value = data.articles
  } catch (error) {
    console.error('请求失败:', error)
  }
})
&lt;/script&gt;</code></pre>
<p>三、核心概念小结<br />
<img src="https://e.3zpp.cn/content/uploadfile/202604/ae731775833423.png" alt="" /><br />
JSON 是沟通的桥梁：前端 JavaScript 和后端 PHP 之间，通过 JSON 格式传递数据是最通用的做法 。PHP 用 json_encode() 打包，JS 用 response.json() 解包。<br />
跨域（CORS）不可忽视：本地开发时，Vue 跑在 <code>localhost:5173</code>，PHP 跑在<code>localhost:80</code>，端口不同即为跨域。务必在 PHP 脚本开头设置 <code>header("Access-Control-Allow-Origin: *")</code>，否则前端会报错。</p>
<pre><code class="language-css">css代码块</code></pre>
<p>响应式驱动视图：在 Vue 3 中，我们只需关注数据的修改（如 message.value = ...），DOM 的更新框架会自动帮你完成 。</p>]]></description>
    <pubDate>Fri, 10 Apr 2026 22:57:01 +0800</pubDate>
    <dc:creator>夕梦</dc:creator>
    <guid>https://e.3zpp.cn/post/2</guid>
</item>
<item>
    <title>欢迎使用emlog</title>
    <link>https://e.3zpp.cn/post/1</link>
    <description><![CDATA[<p>这是系统生成的演示文章。编辑或者删除它，然后开始您的创作吧！</p>]]></description>
    <pubDate>Fri, 10 Apr 2026 18:38:57 +0800</pubDate>
    <dc:creator>夕梦</dc:creator>
    <guid>https://e.3zpp.cn/post/1</guid>
</item>
</channel>
</rss>