<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[葉は静かに落ちる]]></title><description><![CDATA[有朋自远方来, 不亦说乎]]></description><link>https://sin6626.me</link><image><url>https://sin6626.mehttps://sin6626.me/Devil.ico</url><title>葉は静かに落ちる</title><link>https://sin6626.me</link></image><generator>Shiro (https://github.com/Innei/Shiro)</generator><lastBuildDate>Tue, 28 Jul 2026 18:37:07 GMT</lastBuildDate><atom:link href="https://sin6626.me/feed" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Jul 2026 18:37:07 GMT</pubDate><language><![CDATA[zh-CN]]></language><item><title><![CDATA[gsap官方文档的更新和Svg线条动画的探索]]></title><description><![CDATA[<link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/7gweo0be99fwashiid.png"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/qczwmkuxyisv4ct0gd.png"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/kookx4atq5600mm5u5.png"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/46olpsd7t2vrg09ff2.png"/><div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://sin6626.me/notes/7">https://sin6626.me/notes/7</a></blockquote><div><p>想想这篇文章应该是要发到博文才对的，但是感觉应该更多的去诉说出我的心情与感受，所以还是放在手记里吧</p><h2 id="">两件事</h2><p>主要想要记录两件事情, 第一件事情让我很激动, 从早上激动到下午, 因为我上周提出的有关gsap官方文档的issue建议被官方采纳了! 今天一早上起来就看见gsap官方给我发的邮件了. 第二件事情让我感觉很有意义, 因为我发现了我平时所研究的东西在3年前也有前辈跟我研究一样的东西.</p><h2 id="issue">第一次提出issue建议被采纳</h2><p>睡醒查看手机信息的时候, 我惊喜的发现有两封邮箱, 标题赫然写着&quot;<ins><em>Re: [greensock/GSAP] Docs: clarify Vue refs in gsap.context() scope examples (Issue #652</em></ins>)&quot;. 内容是:</p><p><img src="https://s3.sin6626.me/mx-images/7gweo0be99fwashiid.png" alt="image.png"/></p><p>我迫不及待的就把信息发给我了我的同事和技术群的兄弟们, 因为太激动了啊, 第一次提出issue, 第一次被官方回应.虽然不是PR被合并, 但是也很高兴了.</p><p>回顾下上周五:</p><p>昨天项目的UI还没设计出来, 所以依旧是带薪学习的一天, 我把我的UI&amp;Animation项目(还在开发中)的动画重构加收藏之后, 就继续开始了gsap文档的阅读, 主要是看入门gsap方面的文档, 看完后, 去找了一个使用了Nuxt4 + gsap的<a href="https://github.com/BenjaminOddou/portfolio">开源项目</a>,  想去看看别人是如何在Vue使用gsap的. 我在项目中看见gsap.content() 的时候的时候就很疑惑, 因为gsap官网文档哪里, 总是说什么ref, 但是都是对于React和Angular的ref, 没有对于Vue的ref的说明. 但是我看项目使用的时候明明不是用的ref对象, 是把ref对象给.value取出了真正的dom元素的.</p><p>于是就跟技术群里的兄弟们说gsap官方偏心, 只给React和Angular说明, 没有给Vue一点情报, 文档太容易误解了. 没想到群内的Guoxk大捞直接让我提一个PR去, 这可给我吓到了, 我压根都想过这种事情.</p><p><img src="https://s3.sin6626.me/mx-images/qczwmkuxyisv4ct0gd.png" alt="image.png"/></p><p>当然还有群内的糖糖</p><p><img src="https://s3.sin6626.me/mx-images/kookx4atq5600mm5u5.png" alt="image.png"/></p><p>因为github上gsap官方仓库上没有记录文档的内容, 所以提PR也不会被合并, 于是我就提了一个issue</p><p><img src="https://s3.sin6626.me/mx-images/46olpsd7t2vrg09ff2.png" alt="image.png"/></p><p>然后就是到今天的回复了.</p><h2 id="svg">今天下午有关Svg的研究</h2><p>今天下午继续研究BenjaminOddou的portfolio项目, 也是收集到了很多很有用的动画, 就有Svg线条动画.</p><p>这个动画让我感觉很有意义, 不是说这个动画有多么的实用(虽然可能真的很实用), 有多么的高深, 只是因为在3年前, Nuxt核心团队成员, unocss的创始人 ---- <a href="https://antfu.me/"><em>Anthony Fu</em></a>(一个托尼) 大佬也曾研究过这个动画, 我喜欢的大佬曾经也研究过的动画.这个消息还是我今天下午问了群内的Guoxk大捞有关Svg图片制作才知道的. 托尼老师发的博客 -&gt; <a href="https://antfu.me/posts/animated-svg-logo">To Blog</a> (动画详细博客中有, 就不解释了)</p><p>这件事情为什么也想记录下呢, 感觉很单纯, 单纯因为前端的前辈大佬们曾经也经历这段学习, 就让人感觉自己的研究是有价值的. 平时有关内容驱动式网站, 组件, 动画等等的学习, 我觉得真的很有意义, 现在可能没有使用上很多次, 也用的很不熟练, 没有那种实用性上的意义, 但是这份技术的宝藏会一直在这里, 待人来发掘.</p><blockquote><p><ins><em>三年前的月，也曾照过那些探索 SVG 动画的人；今日我所见之光，亦是他们曾追寻过的光。</em></ins></p></blockquote></div><p style="text-align:right"><a href="https://sin6626.me/notes/7#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://sin6626.me/notes/7</link><guid isPermaLink="true">https://sin6626.me/notes/7</guid><dc:creator><![CDATA[Sin]]></dc:creator><pubDate>Tue, 28 Jul 2026 14:59:32 GMT</pubDate></item><item><title><![CDATA[NestJS学习]]></title><description><![CDATA[<div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://sin6626.me/posts/study&amp;think/nestjs-learning">https://sin6626.me/posts/study&amp;think/nestjs-learning</a></blockquote><div><h2 id="">前言</h2><p>最近花时间学了 NestJS，从一个「听说过但没碰过」的状态，到能搭出一个完整的后端项目。这篇东西算是一个学习记录，把过程中的理解、踩过的坑、对框架的感悟写下来，也算是对自己这段时间的一个交代。</p><hr/><h2 id="-nestjs-">我对 NestJS 的理解</h2><p>刚接触的时候，最直观的感受是：<strong>它和传统的 Node.js 框架不太一样</strong>。</p><p>以前写 Express ，都是&quot;需要什么自己加&quot;，很灵活，但也容易写散。NestJS 给我的感觉是 —— 它把规矩定好了。模块怎么拆、代码放哪里、请求怎么流转，都有一套明确的规范。</p><p>刚开始觉得有点束缚，但写多了发现，<strong>这种约束其实是一种解放</strong>。项目结构不会随着代码量增加而腐烂，回头看自己写的代码，思路是清晰的。</p><hr/><h2 id="">项目结构：模块化是核心</h2><p>学 NestJS 最先要理解的就是模块化。每个功能都是一个模块，模块里放控制器、服务、数据实体，各司其职：</p><pre class=""><code class="">src/
├── main.ts             # 应用入口
├── app.module.ts       # 根模块，组装所有子模块
├── user/               # 用户模块
├── auth/               # 认证模块
├── roles/              # 角色模块
├── logs/               # 日志模块
├── guards/             # 自定义守卫
├── filters/            # 异常过滤器
├── interceptors/       # 拦截器
├── decorators/         # 自定义装饰器
├── enum/               # 常量枚举
└── utils/              # 工具函数</code></pre><p>每个模块就像一个小盒子，有自己的职责，也能和其他模块通信。这种组织方式让项目不管多大，结构都是可预期的。</p><p>如果一个模块需要被其他多个模块复用，可以把它设为全局模块（<code>@Global()</code>），或者通过 <code>exports</code> 显式暴露出去。这种显式的依赖声明，比隐式的全局变量要健康得多。</p><hr/><h2 id="">学到最多的几个点</h2><h3 id="1-di">1. 依赖注入（DI）</h3><p>NestJS 的依赖注入是我觉得最优雅的设计之一。不需要自己 new 对象，只需要在构造函数里声明需要什么，框架会自动给你注入：</p><pre class="language-typescript lang-typescript"><code class="language-typescript lang-typescript">constructor(private userService: UserService) {}</code></pre><p>就一行，<code>UserService</code> 的实例就进来了。如果 <code>UserService</code> 又依赖了其他东西，框架会递归地帮你全部解析好。</p><p>这种机制带来的好处是：<strong>模块之间的耦合度低，测试也方便</strong> —— 测试的时候可以轻松替换成 mock 对象。</p><h3 id="2-">2. 装饰器驱动的编程方式</h3><p>NestJS 大量使用装饰器，开始的时候会觉得&quot;到处都是 @ 符号&quot;，看习惯了会发现这是它最方便的地方。</p><p>路由、参数提取、验证、权限控制……全都是装饰器。一个路由的处理函数，从上到下的装饰器就是它的完整&quot;说明书&quot;：</p><pre class="language-typescript lang-typescript"><code class="language-typescript lang-typescript">@Get(&#x27;:id&#x27;)
@UseGuards(AuthGuard)
@UsePipes(ValidationPipe)
getUser(@Param(&#x27;id&#x27;) id: string) { ... }</code></pre><p>一眼就能看出来：这是个 GET 请求、需要登录、参数验证、从路径拿 id。</p><p>除了用内置装饰器，还可以<strong>自定义装饰器</strong>，把重复的逻辑封装起来。比如我写了一个 <code>@Serialize(Dto)</code> 装饰器，用来控制接口返回哪些字段，敏感字段不想暴露给前端，通过这个装饰器一键搞定。</p><h3 id="3-">3. 请求生命周期（完整流水线）</h3><p>NestJS 的请求处理是一条完整的流水线，按顺序经过各个环节：</p><p><strong>Middleware → Guard → Interceptor → Pipe → Controller → Service → Interceptor → Filter（出异常时）</strong></p><p>每个环节各司其职：</p><ul><li><strong>Middleware</strong>：最前置的处理，可以做一些通用逻辑，比如请求日志、耗时统计</li><li><strong>Guard</strong>：能不能进来？做权限校验，比如检查是否登录、是否有操作权限</li><li><strong>Interceptor</strong>：进来前/出去后做点什么，比如打日志、加缓存、序列化响应数据</li><li><strong>Pipe</strong>：进来的数据对不对？做参数验证和类型转换</li><li><strong>Filter</strong>：出错了怎么返回？统一异常响应格式</li></ul><p>理解了这条流水线，写代码的时候就能清楚当前逻辑该放在哪个环节，出 bug 也能快速定位。</p><h3 id="4-typeorm-">4. TypeORM 的数据库操作</h3><p>数据库用了 TypeORM，最大的感受是：<strong>操作数据库像操作对象一样自然</strong>。</p><p>最常用的几种关系：</p><ul><li><strong>一对一</strong>：用户 ↔ 资料（一个用户只有一个资料页）</li><li><strong>一对多</strong>：用户 ↔ 日志（一个用户有多条操作记录）</li><li><strong>多对多</strong>：用户 ↔ 角色（一个用户可以有多个角色，一个角色也可以有多个用户，通过中间表关联）</li></ul><p>常规的增删改查直接用 Repository 的方法就行。复杂查询用 QueryBuilder，写起来和写 SQL 差不多但更安全（参数化查询），支持分组、排序、分页等高级操作。</p><h3 id="5-">5. 数据验证与转换</h3><p><strong>验证</strong>：以前写接口的时候，参数校验经常是手写 if-else，又臭又长。NestJS 搭配 <code>class-validator</code>，用装饰器声明规则，简洁很多：</p><pre class="language-typescript lang-typescript"><code class="language-typescript lang-typescript">@IsString()
@IsNotEmpty()
@Length(2, 20)
username: string;</code></pre><p>配合全局注册的 ValidationPipe，请求进来的时候自动校验，不合法直接返回 400，Controller 里拿到的数据一定是合法的。</p><p><strong>转换</strong>：用 <code>class-transformer</code> 配合拦截器，可以控制接口返回的数据结构。比如把 User 实体转成 UserDto，只暴露前端需要的字段，密码、加密盐这些敏感字段自动过滤掉。这在写 API 的时候非常实用。</p><h3 id="6--jwt">6. 认证与授权 (JWT)</h3><p>用户认证用的是 JWT（JSON Web Token）方案。流程大概是：</p><ol start="1"><li>用户登录，服务端验证用户名密码</li><li>验证通过，生成一个加密的 token 返回给前端</li><li>前端后续请求带上这个 token</li><li>服务端通过 Guards 校验 token，确定用户身份</li></ol><p>密码不能明文存数据库，我用了第三方的包做加盐哈希处理（bcrypt），就算数据库泄露了，密码也是安全的。</p><p>权限控制方面还学了 CASL 这个库，可以定义细粒度的权限规则，比如&quot;普通用户只能看自己的文章，管理员可以删任何文章&quot;，配合自定义守卫来实现。</p><h3 id="7-">7. 环境配置管理</h3><p>用 <code>@nestjs/config</code> 配合 <code>.env</code> 文件做环境配置。不同环境用不同的文件：</p><pre class=""><code class="">.env.development    # 开发环境
.env.production     # 生产环境
.env.test           # 测试环境
.env                # 公共默认配置</code></pre><p>数据库连接信息、JWT 密钥、端口号这些都放在环境变量里，不写死在代码中。还用了 Joi 做配置验证，启动时如果缺少必要的配置项，程序会直接报错，避免带着错误配置上线。</p><h3 id="8-">8. 日志系统</h3><p>用 <code>nestjs-pino</code> 做日志记录，配置了双输出：</p><ul><li><strong>控制台</strong>：彩色格式化输出，开发时看着清晰</li><li><strong>文件</strong>：按天轮转，每个文件有大小限制，自动归档</li></ul><p>日志记录了每次请求的路径、方法、参数、耗时等信息，线上排查问题的时候很有帮助。</p><h3 id="9-jest">9. 测试（Jest）</h3><p>写了单元测试和端到端（e2e）测试。</p><p><strong>单元测试</strong>：针对 Service 和 Controller 单独测试，用 mock 替换数据库操作，跑得很快。主要测业务逻辑是否正确。</p><p><strong>端到端测试</strong>：模拟真实的 HTTP 请求，从路由到数据库全链路验证，确保接口整体功能正常。</p><p>用 Jest + Supertest 来写，虽然写测试确实多花一些时间，但改代码的时候有测试兜底，心里会踏实很多。</p><h3 id="10-">10. 异常过滤器</h3><p>没有异常过滤器的时候，每个接口出错返回的格式可能都不一样。前端对接起来很痛苦。</p><p>NestJS 的异常过滤器可以把异常处理收拢到一处，统一返回格式：</p><pre class="language-json lang-json"><code class="language-json lang-json">{
  &quot;code&quot;: 400,
  &quot;message&quot;: &quot;参数错误&quot;,
  &quot;timestamp&quot;: &quot;2026-07-26T00:00:00.000Z&quot;,
  &quot;path&quot;: &quot;/api/v1/user&quot;,
  &quot;method&quot;: &quot;POST&quot;
}</code></pre><p>不管是参数校验失败、数据库报错、还是业务逻辑异常，返回格式都是统一的。前端直接按统一格式处理就行。</p><hr/><h2 id="">写在最后</h2><p>NestJS 不是那种&quot;学完就能炫技&quot;的框架，它更像一个规规矩矩的框架，提供了写后端应用的一整套方法论。回头看我以前用 Express 写的项目，如果当初用 NestJS，结构应该会清晰很多。</p><p>这次学的东西挺多的：模块化架构、依赖注入、TypeORM 数据操作、JWT 认证、数据验证与转换、日志系统、单元测试和 e2e 测试、自定义装饰器和守卫、异常过滤、环境配置管理……每一样在生产中都是很实用的。</p><p>框架只是一个工具，但好的工具确实能帮人写出更干净的代码。但这次学习让我最大的收获不是记住了多少 API，而是理解了这套架构思维。未来写任何后端项目，这套思维方式都是通用的。</p><p>（其实在学的过程很难受，网上没有很好入门的NestJS课程，我看的这套很不适合小白入门，里面很绕，而且课程很老，不过老师水平确实高，好在硬着头皮学完了，但是说实话不一定记住了常见的API，因为自己代码量不够多。不过，后面肯定有要用到NestJS的时候，到那时候再提高吧）</p><hr/><blockquote><p>一步一个脚印，比什么都重要。</p></blockquote></div><p style="text-align:right"><a href="https://sin6626.me/posts/study&amp;think/nestjs-learning#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://sin6626.me/posts/study&amp;think/nestjs-learning</link><guid isPermaLink="true">https://sin6626.me/posts/study&amp;think/nestjs-learning</guid><dc:creator><![CDATA[Sin]]></dc:creator><pubDate>Sun, 26 Jul 2026 15:59:16 GMT</pubDate></item><item><title><![CDATA[Protfolio Template - Home Page - GLM的总结]]></title><description><![CDATA[<div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://sin6626.me/posts/source-code-study/portfolio-template-ai">https://sin6626.me/posts/source-code-study/portfolio-template-ai</a></blockquote><div><h1 id="tailwind--nuxt-ui-">Tailwind / Nuxt UI 经典套路速查</h1><blockquote><p>本项目开发过程中累积的高频、可直接复用的样式搭配速查表。
涵盖定位、毛玻璃浮岛、Tailwind 4 新语法、Nuxt UI 主题色别名、动效联动等。</p></blockquote>
<hr/><h2 id="--">一、定位 / 居中三件套</h2><h3 id="">任意宽度元素的绝对居中(最经典)</h3><pre class="language-html lang-html"><code class="language-html lang-html">&lt;div class=&quot;fixed left-1/2 -translate-x-1/2&quot;&gt;
  ...
&lt;/div&gt;</code></pre><ul><li><code>left-1/2</code>:把元素<strong>左上角点</strong>放到屏幕水平中线</li><li><code>-translate-x-1/2</code>:再回拉<strong>自身宽度的一半</strong>,实现真正的几何居中</li><li>不依赖具体 px,任意宽度都居中,比 <code>margin-left: -w/2</code> 优雅</li></ul><h3 id="--fab">顶部悬浮岛(常用于导航 / FAB)</h3><pre class="language-html lang-html"><code class="language-html lang-html">&lt;div class=&quot;fixed top-2 sm:top-4 left-1/2 -translate-x-1/2 z-10&quot;&gt;
  ...
&lt;/div&gt;</code></pre><p>参考本项目的 <code>app/components/AppHeader.vue</code>。</p><hr/><h2 id="macos-">二、毛玻璃浮岛(macOS 风)</h2><pre class="language-html lang-html"><code class="language-html lang-html">&lt;div class=&quot;
  bg-muted/80
  backdrop-blur-sm
  rounded-full
  border border-muted/50
  shadow-lg shadow-neutral-950/5
&quot;&gt;
  ...
&lt;/div&gt;</code></pre><p>拆解:</p><table><thead><tr><th>Class</th><th>含义</th></tr></thead><tbody><tr><td><code>bg-muted/80</code></td><td>Nuxt UI 主题色 <code>muted</code> 80% 透明,做模糊基底</td></tr><tr><td><code>backdrop-blur-sm</code></td><td>模糊背后内容,核心的「毛玻璃」质感</td></tr><tr><td><code>rounded-full</code></td><td>胶囊化(两端半圆)</td></tr><tr><td><code>border border-muted/50</code></td><td>同色更淡的描边,做精细分层</td></tr><tr><td><code>shadow-lg shadow-neutral-950/5</code></td><td>Tailwind 4 拆分写法,大小 + 颜色独立,亮色场景的<strong>淡阴影</strong>(5%的透明度)不突兀</td></tr></tbody></table><blockquote><p>适用:任何浮层、popover、浮动按钮、顶部导航胶囊。</p></blockquote>
<hr/><h2 id="tailwind-4-">三、Tailwind 4 新语法(高频三招)</h2><h3 id="1--css-">1️⃣ 任意 CSS 变量值</h3><pre class="language-html lang-html"><code class="language-html lang-html">&lt;div class=&quot;max-w-(--ui-container)&quot;&gt;</code></pre><p>等价于 <code>max-width: var(--ui-container)</code>,括号内可放任意 CSS variable,替代旧版 <code>max-w-[1400px]</code> 死值。</p><h3 id="2-data-attr-">2️⃣ data-attr 状态选择器</h3><pre class="language-html lang-html"><code class="language-html lang-html">&lt;!-- 本元素状态 --&gt;
&lt;button class=&quot;data-[state=active]:text-highlighted data-[state=inactive]:text-muted&quot;&gt;

&lt;!-- 父级挂 group 时,子元素响应父级 data-state --&gt;
&lt;div class=&quot;group&quot;&gt;
  &lt;Icon class=&quot;group-data-[state=open]:rotate-135&quot; /&gt;
&lt;/div&gt;</code></pre><p>配合 Reka UI / Nuxt UI 的 <code>data-state</code> 自动 toggle,<strong>纯 CSS 响应组件状态</strong>,不写 JS 切 class。</p><h3 id="3-important-">3️⃣ important 后缀</h3><pre class="language-html lang-html"><code class="language-html lang-html">&lt;div class=&quot;pt-0! px-0!&quot;&gt;</code></pre><p>Tailwind 4 把 <code>!</code> 移到末尾(旧版是 <code>!pt-0</code>)。<strong>压第三方库默认样式必备</strong>——比如压过 Nuxt UI 组件自带的 padding/ring。</p><hr/><h2 id="--">四、响应式出血 + 兼容器锁宽</h2><p>「让某区块出血到全宽,但又被 UI 容器限宽」的经典组合:</p><pre class="language-html lang-html"><code class="language-html lang-html">&lt;div class=&quot;-mx-4 sm:-mx-12 lg:-mx-16 max-w-(--ui-container)&quot;&gt;</code></pre><table><thead><tr><th>Class</th><th>含义</th></tr></thead><tbody><tr><td><code>-mx-4 sm:-mx-12 lg:-mx-16</code></td><td>负边距让区块<strong>反向吃掉父级 padding</strong>,出血到内容边</td></tr><tr><td><code>max-w-(--ui-container)</code></td><td>但又被 Nuxt UI 容器宽度锁住,不会越界</td></tr></tbody></table><p>参考本项目 <code>app/components/landing/Testimonials.vue</code> 的 <code>UCarousel</code> viewport 配置。</p><hr/><h2 id="before--after-">五、<code>before:</code> / <code>after:</code> 伪元素装饰</h2><h3 id="-hover---">父 hover 子才显 + 滑一下(三件套)</h3><pre class="language-html lang-html"><code class="language-html lang-html">&lt;div class=&quot;group&quot;&gt;
  &lt;UIcon class=&quot;
    opacity-0
    group-hover:opacity-100
    group-hover:translate-x-1
    transition-all
  &quot; /&gt;
&lt;/div&gt;</code></pre><ul><li>父级挂 <code>group</code></li><li>子元素常驻隐藏(<code>opacity-0</code>)</li><li><code>group-hover:*</code>:父级 hover 时子才响应</li><li>配 <code>transition-all</code> 做丝滑过渡</li></ul><p>参考本项目 <code>app/components/landing/Blog.vue</code> 的 &quot;Read Article&quot; 箭头按钮。</p><blockquote><p>适用:hover 时才渐显的图标、徽章、箭头、装饰元素。</p></blockquote>
<h3 id="">大引号装饰</h3><pre class="language-html lang-html"><code class="language-html lang-html">&lt;p class=&quot;
  before:content-[open-quote]
  before:text-7xl
  before:text-dimmed
  before:absolute
  before:-ml-10
  before:-mt-4
  after:content-[close-quote]
  after:...对称
&quot;&gt;
  推荐语正文...
&lt;/p&gt;</code></pre><p>关键点:<code>content-[open-quote]</code> 是 Tailwind 4 任意值语法,编译成 <code>content: open-quote</code>,引号自动按文档 <code>lang</code> 渲染(英文 <code>&quot;</code> / 中文 <code>「」</code>)。</p><p>参考本项目 <code>app/components/landing/Testimonials.vue</code> 的 <code>UPageCTA</code>。</p><hr/><h2 id="nuxt-ui-semantic-colors">六、Nuxt UI 主题色别名(Semantic Colors)</h2><p>这些 class 在 Tailwind 官网搜不到,但<strong>项目里到处都是</strong>。<a href="https://ui.nuxt.com/docs/theme">查看 Nuxt UI 主题文档</a>。</p><h3 id="">颜色别名</h3><table><thead><tr><th>别名</th><th>含义</th></tr></thead><tbody><tr><td><code>bg-default</code></td><td>默认页面背景</td></tr><tr><td><code>bg-muted</code></td><td>次要表面色(卡片淡底)</td></tr><tr><td><strong><code>bg-elevated</code></strong></td><td>凸起表面(卡片 / 浮层 / 选中态),比 <code>muted</code> 稍亮</td></tr><tr><td><code>bg-accented</code></td><td>进一步加 accent</td></tr><tr><td><code>bg-highlighted</code></td><td>高亮选中</td></tr><tr><td><code>bg-inverted</code></td><td>反色背景</td></tr><tr><td><code>text-default</code></td><td>主文本色</td></tr><tr><td><strong><code>text-muted</code></strong></td><td>次要文字</td></tr><tr><td><strong><code>text-dimmed</code></strong></td><td>极次文字(装饰元素、图标描边常驻)</td></tr><tr><td><code>text-hi</code></td><td>强调文字</td></tr><tr><td><code>text-inverted</code></td><td>反色文字</td></tr></tbody></table><h3 id="">高频组合</h3><h4 id="">半透卡片底</h4><pre class="language-html lang-html"><code class="language-html lang-html">&lt;div class=&quot;bg-elevated/60&quot;&gt;...&lt;/div&gt;</code></pre><p>60% 透明的凸起色,做卡片「轻微浮起」感。</p><h4 id="hover-">hover 轻微反馈</h4><pre class="language-html lang-html"><code class="language-html lang-html">&lt;div class=&quot;hover:bg-muted/50&quot;&gt;...&lt;/div&gt;</code></pre><p>鼠标进入变次要色 50% 透明,轻微 hover 反馈,不抢眼。</p><h4 id="nuxt-ui-">激活态文字色切换(Nuxt UI 标配!)</h4><pre class="language-html lang-html"><code class="language-html lang-html">&lt;button class=&quot;
  data-[state=active]:text-highlighted
  data-[state=inactive]:text-muted
&quot;&gt;
  ...
&lt;/button&gt;</code></pre><p>Reka UI 状态切换时自动 toggle <code>data-state</code>,纯 CSS 被动响应。</p><p>参考本项目 <code>app/components/landing/FAQ.vue</code> 的 <code>UTabs</code> 样式覆盖。</p><hr/><h2 id="group--group-hover-">七、<code>group</code> + <code>group-hover:</code> 联动机制</h2><p><strong>父级挂 <code>group</code>,子用 <code>group-hover:*</code> 响应父级 hover</strong>——Tailwind 不写 JS 切 class 的核心模式。</p><pre class="language-html lang-html"><code class="language-html lang-html">&lt;div class=&quot;group&quot;&gt;
  &lt;!-- 子元素常驻不可见,鼠标 hover 到父级任意位置时才显 --&gt;
  &lt;Icon class=&quot;opacity-0 group-hover:opacity-100 group-hover:translate-x-1 transition-all&quot; /&gt;
&lt;/div&gt;</code></pre><p>要点:</p><ul><li>子元素自己常驻隐藏(<code>opacity-0</code>),鼠标根本 hover 不到它</li><li>鼠标 hover 父级任意位置 → 子响应</li><li>配合 <code>group-data-[state=open]:*</code> 还能响应父级特定 data-state</li></ul><blockquote><p>网页动效 80% 的 hover 联动都靠它,React / Vue 项目通用。</p></blockquote>
<hr/><h2 id="">八、动画性能套件</h2><p>折叠 / 抽屉 / Tab 切换等动画场景,给做 transform 的元素加这两个,防掉帧:</p><pre class="language-html lang-html"><code class="language-html lang-html">&lt;div class=&quot;transform-gpu will-change-transform&quot;&gt;
  ...
&lt;/div&gt;</code></pre><table><thead><tr><th>Class</th><th>含义</th></tr></thead><tbody><tr><td><code>transform-gpu</code></td><td>强制该元素用 GPU 合成层渲染</td></tr><tr><td><code>will-change-transform</code></td><td>CSS hint,提前告诉浏览器「这元素的 transform 即将变化」,提前优化</td></tr></tbody></table><p>参考本项目 <code>app/components/landing/FAQ.vue</code> 的 <code>UAccordion</code> trigger 样式。</p><hr/><h2 id="">九、其他常用速记</h2><table><thead><tr><th>场景</th><th>Class 串</th></tr></thead><tbody><tr><td>长文字省略号</td><td><code>truncate</code> (= <code>overflow:hidden; text-overflow:ellipsis; white-space:nowrap</code>)</td></tr><tr><td>短文本行宽平衡</td><td><code>text-balance</code>(浏览器自动平衡每行长度,推荐语尾部不会只剩 1-2 字)</td></tr><tr><td>防止意外换行</td><td><code>text-nowrap</code></td></tr><tr><td>紧凑卡片悬停反馈</td><td><code>hover:bg-muted/50</code> + <code>rounded-lg</code> + <code>px-3 py-2</code></td></tr></tbody></table><hr/><h2 id="-cheatsheet">完整 Cheatsheet</h2><table><thead><tr><th>场景</th><th>关键 class 串</th></tr></thead><tbody><tr><td>顶部悬浮居中浮岛</td><td><code>fixed top-X left-1/2 -translate-x-1/2 z-10</code></td></tr><tr><td>毛玻璃胶囊</td><td><code>bg-muted/80 backdrop-blur-sm rounded-full border border-muted/50 shadow-lg shadow-neutral-950/5</code></td></tr><tr><td>父 hover 子才显 + 滑一下</td><td><code>opacity-0 group-hover:opacity-100 group-hover:translate-x-1 transition-all</code>(父挂 <code>group</code>)</td></tr><tr><td>压过第三方默认样式</td><td><code>pt-0!</code> / <code>px-0!</code>(Tailwind 4 important 后缀)</td></tr><tr><td>Reka UI 状态切文字色</td><td><code>data-[state=active]:text-highlighted data-[state=inactive]:text-muted</code></td></tr><tr><td>子元素响应父级 data-state</td><td><code>group-data-[state=open]:rotate-135</code>(父挂 <code>group</code>)</td></tr><tr><td>出血到全宽 + 锁 UI 容器宽</td><td><code>-mx-4 sm:-mx-12 lg:-mx-16 max-w-(--ui-container)</code></td></tr><tr><td>装饰性 CSS 大引号</td><td><code>before:content-[open-quote] before:text-7xl before:absolute before:-ml-10</code></td></tr><tr><td>动画不卡 GPU 提升</td><td><code>transform-gpu will-change-transform</code></td></tr><tr><td>简单大字 + 平衡行宽</td><td><code>text-balance</code></td></tr><tr><td>防换行</td><td><code>text-nowrap</code></td></tr><tr><td>长文字省略号</td><td><code>truncate</code></td></tr><tr><td>半透卡片底</td><td><code>bg-elevated/60</code></td></tr><tr><td>hover 轻微反馈</td><td><code>hover:bg-muted/50</code></td></tr></tbody></table><hr/><h2 id="">常见疑问</h2><p><strong>Q: 为什么 <code>bg-elevated</code> / <code>text-muted</code> 等在 Tailwind 官网搜不到?</strong></p><p>A: 这些是 <strong>Nuxt UI 自己注入的语义化颜色别名</strong>(Semantic Colors),基于 CSS 变量,自动跟随 light/dark 模式切换。要在 <a href="https://ui.nuxt.com/docs/theme">Nuxt UI 主题文档</a> 的 Semantic Colors 章节查,不是 Tailwind 原生类。</p><p><strong>Q: <code>!</code> 后缀是什么?</strong></p><p>A: Tailwind 4 的 important 语法,放在 class 末尾(如 <code>pt-0!</code>),等价于 <code>padding-top: 0 !important</code>,主要用来压过第三方库的默认样式。</p><p><strong>Q: <code>group</code> 和 <code>group-hover:</code> 必须配套吗?</strong></p><p>A: 是的。<code>group</code> 标在父级,<code>group-hover:*</code> 才能在父级 hover 时生效。单独写 <code>group-hover:*</code> 而父级没 <code>group</code>,Tailwind 不会识别父级关系,会失效。</p><hr/><blockquote><p>后续遇到新的经典套路继续追加到本文档。</p></blockquote></div><p style="text-align:right"><a href="https://sin6626.me/posts/source-code-study/portfolio-template-ai#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://sin6626.me/posts/source-code-study/portfolio-template-ai</link><guid isPermaLink="true">https://sin6626.me/posts/source-code-study/portfolio-template-ai</guid><dc:creator><![CDATA[Sin]]></dc:creator><pubDate>Mon, 20 Jul 2026 13:56:07 GMT</pubDate></item><item><title><![CDATA[Zod]]></title><description><![CDATA[<div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://sin6626.me/posts/study&amp;think/zod">https://sin6626.me/posts/study&amp;think/zod</a></blockquote><div><blockquote><p>Zod的学习, 非技术分享</p></blockquote>
<h2 id="zodhttpsgithubcomcolinhackszod">什么是<a href="https://github.com/colinhacks/zod">Zod</a></h2><p>Zod 是一个 帮助Ts的使用者们在Ts的编写和运行时，进行类型的推断和校验的库，极大的维护了Ts类型安全，0外部依赖， 轻巧，十分流行。</p><h2 id="zod">Zod的简单用法</h2><p>下面是在NuxtContent里面看见的Zod的用法，今天看文档的时候看见了Zod，发现不会使用于是就学习了下</p><pre class="language-typescript lang-typescript"><code class="language-typescript lang-typescript">// 代码
      schema: z.object({
        // Hero 区: CTA 按钮组 + 跑马灯图片组
        hero: z.object({
          links: z.array(createButtonSchema()),
          images: z.array(createImageSchema())
        }),</code></pre><p>Zod的用法很简单，简单到把上面的代码翻译一遍给你听你就知道他应该如何去使用了</p><ul><li>schema必须是一个对象类型，下面必须要有hero属性</li><li>hero属性必须是一个对象，必须要有links和images属性</li><li>links必须是一个数组，并且数组内的元素类型必须是creatButtonSchema() 这个方法的返回值类型，或者说通过这个返回值的校验（这个方法名的后缀是Schema其实从侧面说明了，这个方法的返回值也是一个z。object约束的对象）</li><li>images跟links同理
对吧，就是一看就会，一用也会（大概？）。然后你可以使用parse() 去验证你的数据，好比这样schema.parse(data)。如果在运行的时候parse的校验没有通过，那么会直接报错，而Ts只有当你使用这种错误数据类型的时候才会报错（比如你在String类型上使用了toFixed方法），这样也说明了他比Ts更加的安全，注重运行的数据安全。</li></ul><p>如果你不希望他在运行时报错，你可以使用safeParse(使用这个api往往表示你希望数据是正确的)，方法会返回一个对象：</p><pre class="language-typescript lang-typescript"><code class="language-typescript lang-typescript">// 代码
{
  success:false,
  error:ZodError
}</code></pre><p>如果数据正确则会返回这样的对象：</p><pre class="language-typescript lang-typescript"><code class="language-typescript lang-typescript">// 代码
{
  success:true,
  data:{
    name:&quot;Tom&quot;,
    age:18
  }
}</code></pre><p>在使用Ts的前端开发中，你想要去校验一个表单数据，不需要先interface 再去写校验数据逻辑了， 直接可以使用Zod去规定一个schema， 然后使用parse去验证，或者使用type register = z.infer<typeof></typeof>直接生成一个interface，而且还有校验的规则。</p><pre class="language-typescript lang-typescript"><code class="language-typescript lang-typescript">// 代码
const RegisterSchema=z.object({

 username:z.string(),

 age:z.number()

})


type RegisterForm = z.infer&lt;typeof RegisterSchema&gt;</code></pre><h2 id="">总结</h2><p>Zod的出现给运行时候的Ts代码套上一层安全的外壳，也简便了一些基础的校验规则，更多特性等有需求的时候再看吧。</p></div><p style="text-align:right"><a href="https://sin6626.me/posts/study&amp;think/zod#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://sin6626.me/posts/study&amp;think/zod</link><guid isPermaLink="true">https://sin6626.me/posts/study&amp;think/zod</guid><dc:creator><![CDATA[Sin]]></dc:creator><pubDate>Wed, 15 Jul 2026 14:28:03 GMT</pubDate></item><item><title><![CDATA[社会篇: 第一天的实习]]></title><description><![CDATA[<link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/9pxwffzppbzij3oaxn.jpg"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/org6fkpwlc19dvttck.png"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/3ad8otg6dhmyzqldcb.png"/><div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://sin6626.me/notes/6">https://sin6626.me/notes/6</a></blockquote><div><h1 id="">凌晨四点</h1><p>凌晨四点我迷迷糊糊的醒来了，可能是在倒我的生物钟吧，昨天晚上11点就睡觉了。醒了又尝试睡觉，然后迷迷糊糊的就开始做梦。那时候我梦见我我在放肆的跑，前面有一处悬崖，我往悬崖跑。那时候肯定是有意识， 我知道我在做梦，向着悬崖冲，想要在梦里面飞起来，毕竟梦里面应该是由我的意识主宰的。但是没成功，我径直向着地面落去，直接重重摔在房屋上，死了。死的那一刻我感受到我的意识突然一沉，就不知道所然了。（在梦中死去，意识一沉的感受对我而言感觉很新颖，所以水个开头）</p><h1 id="">公司上午</h1><p>早就已经找好了早餐店的地点，起床之后收拾好电脑包，买了两个包子前往了公司。公司位于一个写字楼，是个22成立的小公司，距离出租屋只有600米，很快就到了公司。公司的们是指纹密码锁，我没有录入指纹，打不开门，在那里干等着，不过好在一会就来了一位兄弟，帮我打开了门，跟我一样是个实习生（后端），我们就小聊了一会。兄弟很热情，不过也告诉了我一个不好的消息，“你是前端实习生啊，跟你说，昨天也有个前端实习生上午来的，下午就被开了”。这个消息真的把我吓得半死，什么阴间，半天就被开除了。“昨天那哥们，博哥（leader&amp;mentor）问他，他什么都不知道。哎，你学的咋样”。我超威，别压力我了，本来自己肚子里就没多少墨水。。。</p><p>上午博哥来了之后，跟说了下今天给我的任务，那就是看uniapp的文档，多熟悉熟悉。我也借此机会问了下之前忘记问的问题，公司前端的技术栈是什么。Tailwind or Unocss or scss，Ts or Js？其实小公司没那么讲究，能效率的完成任务就是了，然后就看了一上午的uniapp的开发文档。。。虽然才第一天来公司，虽然来的第一天之后就可以周末休息两天了，虽然自己可能不能胜任前端项目开发，但是，不去看代码，不去使用GPT5.6（今天刚出的），不去跟后端对接，我就感觉心里面很不踏实。（总不能上班时间直接去学react吧）</p><h1 id="">四人午饭</h1><p>12点到饭点了，上午帮我开门的兄弟拉我一起去吃饭，还有其他两位实习兄弟，包括我一共四人，两个前端，两个后端，一路上兄弟们就开始大讨论这个后端啊， 前端啊，怎么怎么回事，怎么怎么bug怎么怎么改，怎么怎么屎山。或许这就是实习生吧，我看技术群里的老油条们都早就开始了摸鱼，一个上午，一个群400多条信息！</p><p>三位兄弟都很好，都是在长沙读大学的大三学生们（下半年大四），到了食堂，我看他们都先坐在座位上，我还说要拉他们一起去打饭，但是他们却好心告诉我。在12点20之前打饭都是按称重给钱，20之后就是固定15块钱的自助餐，而且还有免费的冲兑的饮料喝。我是没想到居然还有这种搞法，这样就不会浪费很多的菜了，兄弟们也能放开了炫。该说不说不亏都是刚刚来的实习生，吃饭的时候还在讨论后前人写的的后端屎山代码。</p><p>饭后我跟他们说先不要上去，我们就先在楼下聊聊天，上面有人睡觉还不能说话。然后我们四人就又开始了各种大讨论，什么面试了什么问题，什么Java怎么了，什么公司很外包啊，各种乱七八糟的讨论，哈哈哈哈哈，那时候他们吐槽代码的时候我是真的绷不住了，想在想想也好笑。</p><p>其中那位一开始帮我开门的兄弟，一直苦恼于没办法搞测试。说没有一个前端来跟他对接，要修bug，要搞测试，但是他根本不知道前端传递了什么过来，而且一个数据库100多个表，都懒得找表。反正闲着没事，我就说我跟他一起对接，我拉前端代码下来看看。这样下午就终能有点事情干了。</p><h1 id="vibe-fix">快乐Vibe Fix</h1><p>该说不说不愧是GPT5.6 Terra，虽然不给他uniapp的官网的话他真的有点拉，我都提醒了有个bug是生命周期的问题了，但是他还是没改对，给了uniapp的官网，并且配置好uniapp的skill（群友糖糖给的<a href="https://www.skills.sh/uni-helper/skills/uni-app">skill</a>）之后他就终于发挥了他真正的实力，基本上bug都是一次性修复成功，虽然每次修复bug我都提醒了他问题在哪里，不过我觉得他自己排查估计也能排查出来，我这样做只是省了token。</p><p>下午就能边修bug，边看技术群的群友们水群了。他们真的很会摸鱼水群，群里面腾讯的企鹅👴就不说了，估计事情很少，但是别的兄弟们啊，好好上班啊，不要在上班时候摸鱼啊，搞得我也想摸了！一下午又是400多条信息😢，根本看不过来。</p><p>记得一共是修了三个bug。第一个bug是Web端可以成功调用接口， 但是App端不能调用接口，原因是因为这是uniapp项目，但是之前写的人使用onMounted生命周期，但是uniapp的生命跟vue的生命周期有点区别，得用onLoad</p><blockquote><p>[!TIP]
在uniapp中onLoad比onMounted更早执行，位置大概是vue3中的onMounted的那种感觉，所以在uniapp中只要使用onLoad就行了</p></blockquote>
<p>第二个bug是，使用的navigateto跳转的页面，然后上一个页面没有做下拉刷新，也没有在跳转到页面的时候做一次请求，并且也没有页面的销毁，就导致从下一个页面使用navbar返回回去的时候，页面的数据还是老数据，不能正确显示已经被修改的数据（调回去的页面的tarbar页面）</p><p>第三个bug是前端的代码Js代码的逻辑问题，当然可以说后端少给了个接口， 不然前端这部分逻辑可以不用写的，很简单的逻辑问题，也没什么好说的。</p><h1 id="flag">展望与Flag</h1><p>先来展示下出租屋的图片吧，是一个改造房，中间一条走廊， 两侧很多个小单间，公用厕所洗漱台洗衣机之类的。</p><p><img src="https://s3.sin6626.me/mx-images/9pxwffzppbzij3oaxn.jpg" alt="47e3b15acab921c56aa57b94e3727137.jpg"/></p><p>其实一个出租屋对于我而言是一个很好的学习环境，家里学校都好，没有学校的那么多的烦心的事，也没有家里面的吵闹，在这里我反而能更加的追求我喜欢的东西，于是我觉得我应该立下了三个Flag。</p><ol start="1"><li>搬出出租屋的时候学完Nest（我认为当下一个合格的前端必须要学好的技术栈，因为有个Nest你就能高度的绑定Ts，而且你也能写好后端的api，这样你才有资格做出自己喜欢的东西）</li><li>搬出出租屋的时候学完React（当前Vue在国内确实很多厂招，但是大厂或者好更加好点的厂都更加的偏向于React）</li><li>搬出出租屋的时候能够拥有面对算法的笔试的算法能力（这一点是看了群友们的建议想到的，本来是想Ai时代下，算法可能不在那么的重要，但是看了群友们说，前端算法还是很重要，虽然没什么用。坚持算法对我而言不难，毕竟也是leteCode400题的男人，但是这次我要用Ts写，毕竟要走前端）</li></ol><p><img src="https://s3.sin6626.me/mx-images/org6fkpwlc19dvttck.png" alt="image.png"/></p><p><img src="https://s3.sin6626.me/mx-images/3ad8otg6dhmyzqldcb.png" alt="image.png"/></p><p>群友彭于晏就是去了企鹅的👴。只能说加油搞吧，还有两年，希望大四能找到一个合心意的工作，那时候就可以开始摆烂了，哈哈哈哈哈哈。</p></div><p style="text-align:right"><a href="https://sin6626.me/notes/6#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://sin6626.me/notes/6</link><guid isPermaLink="true">https://sin6626.me/notes/6</guid><dc:creator><![CDATA[Sin]]></dc:creator><pubDate>Fri, 10 Jul 2026 13:46:49 GMT</pubDate></item><item><title><![CDATA[第一次面试的心得]]></title><description><![CDATA[<div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://sin6626.me/posts/default/first-interview-tips">https://sin6626.me/posts/default/first-interview-tips</a></blockquote><div><blockquote><p>先说结果，面试过了，拿到了前端实习的offer，是个小公司，月薪3k不到，每天上7个半小时，双休不加班</p></blockquote>
<h2 id="">简历准备及投简</h2><p>说实话我原本是没想在期末周的时候就开始去找实习了，因为在我的认知里面，这种暑假实习，日常实习，在暑假的时候的时候应该也能找，让我改变了这个观点的是我一个朋友。事情是这样的，我有一个朋友，他妈妈嫌弃他暑假老是待在家里面无所事事，于是就让他去打暑假工，然后他就跟我分享了这件事情，说他已经找了暑假工了，是用58同城找的，在他家楼下的KFC工作。我很高兴，然后我就告诉他，我也不能懒惰了，我也要去找实习才行了，暑假就找。结果他说：你暑假找，别人早就招满，我这种兼职都这样，更别说实习了。我这一听，有道理啊！直接给我点醒了，不管三七二十一了，直接先去投简历再说！</p><p>问了下之前也投过简历的同学，参考了下他的简历，一眼看出是GPT生成的简历。然后我也开始了用GPT生成简历，我把我要找实习的事情告诉他，把我的技术栈，获得的奖，对开源项目的贡献，我之前做过的项目文件都喂给了他，然后就为我生成了一份真的非常贴合我的简历，在充分展示我的情况下，也不失应有的含蓄。于是我就开始用这份简历开始了投简（虽然中途有些修改，但是都是很细微的修改）</p><p>我是从6月27号开始投简历的，投了一天，差不多30多份，BOSS，实习僧， 智联等等，反正除了牛客我都投了。第二天醒来，没有一个人鸟我！意识到不能这样，赶快去网上查查投简历的攻略，问问学长，师兄们是怎么找实习， 怎么投简历的。28取完经之后，我依旧海投，不过更加的虎了，什么职业，什么要求也不看了，就是投，更前端有一点点相关的就是投，几个平台投的简历数也达到了100多份，但是当天依旧没有人鸟我！灰心失落的我就睡觉等待第二天了。</p><p>29号，11点半起床，打开手机，信息直接炸了！手机弹窗全是某某hr看了我的简历，于是赶快一个个给hr发信息，希望能求取一个实习的机会。其中有两个表示对我的感兴趣，一个发来了要线下面试机试的要求（河南郑州），另一个直接说明天能不能线下面试（长沙本地），但是两个都是0-20人的小公司，不过我也不挑剔，毕竟是第一次实习。激动坏了，同意了30号的长沙的面试。</p>
<h2 id="">面试的准备</h2><p>知道我要面试后， 我有一个朋友直接给我算了下塔罗牌，分别是“时间沙漏”，“ 宝剑八正位”，“权杖八正位”，先说结论，准爆了！三张卡分别对应的是时间紧迫，心态是我的阻碍点，面试时间很快，快速推进。</p><blockquote><p>明天这场面试是一个限时机会，机会摆在眼前，但留给你展示、扭转印象的时间很短。
同时暗示：面试官会快速判断你的适配度，不会给你长时间铺垫；当下你的履历、准备内容已经定型，能改变的只有临场发挥，过往积累无法临时突击弥补。
也代表这场面试是阶段性节点，过与不过都会快速敲定结果，不会无限拖延等待。</p></blockquote><blockquote>
<p>宝剑八代表自我束缚、自卑、视野受限、过度担忧。
你现在内心有很重的心理枷锁：</p><ul><li>总觉得自己准备不足、短板明显，下意识放大自身缺点；</li><li>容易自我设限，不敢大胆展示优势，回答问题畏手畏脚；</li><li>会脑补面试官严苛挑剔，还没上场就先自我否定。
客观来看，大部分压力是你自己困住自己，面试官并没有刻意刁难你的意图，只是你内心的不自信遮住了你的闪光点。</li></ul></blockquote><blockquote>
<p>权杖八是快速推进、沟通顺畅、消息来得快、高效沟通。
过程层面：面试节奏很快，问答流程紧凑，不会冷场拖沓，双方交流直白干脆，面试官提问直击重点，没有弯弯绕绕。
结果信号：沟通效率高，信息传递顺畅，只要你放下内心顾虑、放开表达，双方能快速达成共识；面试结束后反馈会来得很快，不会漫长等待。</p></blockquote>
<p>当下你的履历、准备内容已经定型，能改变的只有临场发挥，过往积累无法临时突击弥补。面试要点是要我自信，要摆脱自我否定，大方展示自身优势。于是我就去找我的朋友进行了一场模拟面试，面试的是字节的题目，这次模拟确实给我增加了不少的信心，感觉自己曾经的知识并没有忘记，当我想调用他们的时候他们也能被我调用。</p><p>现在回顾一下这个塔罗牌，真的准呀，可以说完全一致。</p><p>11点面试，我10点10分就到了，10点20多开始面试，因为本来也就是心血来潮， 没做什么准备就去找的实习，八股根本没有背！只带着我绝对的自信，无条件的相信自己曾经自己的积累不会辜负现在自己。面试官是个东北大老爷，目测有45岁左右，整个人压迫感很强，确实对我的心态造成了不小的打击。但是还是很快稳住了脚步， 找到了自信，我本来就没有复习，就单单只有自信。</p><p>面试官一共问了我几个简单的八股，有这些：说下Vue的生命周期（一共8个我只说出了一个onMounted。。。，外加记混了的一些api。。。）， 说下Vue的父子通信是怎么通信的（这个顺利回答出来了，幸亏之前忘记了，问了GPT老师👍✌️），</p>
<p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊， 为什么没有保存到我的草稿啊！全部都没了， 不写了！</p></div><p style="text-align:right"><a href="https://sin6626.me/posts/default/first-interview-tips#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://sin6626.me/posts/default/first-interview-tips</link><guid isPermaLink="true">https://sin6626.me/posts/default/first-interview-tips</guid><dc:creator><![CDATA[Sin]]></dc:creator><pubDate>Tue, 30 Jun 2026 16:03:46 GMT</pubDate></item><item><title><![CDATA[累有感]]></title><description><![CDATA[<link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/yeh194avmg6o9cf5ug.png"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/g727wv88sn0nzq59bw.png"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/w8pb50w9i9r9xr5hfo.png"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/scc5i2drpc0d646psg.png"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/4mvchrk34cuxmk4q13.png"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/3vy2coxy6edjcsascb.png"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/i9jk0yvt7mxje1f76f.png"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/dx5rjyu3vmen75keou.png"/><div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://sin6626.me/notes/5">https://sin6626.me/notes/5</a></blockquote><div><blockquote><p>累,，看到一些信息，想到一些事，有一些感想</p></blockquote>
<h2 id="">累</h2><p>今天周三，晚上感觉真的累。晚饭吃了朋友帮忙带的塔斯汀，然后洗澡，然后就开始跑codex，想着优化迭代下项目，没想到就是噩梦的开始。</p><p>GPT5.5额度消耗很快，开的是5.4。开codex跑两个项目，inkos跑另一个。inkos还好，MIMO我很放心，但是codex真的让我操碎了心。两个项目一个我现在实验室后后面互联网技能赛准备的项目----Q3，还有一个我自己为了改变我的桌面做的收纳箱的项目----filebox。Q3项目的后端是原生node写的，之前手搓的时候，没有什么注意，导致后面Ai接管项目，把很多路由处理函数都写在了一起，虽然这些函数处理的数据确实是一样，理论上放一起也没事，应该也能操控得住。但是架不住函数多，函数长，几个函数放一个文件内，文件直接超过了500行。没有遵循老前辈的教诲（代码和人有一个能跑就行了），想要GPT去稍微细一点去拆分代码，让一个文件中的代码少一点，于是就让他去改了。改出来的成功表面上没什么问题，但是却把我的frp全给删除了！我很生气， 问GPT怎么回事</p><p><img src="https://s3.sin6626.me/mx-images/yeh194avmg6o9cf5ug.png" height="477" width="997"/></p><p>他说他没改， 我想到下午我还用opencode开了GPT5.3改代码，于是也去问问</p><p><img src="https://s3.sin6626.me/mx-images/g727wv88sn0nzq59bw.png"/>
他也说没删除，跟我说一大推什么git，我git都没追踪frp的文件，跟git有什么关系？也没有进行什么代码拉取，回滚操作。此时我就很生气了，虽然frp下载和配置很简单， 但是GPT的态度让我很不高兴，我是感觉GPT对我进行了欺骗，把我的frp删除了，还说没删除。此时我真的感觉心很累， codex我明明那么信任你，但是你却让我很失望。</p><h2 id="">累</h2><p>另一个filebox的项目，也是让GPT去迭代，结果更是一坨大的。我给他找了一个苹果手机的悬浮球的图片， 想让他也给我做一个这种样式的前端主题。结果完全不行，丑的没法看，而且很多功能还是丢失的，跟他进行了多轮对话，风格还是没有好的改变，依旧丑。这里我就已经很崩溃了，额度花了不少，但是依旧丑陋。</p><p>然后我让他把工作区代码全部改成我github仓库的代码，他又跟我说一大推有的没的，居然还说我没git初始化仓库？！</p><p><img src="https://s3.sin6626.me/mx-images/w8pb50w9i9r9xr5hfo.png"/></p><p>我很好奇，我没初始化， 那我之前怎么让别的Ai进行代码回溯的，怎么让Ai上传代码到我的github仓库的，而且我项目根目录下明明都有.gitignore文件。受不了了，我直接打断了GPT。</p>
<p><img src="https://s3.sin6626.me/mx-images/scc5i2drpc0d646psg.png"/></p>
<p><img src="https://s3.sin6626.me/mx-images/4mvchrk34cuxmk4q13.png"/></p><p>这里已经可以看到我很愤怒了，有种面对豆包的无力感。</p>
<h2 id="">累</h2><p>后面实验室项目的队友说要联调，于是我就去搞联调了。联调是心最累的。设备端的队友他们收指令的格式不是我一开始给他们的指令格式，也不是题目中的说的字段名字。一开始我就给了一份写好的MQTT应该的发送格式的Markdown文档给他们，但是他们都没有看，最后在指令部分还要我在联调的时候改。这里我就已经开始绝望了。想起来了我朋友在打2V2台球时说的一句话：小冯，这是你队友（这时候是因为我队友自由球没进球，后续还送了自由球给他们）。</p><p>这里我已经由绝望转变成了一丝丝的愤怒，我真的都想直接开喷了，但是还是压住了怒火，因为我要参加比赛，而比赛得要有队友。与其把这一切都搞糟，不如先做好，等后面再慢慢改。问清楚了他们的字段的含义，于是就给GPT去改，改的真还行，有些地方我估计是因为他们的字段名语义太差，GPT根本不知道是什么意思。</p><p>到10点22分的时候，GPT改完了，我想进行测试的时候，但是他们那边都收拾好了电脑，说是要打印一个什么， 打印店马上关门了，没办法测试了。这里火气又上来， 我辛辛苦苦改这些字段，改数据库，结果改完不进行测试了，什么鬼？但是我还是压下了怒火，最后只能去跟群友们吐槽， 发😭的表情来稍微释放下我的心情。</p><h2 id="">群友的话的联想</h2><p><img src="https://s3.sin6626.me/mx-images/3vy2coxy6edjcsascb.png"/></p><p>看到苏打哥问我上学不打游戏吗，我突然感觉自己有一种说不出的感觉。小时候，在没手机的时候， 我天天抱着一个电脑看， 我的叔叔看见之后总是会告诉我要少看电视。稍微大一点，有了手机， 我天天打游戏，过年的时候在年夜饭上，也打， 吃完饭也打。我的叔叔也跟我不要打游戏。在爷爷奶奶面前， 他们也劝告我要少打游戏，多读读书。每次我只能嗯。</p><p>上大学后， 不知道怎么回事，我游戏打得越来越少（大概）。</p><p>大一的时候逃课刷算法视频， 刷力扣。</p>
<p><img src="https://s3.sin6626.me/mx-images/i9jk0yvt7mxje1f76f.png"/></p><p>后面打完蓝桥杯保持了一阵子，就放下了。沉沦了一段时间的奶块，应该是玩了1000多个小时。随着后面，游戏内的几个好友的淡游，我也心起了淡游的念头。于今年的4月中旬正式开始了淡游，晚上属于奶块的也全部变成了我去了解Ai，学习编程，了解项目，做自己感兴趣的事情的时间。这种情况一直持续到了现在。</p><p>永劫也很久没有登录了，每次都跟兄弟们打还得要更新。</p><p><img src="https://s3.sin6626.me/mx-images/dx5rjyu3vmen75keou.png"/></p>
<p>不过也好在兄弟们也没嫌弃的我的技术差，有时候想玩了，喊他们打，他们也会答应（每次打单挑都虐杀了废别，但是废别也是要面子的，就不放图了）。</p><p>当群友苏打哥问我大学不打游戏的吗的时候，内心一下真的就复杂了起来。可能我内心是想打的吧，但是我也想去驱动Ai，去做自己想做的事情，满足自己的好奇心。</p><p>早在大学刚开始的时候，我就让自己给计算机行业加上了一个刻板印象。计算机行业的学生想要找到一个好的工作，普通人而言，就是多次的实习经历。我也给自己想了三次实习经历的计划，第一段是大二升大三的暑假，找到第一段实习，找什么都好，尽可能的融入行业，认识行业内的大佬。第二段是大三升大四的暑假，目标是找到一个比上次更好的实习（一次比一次好就够了）。最后就是大四的实习，这段实习要向着转正去做，给自己留一个后手，就不用怕后面的校招（感觉自己想的比较美好）。</p>
<p>哈哈哈， 不知道说什么了，昨天晚上熄灯之前都没写完手记，感觉昨天晚上的想的很多事情都忘记了，人真的跟openclaw一样哎，在梦境中整理我们的记忆，我昨天的感悟都没了，哈哈哈。那就这样吧，真忘记要说什么了。。。好像是有些对于找女友的感想来着， 对大学的感谢来着，真忘记了。。。</p></div><p style="text-align:right"><a href="https://sin6626.me/notes/5#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://sin6626.me/notes/5</link><guid isPermaLink="true">https://sin6626.me/notes/5</guid><dc:creator><![CDATA[Sin]]></dc:creator><pubDate>Wed, 03 Jun 2026 05:25:54 GMT</pubDate></item><item><title><![CDATA[有关驱动式学习的感悟]]></title><description><![CDATA[<div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://sin6626.me/posts/study&amp;think/drive-based-learning-insights">https://sin6626.me/posts/study&amp;think/drive-based-learning-insights</a></blockquote><div><blockquote><p> 驱动式学习，世界上最好的学习方式，不是为了解决学习而学习， 而是为了解决实际的问题。</p><h2 id="">第一次听到这个词语</h2><p>我第一次听到这个词语，是我大一下的时候。那天有一个即将毕业的大四学长的讲座分享会，我在观众的名单中，看见了一个我在意的人的名字，于是也报名了这个讲座当观众的活动。算是赚大，学到了很多，也是在学长的分享会上我第一次听到了这个词语--驱动式学习。</p></blockquote>
<p>学长很优秀，有过大厂的实习经验，即将毕业，手里已经收到了多份大厂的offer，小红书，快手，字节等。他说了他了大学四年的经历，很丰富，也很精彩。他说推荐我们一种学习方式：驱动式学习。听到这个词，那时我立刻就有了一种陌生又熟悉的感觉，随后他又讲解了什么是驱动式学习，简单来说就是：<strong><em>不是为了读书而读书，而是被一个 “目标 / 问题 / 任务” 推着走，为了解决它才去学</em></strong>。那时候我没什么感觉，但是却让我影响深刻，第一我不知道如何去运用这个学习方法，也不知道他的厉害之处在哪里，但是我却记住了，觉得可能在日后的某个瞬间，我可能会理解吧。</p><h2 id="">近日的驱动式学习</h2><p>最近我实验室的互联网项目要开始进行联调，其中我就遇到了不是问题， 但是又让我很不舒服的事情。我是负责应用层（前后端），要和负责通信层的队友进行通信。理论上在比赛中，我们应该会是在同一个局域网之中，然后就能很方便的进行通信，他代码那边写我的ip，端口，然后连上我的mqtt服务器即可。但是在开发过程中，我们经常不在同一个局域网中，每次要进行调试，或者尝试连接之类的事情，我都得要背着我厚重的电脑去他们旁边进行联调。对我一个常年把电脑放在寝室的人来说，非常的不友好。（要带着电脑跑跑到9楼的高度，到地方了还得休息10分钟才能进入状态）虽说这种事情还称不上是问题，但是跟他们进行了一次联调之后， 我还是有了能不能我就在寝室，然后他们也能连接上我的mqtt服务器的想法。</p><p>刚好晚上，我实验室的兄弟就说了有关frp之类的言论，我并不知道什么是frp，但是他又说，他们组现在已经可以远程连接他的mqtt服务器了，这让我一下就感了兴趣，原来不是只有我有这种想法。第二天我就开始了frp的了解和学习。</p><p>frp是一个内网穿透的工具，让在本地的开的服务可以映射到公网上，然后别人通过公网上的ip加映射的端口就能访问你本地的服务。前提是你得有一个在公网上服务器。服务器通过下载配置frps，然后本地电脑通过下载配置frpc，就能很简单的实现别人远程访问你的电脑上开的服务。还可以通过ssh实现远程连接电脑，不过现在我是没有这个需求。</p><p>晚上跟朋友们出去浪完回来就开始了远程的联调（或许我应该发布下出去玩的手记），不出我意料，没有一点问题，他们设备端可以正常连接到我的mqtt服务器，也能发送消息。</p><h2 id="">感想</h2><p>可以发现，我学习使用frp是很快的，一天时间都没有到， 我就解决了一个不是问题的，但是让我感觉不舒服的点，这也是我们当下这个时代的特点。各种资料的开源，工具，知识能很轻易地在网络上获取，信息不在是封闭的，也有Ai去辅助我们收集信息（如果不给Ai官网，他很可能出现信息过时，或者胡编乱造的情况），学习任何一个东西都是很迅速的（当然迭代也快）。这种情况下，驱动式学习更是能体现出它的优势点：</p><ul><li><code>主动性强，不是别人给我灌输知识， 而是我需要什么知识</code>：区别于传统形式的讲课式的学习，课上的知识是老师教我们的，是老师按照课程要求给我们灌输的知识，是他们想要我们学会的----要我学。而驱动式学习，则是我主动的去学习，我要解决一个问题，我需要什么知识----我要学。</li><li><code>理解更加的透彻，对知识的运用力更强</code>：本身驱动式学习就是从问题出发的，学习对应的知识，然后解决的了对应的问题。这是实实在在的掌握理解了知识，并且在知识运用到了实践当中，不是空的。遇到对应的问题，也能快速调用相应知识去解决问题。</li><li><code>适配自学，长期，终生学习的必经之路</code>：自主的解决问题，培养了主动性，这跟自学所需的主动性本质上是同一个东西，潜移默化地提高了自学的能力，而且“发现问题 — 学习知识 — 解决问题” 的良性循环，这会让人收到正反馈，让人坚持学习下去，无意识地就长期学习了，甚至终生学习。</li></ul><p>只想到了3个点，果然啊，把自己的感悟描述出来很难，有些东西只可意会不可言传是对的。加油继续努力吧，第一次学习使用了MarkDown格式，感觉比编程简单。</p></div><p style="text-align:right"><a href="https://sin6626.me/posts/study&amp;think/drive-based-learning-insights#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://sin6626.me/posts/study&amp;think/drive-based-learning-insights</link><guid isPermaLink="true">https://sin6626.me/posts/study&amp;think/drive-based-learning-insights</guid><dc:creator><![CDATA[Sin]]></dc:creator><pubDate>Sun, 31 May 2026 09:30:23 GMT</pubDate></item><item><title><![CDATA[第一次吃漂亮饭]]></title><description><![CDATA[<link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/wtjf00bmg3oso6iaxy.jpg"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/e1ymdxu7vhocvrvg19.jpg"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/y3lbxp91xlwhx1496r.jpg"/><link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/t3hcbk34bf19pkanof.jpg"/><div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://sin6626.me/notes/4">https://sin6626.me/notes/4</a></blockquote><div><blockquote><p>当之前只在图片里的“漂亮饭”真真切切地出现在我眼前时，我的心情可谓是既开心又难过。开心的是，第一次吃上漂亮饭，感到非常新奇；难过的是，这个在我脑子里徘徊了无数次的浪漫场景，此刻坐在我边上的居然是个男生！
昨天半夜跟蚊子搏斗了好久好久，连斩屠戮了三只蚊子之后，才得以缓缓入睡。结果万万没想到，晚上做梦居然梦到自己出生在了缅北……</p></blockquote>
<h2 id="">探索“米店书吧”</h2><p>惊魂未定地醒来之后，拉上朋友先去扒拉了个午饭，随后便直奔我们今天的活动地点——<strong>米店书吧</strong>。</p><p>刚一进去，属于是“dio丝进城”了。这家店面非常的洋气，我简直像个婴儿一样，充满好奇地打量着四周。</p><p><img src="https://s3.sin6626.me/mx-images/wtjf00bmg3oso6iaxy.jpg" height="1280" width="2844"/></p><p>当然，这只是冰山一角。真正优美的环境并没有在图片中完全展示出来——初来乍到，我也不太敢肆无忌惮地四处记录，只能在座位上随手定格一张，分享给各位。</p><p>就如同朋友给我介绍的那样，刚走进这家店，就能感受到这里确实是个适合学习的宝地。它有着和咖啡馆一样静谧的好环境，大家都在有条不紊地做着自己的事情。在这样的氛围感染下，我也慢慢沉浸到了自己的世界里。</p><h2 id="">下午</h2><p>今天的开发异常顺利！基本上我能做的、能测的模块全都搞定了，现在只等下周队友把设备做出来就可以进行联调。</p><p>不得不提一句，这里的空调开得好足，连我的“拯救者”游戏本都咆哮不起来了，甚至把我本人都冻得有些发冷。后来，我开始给朋友演示最近捣鼓的小玩意儿，他看完表示：“确实挺不错的”。（等这些东西被我彻底捣鼓明白、觉得拿得出手了，我会专门发篇新文章来分享我的心得！）</p><p>后面的后面，就迎来了一段大讨论。可恶的“外星人”竟然冒充小学生跑来附近吵闹！本来我还想静下心来学习一下 NestJS，可实在是被这些小学生整得苦不堪言。无奈之下，我只能默默关掉 B 站，打开了《植物大战僵尸》——还别说，这游戏真的让我被小学生搅得浮躁的心逐渐平静了下来。</p><h2 id="">主角登场</h2><p>终于熬到了饭点，我也如愿点上了本篇日记的主角——<strong>漂亮饭</strong>！</p><p>我点的是一份台式🦌(卤)肉饭，朋友点的是黑胡椒意面。除此之外，我们还各自配了一杯高颜值的“漂亮水”和冰杨梅。</p><p><img src="https://s3.sin6626.me/mx-images/e1ymdxu7vhocvrvg19.jpg"/></p><p><img src="https://s3.sin6626.me/mx-images/y3lbxp91xlwhx1496r.jpg"/></p><p><img src="https://s3.sin6626.me/mx-images/t3hcbk34bf19pkanof.jpg"/></p><p><strong>我的评价是：好吃，小贵，但是值得。</strong></p><p>如果以后我有女朋友了，我也一定会带她来这儿吃。可惜啊，这种浪漫的场景对于现在的我来说，还是只能在梦里见见。我的目标是在大二找到女朋友（现在满打满算还剩一个多月），兄弟们，你们觉得我能完成目标吗？</p>
<p>本篇日记就是在吃完漂亮饭后趁热打铁写的。晚上还有团日活动要参加，真的没时间了，怎么感觉时间过得这么快啊！</p><p>不说了，赶车去了，哈哈哈哈！</p></div><p style="text-align:right"><a href="https://sin6626.me/notes/4#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://sin6626.me/notes/4</link><guid isPermaLink="true">https://sin6626.me/notes/4</guid><dc:creator><![CDATA[Sin]]></dc:creator><pubDate>Sun, 17 May 2026 10:45:02 GMT</pubDate></item><item><title><![CDATA[总结下最近学的TailWind和Nest的心得]]></title><description><![CDATA[<link rel="preload" as="image" href="https://s3.sin6626.me/mx-images/da77m3yd2d95mdjhoi.png"/><div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://sin6626.me/posts/study&amp;think/tailwind-nest-summary">https://sin6626.me/posts/study&amp;think/tailwind-nest-summary</a></blockquote><div><p>五一上来，还算是比较悠闲的，捣鼓了自己很多喜欢的东西，也学了很多自己喜欢的技术，就比如这篇说的 <strong>Tailwind CSS</strong> 和 <strong>NestJS</strong>。</p><p>本应该是 Tailwind 一学完就发布一篇学习心得的（虽然只是浅学了点），或者是等 NestJS 学完再一起发。前者因为自己最近琢磨新花样给耽搁了，后者则是如今时间实在告急了，已经没有时间继续啃 NestJS 了。实验项目现已进入了联调阶段，但我应用层的框架还有很多 Bug，很多底层代码也没有看完，所以接下来的时间必须全力冲刺实验室项目了！</p><p>在闭关之前，先把这份心得整理出来。</p><h2 id="-">📚 学习资源</h2><ul><li><a href="https://www.bilibili.com/video/BV1ov9NBGEsR/">学习 Tailwind 的视频 1</a></li><li><a href="https://www.bilibili.com/video/BV15rn9z2EvE/">学习 Tailwind 的视频 2</a></li></ul><hr/><h2 id="--tailwind-css-v4">💡 初识 Tailwind CSS v4</h2><p>今天去翻官方文档时发现 Tailwind 又更新了，我当时学的时候是 4.2，现在已经迭代到 4.3 了。</p><p>Tailwind 是一个以 Utility（实用工具）为主的 CSS 框架，我们一般叫它“原子类框架”。它的理念和早期的 Bootstrap 略有神似，都是通过在 HTML 标签上添加现成的类名来实现样式渲染。</p><p>但 Tailwind 有一个无与伦比的优势：<strong>超强的可移植性</strong>。从 Vue 迁移到 React，基本上只需要无脑 copy 代码即可。更棒的是，如果你在网上看到别人用 Tailwind 写出了酷炫的样式，你可以直接复制人家的源码标签从而实现“一键盗走样式”，毕竟所有的设计逻辑都明明白白地写在类名上了。</p><hr/><h2 id="--vue-">🛠️ 在 Vue 项目中快速起步</h2><p>在 Vue 3 + Vite 环境下使用 Tailwind v4 非常丝滑：</p><h3 id="1-">1. 安装依赖</h3><p>首先安装 Tailwind 核心包及其配套的 Vite 插件：
<code>bash
pnpm install tailwindcss @tailwindcss/vite</code></p><h3 id="2--vite-">2. 配置 Vite 插件</h3><p>在 <code>vite.config.ts</code> (或 <code>.js</code>) 文件中引入插件：
```javascript
import { defineConfig } from &#x27;vite&#x27;
import tailwindcss from &#x27;@tailwindcss/vite&#x27;</p><p>export default defineConfig({
  plugins: [
    tailwindcss(),
  ],
})
```</p><h3 id="3-">3. 引入入口</h3><p>在你的全局 <code>style.css</code> 文件首行加入导入指令即可：
<code>css
@import &quot;tailwindcss&quot;;</code></p><blockquote><p><strong>🔥 小贴士</strong>：别忘了去 VS Code 插件市场下载 <strong>Tailwind CSS IntelliSense</strong>，这样在写代码时就能享受到丝滑的类名语法提示和颜色预览了。</p></blockquote>
<hr/><h2 id="-">🧬 核心指令详解</h2><p>Tailwind v4 推崇 CSS-First 理念，通过几个强大的 CSS 指令直接在样式表中进行深度定制。</p><h3 id="-theme">🎨 <code>@theme</code></h3><p>用于自定义全局设计变量。语法遵循标准的 CSS 变量格式（以 <code>--</code> 开头）。
<code>css
@theme {
  --color-dark-blue: oklch(21.613% 0.09471 275.052);
  --font-arial: Arial, sans-serif;
}</code>
<em>细节建议：在定义色值时推荐使用 <code>oklch</code> 格式，它能让颜色的视觉一致性更强，对人眼更为友好。</em></p><h3 id="-utility">🛠️ <code>@utility</code></h3><p>用于定义自定义的原子工具类，创建后可以直接在 HTML 标签上使用。
<code>css
@utility grid-cols-autofit {
  grid-template-columns: repeat(auto-fit, minmax(13.75rem, 1fr));
}</code></p><h3 id="-layer">🧱 <code>@layer</code></h3><p>用于控制 CSS 样式的级联分层。Tailwind 默认为了保持纯净会重置浏览器样式（比如 <code>h1</code>-<code>h6</code> 都没有加粗）。如果项目里大量需要加粗，与其每次手写 <code>font-bold</code>，不如直接在 <code>base</code> 层统一覆盖：
<code>css
@layer base {
  h1, h2, h3 {
    font-weight: 700;
  }
}</code></p><h3 id="-apply">✨ <code>@apply</code></h3><p>可以将一连串冗长的 Tailwind 原子类“打包”成一个传统的原生 CSS 类，用于组件样式的统一收口。
<code>css
@layer components {
  .button {
    @apply bg-fuchsia-700 py-3 px-7 inline-block rounded-full hover:bg-fuchsia-600 transition-colors;
  }
}</code></p><h3 id="-variant">🎭 <code>@variant</code></h3><p>v4 极其实用的语法糖。它允许你在自定义 CSS 逻辑中嵌套应用 Tailwind 的变体状态（如深色模式、Hover 态等）。
```css
@utility feibie-div {
  background-color: black;</p><p>  /<em> 当系统或页面主题为深色模式时，背景变灰 </em>/
  @variant dark {
    background-color: grey;
  }
}
```</p><hr/><h2 id="-">🎉 阶段成果展示</h2><p>最后展示一下这几天跟着视频边学边做敲出来的实战成果：</p><p><img src="https://s3.sin6626.me/mx-images/da77m3yd2d95mdjhoi.png" height="1039" width="1919"/></p><hr/><p>啊啊啊啊啊，写着写着发现又说多了！
时间实在是真的不够用了，马上得去打电话跟进实验室的联调进度。那 NestJS 的坑我就先刨到这儿了，等哪天项目搞定、闲下来学完的时候，我再来补发一篇心得吧！</p><p>诸君回见！👋</p></div><p style="text-align:right"><a href="https://sin6626.me/posts/study&amp;think/tailwind-nest-summary#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://sin6626.me/posts/study&amp;think/tailwind-nest-summary</link><guid isPermaLink="true">https://sin6626.me/posts/study&amp;think/tailwind-nest-summary</guid><dc:creator><![CDATA[Sin]]></dc:creator><pubDate>Tue, 12 May 2026 13:40:42 GMT</pubDate></item></channel></rss>