4 minutes
Java开发者学习JavaScript生态:Node.js框架选型与新运行时探索
目录
- 为什么要学JavaScript后端生态?
- Node.js框架调研
- Monorepo架构 - 前后端代码共享
- Bun - JavaScript运行时的革命
- 框架全面对比
- 我的最终选择
- 资源消耗对比
- 学习资源整理
- 下一步计划
- 写在最后
为什么要学JavaScript后端生态?
最近在规划自己的技术发展路线,目标很明确:成为能独立开发完整项目的全栈工程师。
作为Java开发者,我给自己定的学习路径是:TypeScript/JavaScript生态 → Golang。为什么这么规划,记录一下我的想法。
选择TypeScript的理由
其实一开始纠结过,如果只是想要轻量级后端,Go应该是更好的选择。但仔细想想:
-
学一次用两次:TypeScript既能写前端(React/Vue),又能写后端(Node.js/Bun/Deno)。对于想成为全栈的我来说,性价比最高。
-
服务器资源限制:手头只有几台1核1G的轻量服务器,想部署一些IO密集型服务。Java的JVM启动就要几百兆内存,这个配置显然有些吃紧。查了下资料,Node.js的事件循环模型很适合IO密集型场景,内存占用也小很多。
-
语言学习成本:翻了下TypeScript的文档,发现语法和Java挺像的。类、接口、泛型这些概念都有,应该能比较快上手。
-
想读懂开源代码:平时用的很多工具都是TypeScript写的,比如VS Code、Obsidian这些。一直想看看它们是怎么实现的,学了TypeScript就能看懂了。
-
框架选择灵活: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/现代化 | 企业应用 |
我的最终选择
经过深入的调研和对比,我的选择逻辑很清晰:
我的框架选择思考
其实最后我主要在Hono和Nuxt之间纠结:
- 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个应用
对于手头资源有限的我来说,这个差距还是很明显的。
学习资源整理
官方文档
- NestJS: https://nestjs.com/ (文档写得很好)
- Express: https://expressjs.com/
- Next.js: https://nextjs.org/
- Nuxt: https://nuxt.com/
推荐的教程
- 「深入浅出Node.js」这本书不错
- YouTube上的Traversy Media频道
- freeCodeCamp的Node.js教程
- Hono官方文档(写得非常清晰)
- Bun官方文档(快速入门)
社区
- Reddit的r/node
- Stack Overflow的nodejs标签
- 各框架的Discord服务器
下一步计划
- 安装和学习Bun运行时
- 用Hono + TypeScript搭建AI中转服务
- 实现Monorepo架构,前后端代码共享
- 开发Vue 3管理界面
- 尝试部署到Cloudflare Workers
- 对比不同部署方式的性能和成本
写在最后
经过这次深入调研,我对JavaScript生态有了更全面的认识。从Express的成熟稳定,到Hono的极致性能,再到Bun的革命性创新,每个技术都有其价值和适用场景。
我的技术选型原则很清晰:
- JavaScript生态用于个人项目和内部工具
- 企业级服务用Java或Go
- CPU密集型坚持用Java
- 框架选择倾向于Hono,一套组合解决多数问题
这样的技术边界让我能专注于擅长的领域,同时用JavaScript生态快速实现一些轻量级需求。
如果你也在考虑JavaScript生态的框架选择:
- 求稳选Express:成熟、资料多、问题好解决
- 追求性能选Fastify或Hono:Fastify生态更好,Hono更面向未来
- 全栈开发选Nuxt/Next.js:开发效率高,适合快速原型
- 企业级应用选NestJS:完备的架构,适合大团队(或直接用Java/Go)
PS: 如果文中有理解错误的地方,欢迎指正。