目录

为什么要学JavaScript后端生态?

最近在规划自己的技术发展路线,目标很明确:成为能独立开发完整项目的全栈工程师。

作为Java开发者,我给自己定的学习路径是:TypeScript/JavaScript生态 → Golang。为什么这么规划,记录一下我的想法。

选择TypeScript的理由

其实一开始纠结过,如果只是想要轻量级后端,Go应该是更好的选择。但仔细想想:

  1. 学一次用两次:TypeScript既能写前端(React/Vue),又能写后端(Node.js/Bun/Deno)。对于想成为全栈的我来说,性价比最高。

  2. 服务器资源限制:手头只有几台1核1G的轻量服务器,想部署一些IO密集型服务。Java的JVM启动就要几百兆内存,这个配置显然有些吃紧。查了下资料,Node.js的事件循环模型很适合IO密集型场景,内存占用也小很多。

  3. 语言学习成本:翻了下TypeScript的文档,发现语法和Java挺像的。类、接口、泛型这些概念都有,应该能比较快上手。

  4. 想读懂开源代码:平时用的很多工具都是TypeScript写的,比如VS Code、Obsidian这些。一直想看看它们是怎么实现的,学了TypeScript就能看懂了。

  5. 框架选择灵活:JavaScript生态有很多框架可选,从极简的Express到全栈的Nuxt,还有新的运行时如Bun、Deno等,可以根据项目需求选择合适的工具。

Go的学习计划放在下一步,等我先搞定全栈开发,再去深入高性能后端。

Node.js框架调研

开始学习前,我花了不少时间调研Node.js的各种框架。作为Java开发者,习惯了Spring Boot一统江湖,Node.js生态的选择之多让我有点懵。

我的调研方法

先在GitHub、Reddit、知乎上看大家的讨论,然后去官网看文档,最后写个简单的demo感受一下。主要关注这几点:

  • 学习曲线如何?
  • 有没有类似Spring的分层架构?
  • TypeScript支持怎么样?
  • 社区活跃度和生态如何?

Express - 最流行但最简单

GitHub Star: 65k+ 第一印象: 太简洁了,简洁到让我不知所措

看了官方示例:

const express = require('express')
const app = express()

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(3000)

就这?Controller在哪?Service层呢?依赖注入呢?

继续看文档发现,Express就是提供最基础的功能,剩下的全靠自己组织或者装插件。对习惯了Spring Boot约定大于配置的我来说,这种自由度反而成了负担。

优点

  • 资料最多,遇到问题容易找到答案
  • 插件生态丰富
  • 上手简单

缺点

  • 太过灵活,没有标准项目结构
  • 大型项目需要自己设计架构
  • 原生不支持TypeScript

我的想法:可能适合写小工具或API,但如果要做复杂项目,得自己搭建一套架构,学习成本反而高了。

Fastify - 号称更快的Express

GitHub Star: 31k+ 第一印象: 性能优先,有些有趣的设计

据说Fastify的设计理念有点像Java的Netty框架,都是追求高性能。不过就像Java开发大多还是用Spring Boot一样,Node.js开发者也不一定非要追求极致性能。

看到Fastify的Schema验证,有点像Java的Bean Validation:

const schema = {
  body: {
    type: 'object',
    required: ['name'],
    properties: {
      name: { type: 'string' },
      age: { type: 'number' }
    }
  }
}

fastify.post('/user', { schema }, handler)

性能测试数据看起来确实比Express好不少。但社区相对较小,遇到问题可能不太好解决。

优点

  • 性能好
  • 内置Schema验证
  • 插件系统设计不错

缺点

  • 社区比Express小
  • 学习资料相对较少
  • 还是没有解决架构问题

我的想法:对于追求性能的轻量级API服务,Fastify是不错的选择。

Koa - Express的精神继承者

GitHub Star: 34k+ 第一印象: Express原班人马打造,更现代但生态断层

Koa由Express原作者TJ Holowaychuk创建,可以理解为Express 2.0的精神续作。最大特点是洋葱模型中间件:

