[全栈开发实战] 1.1:从JS到Next.js,我们到底在用什么?
2025年11月5日 · 2066 字
这是《独立开发者的全栈开发实战》系列的开篇。
正如系列导读 中所说,我的目标是和大家(特别是后端开发者)一起,跑通“独立开发 + SEO”的路径,成为“会开发、懂增长的超级个体”。
我选择了 Next.js + Tailwind CSS + Shadcn/ui + Supabase 作为我们的核心技术栈。
在正式开始“怎么做”之前,我们必须先花一篇文章的时间,彻底搞清楚“是什么”和“为什么”。我们要厘清我们即将使用的这套工具——JavaScript, TypeScript, Node.js, React, Next.js——它们究竟是什么,以及它们之间犬牙交错的“前因后果”。
对于追求“系统构建”的我们来说,打好这个地基,至关重要。
我们的全栈版图:一个层层递进的演进
1. 地基:JavaScript (JS)
- 它是什么? 一切的核心,一门编程语言。
- 最初的“因”: 它最初是专门为浏览器“而生”的,用来给静态的网页添加“交互”能力(比如点击按钮、表单验证等)。
- 它的“果”(局限): 在很长的一段时间里,JavaScript 只能被禁锢在浏览器这个“沙盒”里面,无法触及浏览器之外的操作系统。
2. 第一次拓展:Node.js
- 它是什么? 一个让 JavaScript “走出”浏览器的“运行时环境”(Runtime Environment)。也即,JavaScript逃出了浏览器的禁锢,可以在浏览器之外的环境中奔跑了。
- 出现的“因”: 开发者们开始想:“既然 JS 这么好用,我能不能用它来写后端(服务器)程序呢,这样就能使用一套编程语言完成整体应用的开发,岂不大大节省了学习和维护成本?”
- 它的“果”(革命): 2009年,Node.js 诞生了。它把 Chrome浏览器 的 V8 引擎(JS 的核心解释器)“抠”了出来,让 JS 可以在服务器上运行。
- 关键意义: 从此,JS 获得了操作文件(
fs)、搭建服务器(http)的能力等以前只有后端服务器语言才具备的能力。这是“全栈JavaScript”的真正基石。我们选择的 Next.js,其服务器端能力,就是运行在 Node.js 环境中的。
3. 深入地基:Node.js “后面”是什么?
作为后端开发者,我们习惯于刨根问底。当我们说“Node.js 是一个运行时环境”时,这到底意味着什么?
一个“运行时环境”就像一个“房子”,它为我们的代码(住户)提供了生存所需的一切(水电、家具)。Node.js 这个“房子”主要由两大核心组件搭建:
1) V8 引擎 (大脑)
- 这是什么? Chrome V8 引擎,Node.js 的“大脑”,专门负责执行我们的 JS 代码。它为我们的 JS 代码提供了执行环境。我们写的 JS 语法,本质上是在面向 V8 所支持的 ECMAScript 规范。V8 的职责就是高效实现这些规范,并将其变为可执行的机器码。
- 它如何工作?(JIT 编译)
- V8 非常智能,它使用一种叫做 JIT (Just-In-Time,即时编译) 的技术。
- 解释执行 (Ignition): V8 的解释器会先快速把 JS 转为中间“字节码”并执行,保证启动速度。
- 编译优化 (TurboFan): V8 会在运行时“观察”代码,一旦发现某些函数被频繁调用(变“热”了),它的优化编译器就会介入,把这段“热代码”直接编译成高度优化的、针对当前 CPU 的机器码(0和1)。
- 结果: 下次再调用时,V8 会直接运行这个超快的机器码。
2) libuv (手脚)
- 这是什么? 一个用 C 语言编写的库,Node.js 的“手和脚”。
- 为什么需要它? V8 只懂 JS,它不懂如何“读文件”、“写网络”或“设定时钟”。这些“脏活累活”(I/O 操作)是操作系统(OS)干的。
- 它如何工作?(异步非阻塞 I/O)
- 当我们调用
fs.readFile()(读文件)时,V8 会把任务交给 libuv。 - libuv 会向操作系统发出指令:“OS,帮我读这个文件,你慢慢读,读完了告诉我。”
- 然后 V8 和 libuv 就不会傻等,而是继续干别的活(这就是“非阻塞”)。
- 当 OS 读完文件后,libuv 收到通知,把我们的“回调函数”放进“事件循环”,V8 最终会执行它。
- 当我们调用
小结: V8 (由C++语言实现) 负责 JIT 编译和执行 JS;libuv (由C语言实现) 负责异步 I/O 和事件循环。它们共同构成了 Node.js 的核心。
4. 强化:TypeScript (TS)
- 它是什么? 它是 JS 的一个“超集”(Superset),一个静态类型检查器。
- 出现的“因”: JS 是一门“弱类型”语言,非常灵活,但也导致在大型项目中,你“以为”一个变量是数字,传来传去它可能就变成了字符串,导致各种隐藏 Bug。
- 它的“果”: TS 允许我们在写代码时就定义好“类型”(比如
let name: string = "无川"),在代码运行前(静态)就帮我们检查错误。这让大型项目更健壮、更易维护。 - 注意: TS 代码最终还是会编译成 JS 代码来运行。
5. UI层:React (我们的“UI积木”)
-
它是什么? 一个用于渲染用户界面 (UI) 的 JavaScript 库。
-
核心思想:“积木思维”。React 认为,从网站到手机应用,屏幕上的所有内容,都可以分解为一个个“组件” (Components)——比如按钮、文本、图像等小单元。
-
什么是“组件”?
-
它是“UI 构建块”。
-
它是“可重用的”。React 允许你将标记 (HTML)、CSS 和 JavaScript 组合成自定义组件,比如一个
Profile组件或Button组件,然后在整个应用中复用它们。 -
它是一个 JS 函数。从技术上讲,一个 React 组件就是一个 JavaScript 函数,你可以在这个函数中添加“标记” (Markup)。如下面代码所示,
Profile函数返回了一个<img>标记。
// App.js export default function Profile() { return ( <img src="https://i.imgur.com/MK3eW3Am.jpg" alt="Katherine Johnson" /> ) } -
-
出现的“因”: 随着网页越来越复杂,用原生的 JS 和 HTML 来操作 DOM(网页的骨架)变得极其繁琐和低效。
-
它的“果”: React 的“组件化”思想,让我们能像“搭积木”一样,把这些可重用、可嵌套的组件组合起来,构建出复杂的用户界面。
-
局限: React 只关心 UI。它是一个“库”,不是“框架”。它不管你怎么做路由、怎么获取数据、怎么做 SEO。
6. 终点:Next.js (全栈框架)
- 它是什么? 一个基于 React 的“全栈框架” (Framework)。
- 出现的“因”: 既然 React 只管 UI(局限),那开发者想做一个完整的、高性能的应用,就必须自己东拼西凑:找路由库、找 SSR(服务器端渲染)方案、想办法做 SEO。这太麻烦了!
- 它的“果”: Next.js 出现了。它以 React 为核心,并提供了一整套的“超级解决方案”来弥补 React 的局限:
- 路由: 基于文件系统的路由(你创建文件/文件夹,路由就自动生成了)。
- 渲染: 内置服务器端渲染 (SSR) 和静态站点生成 (SSG),这对性能和 SEO 至关重要。
- 全栈能力: 允许你创建 API 路由(比如
/api/user),让你可以直接在 Next.js 项目里写后端逻辑,无需单独再开一个 Node.js 服务器。 - 新特性: 比如 App Router 和 React 服务器组件,进一步提升了开发体验和性能。
总结:我们的全栈脉络
现在,我们终于可以一句话厘清它们的关系了:
我们选择的 Next.js 是一个全栈框架,它使用 React 这个库来构建用户界面;而 React 本身是使用 JavaScript(或者更健壮的 TypeScript)编写的;最后,这一切的服务器端能力(如 SSR、API 路由)得以实现,是依赖于 Node.js 这个运行时环境(它由 V8 和 libuv 驱动)。
搞清楚了“是什么”和“为什么”,我们内心的“秩序”就建立起来了。
从下一篇开始,我们将正式进入“怎么做”。我们将动手搭建环境,写下第一行 React 和 Next.js 代码。
查看完整系列 ↓
- 1. 独立开发者的全栈开发实战 - 系列导读
- 2. 独立开发全栈系列 - 学习资源导航
- 3. [全栈开发实战] 1.1:从JS到Next.js,我们到底在用什么?