走暗路,耕瘦田,进窄门
独立开发实践

[全栈开发实战] 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)——比如按钮、文本、图像等小单元。

  • 什么是“组件”?

    1. 它是“UI 构建块”

    2. 它是“可重用的”。React 允许你将标记 (HTML)、CSS 和 JavaScript 组合成自定义组件,比如一个 Profile 组件或 Button 组件,然后在整个应用中复用它们。

    3. 它是一个 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 代码。


系列文章 · 3 / 3
查看完整系列 ↓
  1. 1. 独立开发者的全栈开发实战 - 系列导读
  2. 2. 独立开发全栈系列 - 学习资源导航
  3. 3. [全栈开发实战] 1.1:从JS到Next.js,我们到底在用什么?