// Koa的洋葱模型
app.use(async (ctx, next) => {
  console.log('>>> 进入中间件');
  await next(); // 执行下一个
  console.log('<<< 离开中间件');
});

优点

  • 更轻量(仅600KB)
  • 异步流程控制更优雅
  • 没有内置中间件,更灵活

缺点

  • 生态断层严重(Express中间件不兼容)
  • 需要自己处理很多基础功能
  • 代理支持较弱

我的想法:Koa的改进不足以弥补生态差距。对于AI中转服务,需要成熟的代理中间件,Koa在这方面支持不足。

Hono - 新一代Edge框架

GitHub Star: 18k+(增长极快) 第一印象: 为Edge时代而生,一次编写到处运行

Hono是专为Edge Runtime设计的Web框架,最大亮点是可以在任何JavaScript运行时上运行:

import { Hono } from 'hono'

const app = new Hono()

app.post('/v1/chat', async (c) => {
  // 极简的代理实现
  const response = await fetch('https://api.openai.com/v1/chat', {
    headers: { 'Authorization': `Bearer ${c.env.API_KEY}` },
    body: JSON.stringify(await c.req.json()),
  })
  return c.body(response.body) // 原生支持流式响应
})

// 部署到任何地方
export default app              // Cloudflare Workers
export default app.fetch        // Bun
export default serve(app.fetch) // Deno

优点

  • 多运行时支持(Node.js/Bun/Deno/Cloudflare)
  • 性能极致(Bun环境下可达80k req/s)
  • TypeScript原生支持
  • 体积极小,冷启动快

缺点

  • 生态较新,中间件不多
  • 文档相对较少
  • 社区还在成长中

我的想法:Hono代表了框架的未来方向。对于AI中转服务,它的流式响应支持和极致性能非常吸引人。最终我选择了它。

NestJS - Spring Boot即视感

GitHub Star: 66k+ 第一印象: 这不就是Node.js版的Spring Boot吗!

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

  @Get()
  @UseGuards(AuthGuard)
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }

  @Post()
  @UsePipes(ValidationPipe)
  async create(@Body() createCatDto: CreateCatDto) {
    return this.catsService.create(createCatDto);
  }
}

装饰器就是注解,依赖注入、Guards(拦截器)、Pipes(管道)、模块化…所有Spring的概念都能找到对应的。

项目结构也很熟悉:

src/
  cats/
    dto/
    entities/
    cats.controller.ts
    cats.service.ts
    cats.module.ts
  common/
    filters/
    guards/
    pipes/

优点

  • 对Java开发者友好,概念相似
  • 强制的项目结构,适合团队协作
  • 完善的企业级功能(微服务、GraphQL、WebSocket等)
  • TypeScript原生支持

缺点

  • 框架本身比较重,不适合轻量级项目
  • 对于简单的API服务来说过度设计
  • 启动时间和内存占用都比Express/Fastify高

我的想法:虽然概念熟悉,但对于我想做的AI中转服务这类轻量级项目来说,NestJS可能太重了。更适合复杂的企业级应用。

Next.js/Nuxt - 全栈框架

这是我之前完全没接触过的概念 - 全栈框架。前后端代码在一个项目里,还能自动处理SSR(服务端渲染)、路由等。

Next.js 是React生态的全栈框架,既然我已经选择了Vue,就不深入了解了。

Nuxt (Vue生态):

<!-- pages/index.vue -->
<template>
  <div>{{ data.name }}</div>
</template>

<script setup>
// 可以在服务端获取数据
const { data } = await useFetch('/api/hello')
</script>
// server/api/hello.ts - 后端API
export default defineEventHandler((event) => {
  return { name: 'John Doe' }
})

优点

  • 前后端类型自动共享
  • 部署方便(Vercel一键部署)
  • SEO友好
  • 开发体验好

缺点

  • 需要先学会React或Vue
  • 某些场景下可能不够灵活
  • 后端功能相对简单

我的想法:这种开发模式很新颖,特别适合快速开发。对于AI中转服务这类需要管理界面的项目,Nuxt可以快速搭建前后端一体的应用。

Monorepo架构 - 前后端代码共享

