<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NestJS to Go with Sponge</title>
<style>
<span class="mention-invalid">@import</span> url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;800&family=JetBrains+Mono:wght@400;700&display=swap');
:root {
--bg-dark: #0d1117;
--bg-card: #161b22;
--text-primary: #e6edf3;
--text-secondary: #8b949e;
--nestjs-color: #e0234e;
--go-color: #00add8;
--sponge-color: #f9a825;
--border-color: #30363d;
--code-bg: #0d1117;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
background-color: var(--bg-dark);
color: var(--text-primary);
width: 720px;
height: 1280px;
overflow: hidden;
display: flex;
flex-direction: column;
padding: 40px;
line-height: 1.4;
}
header {
text-align: center;
margin-bottom: 30px;
border-bottom: 1px solid var(--border-color);
padding-bottom: 20px;
}
h1 {
font-size: 36px;
font-weight: 800;
background: linear-gradient(to right, var(--nestjs-color), var(--go-color));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-bottom: 10px;
letter-spacing: -1px;
}
.subtitle {
font-size: 18px;
color: var(--text-secondary);
}
.main-content {
flex: 1;
display: flex;
flex-direction: column;
gap: 25px;
}
/* Pain Points Section */
.section-title {
font-size: 20px;
font-weight: 600;
margin-bottom: 15px;
display: flex;
align-items: center;
gap: 10px;
}
.section-title::before {
content: '';
width: 4px;
height: 20px;
background: var(--go-color);
border-radius: 2px;
}
.comparison-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 15px;
}
.code-card {
background: var(--bg-card);
border-radius: 8px;
padding: 15px;
border: 1px solid var(--border-color);
position: relative;
overflow: hidden;
}
.code-card.nestjs { border-top: 3px solid var(--nestjs-color); }
.code-card.go { border-top: 3px solid var(--go-color); }
.label {
font-size: 12px;
font-weight: 700;
text-transform: uppercase;
margin-bottom: 8px;
display: inline-block;
padding: 2px 6px;
border-radius: 4px;
}
.label.nestjs { background: rgba(224, 35, 78, 0.2); color: var(--nestjs-color); }
.label.go { background: rgba(0, 173, 216, 0.2); color: var(--go-color); }
pre {
font-family: 'JetBrains Mono', monospace;
font-size: 11px;
line-height: 1.4;
color: #a5d6ff;
white-space: pre-wrap;
word-wrap: break-word;
}
.keyword { color: #ff7b72; }
.function { color: #d2a8ff; }
.string { color: #a5d6ff; }
.comment { color: #8b949e; font-style: italic; }
.decorator { color: #ffa657; }
.pain-point-desc {
font-size: 13px;
color: var(--text-secondary);
margin-top: 8px;
text-align: center;
font-style: italic;
}
/* Sponge Section */
.sponge-section {
background: rgba(249, 168, 37, 0.05);
border: 1px solid rgba(249, 168, 37, 0.3);
border-radius: 12px;
padding: 20px;
}
.sponge-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
}
.sponge-title {
color: var(--sponge-color);
font-size: 22px;
font-weight: 700;
}
.feature-list {
display: flex;
gap: 15px;
}
.feature-item {
flex: 1;
background: var(--bg-card);
padding: 12px;
border-radius: 6px;
text-align: center;
}
.feature-icon {
font-size: 24px;
margin-bottom: 5px;
display: block;
}
.feature-name {
font-weight: 600;
font-size: 14px;
margin-bottom: 4px;
color: var(--text-primary);
}
.feature-desc {
font-size: 11px;
color: var(--text-secondary);
}
/* Table Section */
.mapping-table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
background: var(--bg-card);
border-radius: 8px;
overflow: hidden;
}
.mapping-table th {
background: var(--bg-dark);
padding: 10px;
text-align: left;
border-bottom: 1px solid var(--border-color);
}
.mapping-table td {
padding: 10px;
border-bottom: 1px solid var(--border-color);
}
.mapping-table tr:last-child td { border-bottom: none; }
.footer {
margin-top: auto;
text-align: center;
padding-top: 20px;
border-top: 1px solid var(--border-color);
color: var(--text-secondary);
font-size: 12px;
}
.ui-preview {
width: 100%;
height: 120px;
object-fit: cover;
border-radius: 6px;
margin-bottom: 10px;
border: 1px solid var(--border-color);
opacity: 0.8;
}
</style>
</head>
<body>
<header>
<h1>NestJS 转 Go 的阵痛与救赎</h1>
<div class="subtitle">从“德芙般丝滑”到“徒手搬砖”,Sponge 助你平滑着陆</div>
</header>
<div class="main-content">
<!-- Pain Point 1: CLI -->
<div class="section-block">
<div class="section-title">痛点 1:CLI 依赖戒断反应</div>
<div class="comparison-grid">
<div class="code-card nestjs">
<span class="label nestjs">NestJS CLI</span>
<pre><span class="keyword">nest</span> g module users
<span class="keyword">nest</span> g controller users
<span class="comment"># 优雅永不过时</span></pre>
</div>
<div class="code-card go">
<span class="label go">原生 Go</span>
<pre>mkdir -p cmd internal
touch main.go
touch handler.go...
<span class="comment"># 开始思考人生</span></pre>
</div>
</div>
<div class="pain-point-desc">😭 暴击值:⭐⭐⭐⭐⭐ | 每个 Go 萌新都会怀念 CLI</div>
</div>
<!-- Pain Point 2: DI -->
<div class="section-block">
<div class="section-title">痛点 2:依赖注入变成“手工耿”</div>
<div class="comparison-grid">
<div class="code-card nestjs">
<span class="label nestjs">NestJS 装饰器</span>
<pre><span class="decorator">@Injectable</span>()
<span class="keyword">export class</span> <span class="function">UserService</span> {
<span class="keyword">constructor</span>(<span class="decorator">@InjectRepo</span>() repo) {}
}</pre>
</div>
<div class="code-card go">
<span class="label go">Go 手动拼装</span>
<pre><span class="keyword">func</span> <span class="function">NewService</span>(r *Repo) *Svc {
<span class="keyword">return</span> &Svc{repo: r}
}
<span class="comment">// main.go 里手动组装乐高</span></pre>
</div>
</div>
<div class="pain-point-desc">🤯 暴击值:⭐⭐⭐⭐ | main 函数像在玩《胡闹厨房》</div>
</div>
<!-- Solution: Sponge -->
<div class="sponge-section">
<div class="sponge-header">
<span class="sponge-title">🚀 Sponge 框架:你的 Go 语言导航仪</span>
</div>
<img src="https://pic1.zhimg.com/v2-321ccd6f6f7d005d0315fb2a4714096e_r.jpg" alt="Sponge UI" class="ui-preview">
<div class="feature-list">
<div class="feature-item">
<span class="feature-icon">⚡️</span>
<div class="feature-name">代码生成器</div>
<div class="feature-desc">Web UI 一键生成<br>比 nest g 更强</div>
</div>
<div class="feature-item">
<span class="feature-icon">🧩</span>
<div class="feature-name">模块化设计</div>
<div class="feature-desc">像乐高一样清晰<br>告别手动组装</div>
</div>
<div class="feature-item">
<span class="feature-icon">🛠️</span>
<div class="feature-name">企业级组件</div>
<div class="feature-desc">gRPC/ORM/监控<br>全家桶开箱即用</div>
</div>
</div>
</div>
<!-- Comparison Table -->
<div class="section-block">
<div class="section-title">功能映射:无缝切换</div>
<table class="mapping-table">
<thead>
<tr>
<th style="color: var(--nestjs-color)">NestJS 的幸福</th>
<th style="color: var(--sponge-color)">Sponge 的体验</th>
</tr>
</thead>
<tbody>
<tr>
<td>nest g 一键生成</td>
<td>Web UI 可视化生成</td>
</tr>
<tr>
<td>装饰器式模块组织</td>
<td>模块化目录 + Protobuf</td>
</tr>
<tr>
<td>TypeORM 集成</td>
<td>GORM 自动生成 DAO</td>
</tr>
<tr>
<td>微服务集成支持</td>
<td>原生 gRPC + 服务发现</td>
</tr>
</tbody>
</table>
</div>
</div>
<footer>
<p>用 Sponge 补足工程化短板,NestJS 老司机照样能在 Go 赛道飙车!</p>
</footer>
</body>
</html>
登录后可参与表态
讨论回复
0 条回复还没有人回复,快来发表你的看法吧!