在研究AI中转服务项目时,我发现了一个很有意思的架构模式:Monorepo(单一代码仓库)。

这种架构可以让前后端共享类型定义、工具函数、常量等,避免重复代码。特别适合全栈项目:

ai-relay-gateway/
├── apps/
│   ├── api/          # 后端服务 (Fastify)
│   └── admin/        # 管理界面 (Vue)
├── packages/
│   └── shared/       # 共享代码包
│       ├── types/    # TypeScript类型定义
│       ├── schemas/  # 数据校验模式
│       └── utils/    # 工具函数
└── package.json      # pnpm workspace配置

使用pnpm workspace管理依赖,前后端可以直接引用共享包:

// 后端和前端都可以使用相同的类型
import { User, ApiResponse } from '@ai-gateway/shared'

优点

  • 类型定义只需要写一次
  • 保证前后端数据结构一致性
  • 便于维护和重构
  • 适合全栈开发者

Bun - JavaScript运行时的革命

在调研框架的过程中,我发现了Bun - 一个野心勃勃的JavaScript运行时,目标是替代Node.js。

什么是Bun?

Bun不是框架,而是像Node.js一样的运行时环境。但它用Zig语言重写,性能提升惊人:

# 包安装速度对比(安装一个中型项目)
npm install      # 30秒
yarn install     # 20秒
pnpm install     # 15秒
bun install      # 2秒!快15倍

# 启动速度对比
node server.js   # ~100ms
bun run server.js # ~10ms

Bun的革命性特性

1. 内置一切

// 不需要安装任何依赖
import { serve } from "bun"      // 内置HTTP服务器
import { $ } from "bun"          // 内置Shell
import { Database } from "bun:sqlite" // 内置SQLite

// 直接运行TypeScript,无需编译
bun run index.ts

2. 原生TypeScript支持

// 直接运行,无需tsconfig.json
interface User {
  name: string
  age: number
}

Bun.serve({
  port: 3000,
  fetch(req) {
    return new Response("Hello from TypeScript!")
  }
})

Bun + Hono性能数据

根据社区的benchmark数据,不同组合的性能表现如下:

运行时 + 框架 吞吐量 内存占用 P99延迟
Node + Express 15k req/s 80MB 10ms
Node + Fastify 30k req/s 60MB 5ms
Node + Hono 25k req/s 50MB 6ms
Bun + Hono 80k req/s 30MB 2ms

Bun的现实考虑

优点

  • 性能提升5-10倍
  • 开发体验极佳(快速启动、内置工具)
  • 兼容大部分npm包

风险

  • 1.0版本刚发布(2023年9月)
  • 生态兼容性不是100%
  • 生产环境案例较少

我的想法:Bun代表着JavaScript运行时的一个新方向。虽然现在还不够成熟,但对于新项目,特别是追求性能的API服务,值得尝试。考虑在AI中转服务中使用Bun + Hono的组合。

框架全面对比

经过深入调研,我整理了这个对比表:

维度 Express Fastify Koa Hono NestJS
成熟度 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐
生态系统 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐
性能 ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐
TypeScript ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
学习曲线 简单 简单 中等 简单 陡峭
流式响应 ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐
内存占用 80MB 60MB 70MB 30-50MB 200MB
适合场景 传统API 高性能API - Edge/现代化 企业应用

我的最终选择

经过深入的调研和对比,我的选择逻辑很清晰:

我的框架选择思考

其实最后我主要在HonoNuxt之间纠结:

  • Nuxt(全栈一体):如果追求开发效率,Nuxt作为全栈框架,前后端一体化开发肯定更方便快捷
  • Hono(前后分离):如果要做前后端分离架构,Hono的灵活性和性能更适合我

但考虑到学习成本,如果两者开发速度差距不是特别大,我更倾向于Hono + Bun + Monorepo的组合。毕竟精力有限,不想学太多框架,一个组合如果能覆盖大部分场景就够了。

至于其他框架,我的想法是:

  • Express/Fastify/Koa虽然成熟,但没有特别吸引我的点
  • NestJS太重了,如果需要这么强大的后端能力,我宁愿直接用Java或Golang
  • 毕竟作为Java开发者,复杂的后端业务用回Java或学习Go会更合适

性能场景的细分

关于性能需求,我会这样区分:

IO密集型

  • 个人项目/开源项目:JavaScript生态(Hono/Nuxt)
  • 企业级要求:Golang或Java(成熟稳定)

CPU密集型

  • 直接选Java,这是Java的强项
  • JavaScript生态不适合CPU密集场景

使用场景定位

JavaScript生态(Hono/Nuxt)的定位

  • ✅ 个人项目
  • ✅ 开源项目
  • ✅ 公司内部工具
  • ❌ 对外的企业级服务(会选Java/Go)

运行时的选择

关于Bun vs Node.js:

  • 理想情况:如果没有学习成本,我肯定选择Bun,性能提升太明显了
  • 现实考虑:但考虑到生态兼容性和稳定性,可能会先用Node.js,等Bun更成熟后再迁移

最终技术栈

根据不同场景,我会这样选择:

场景一:快速开发全栈应用

  • Nuxt + Node.js
  • 适合需要快速上线的项目

场景二:追求性能的API服务

  • Hono + Bun + Monorepo
  • 适合AI中转服务这类性能敏感的项目

场景三:生产环境稳定优先

  • Hono + Node.js
  • 等Bun更成熟后再考虑迁移

学习计划调整

第一阶段:Hono + Bun

  • 学习Hono框架基础
  • 尝试Bun运行时
  • 搭建AI中转服务基础架构
  • 实现流式响应代理

第二阶段:Monorepo架构

  • 使用pnpm workspace
  • 前后端共享类型定义
  • Vue 3管理界面开发

第三阶段:Edge部署

  • 尝试部署到Cloudflare Workers
  • 对比传统部署和Edge部署
  • 优化冷启动和性能

资源消耗对比

做了个简单的对比测试(数据来自网上的benchmark和文档):

Spring Boot (Java):
- 内存占用:300-500MB起步
- 启动时间:10-30秒
- 1核1G服务器:最多跑1-2个应用

Node.js (Express/Fastify):
- 内存占用:30-80MB
- 启动时间:<1秒
- 1核1G服务器:可以跑5-10个应用

Node.js (NestJS):
- 内存占用:50-150MB
- 启动时间:2-5秒
- 1核1G服务器:可以跑3-5个应用

对于手头资源有限的我来说,这个差距还是很明显的。

学习资源整理

官方文档

推荐的教程

  • 「深入浅出Node.js」这本书不错
  • YouTube上的Traversy Media频道
  • freeCodeCamp的Node.js教程
  • Hono官方文档(写得非常清晰)
  • Bun官方文档(快速入门)

社区

  • Reddit的r/node
  • Stack Overflow的nodejs标签
  • 各框架的Discord服务器

下一步计划

  1. 安装和学习Bun运行时
  2. 用Hono + TypeScript搭建AI中转服务
  3. 实现Monorepo架构,前后端代码共享
  4. 开发Vue 3管理界面
  5. 尝试部署到Cloudflare Workers
  6. 对比不同部署方式的性能和成本

写在最后

经过这次深入调研,我对JavaScript生态有了更全面的认识。从Express的成熟稳定,到Hono的极致性能,再到Bun的革命性创新,每个技术都有其价值和适用场景。

我的技术选型原则很清晰:

  • JavaScript生态用于个人项目和内部工具
  • 企业级服务用Java或Go
  • CPU密集型坚持用Java
  • 框架选择倾向于Hono,一套组合解决多数问题

这样的技术边界让我能专注于擅长的领域,同时用JavaScript生态快速实现一些轻量级需求。

如果你也在考虑JavaScript生态的框架选择:

  • 求稳选Express:成熟、资料多、问题好解决
  • 追求性能选Fastify或Hono:Fastify生态更好,Hono更面向未来
  • 全栈开发选Nuxt/Next.js:开发效率高,适合快速原型
  • 企业级应用选NestJS:完备的架构,适合大团队(或直接用Java/Go)

PS: 如果文中有理解错误的地方,欢迎指正。