第01期 | Node.js是什么?JavaScript的另一半世界
🎯 学习目标
- 理解Node.js到底是什么,它和浏览器里的JavaScript有什么本质区别
- 了解Node.js的诞生背景、发展历程和2026年的行业地位
- 掌握Node.js的核心应用场景,知道它能做什么、不能做什么
- 写出你的第一个Node.js程序,理解"JavaScript跑在服务器上"意味着什么
- 建立"前端→全栈"的技术认知,为后续49期学习打下思维基础
📖 核心知识
一、一个灵魂拷问:JavaScript只能在浏览器里跑吗?
如果你之前做过前端开发,你对JavaScript的认知大概率是这样的:
- 写HTML页面,加
<script>标签引入JS - 操作DOM,让网页动起来
- 发AJAX请求,和后端要数据
- 用框架(React/Vue)写组件
在这个过程中,JavaScript是被浏览器"圈养"的。浏览器提供了一个沙箱环境,JS只能在这个沙箱里活动——它能操作网页,但不能直接读写你电脑硬盘上的文件,不能监听一个网络端口,更不能启动一个服务器。
Node.js做的事情,就是把JavaScript从浏览器的沙箱里放出来。
2009年,一个叫Ryan Dahl的程序员做了一个大胆的尝试:他把Google Chrome浏览器的V8 JavaScript引擎"抠"了出来,嫁接上了C++写的系统级API(文件操作、网络通信、进程管理),然后让JavaScript可以直接调用这些底层能力。
这个组合就是Node.js。
用一句话总结:
Node.js = V8引擎 + 系统级API(C++绑定) + 事件循环
V8引擎负责解析和执行JavaScript代码,系统级API让JS拥有操作系统级别的权限,事件循环让Node.js可以用单线程处理高并发。
二、浏览器JS vs Node.js:一张表看清本质区别
很多初学者会困惑:同样是JavaScript,为什么在浏览器和Node.js里差别这么大?核心原因是运行环境不同,提供的API不同。
| 维度 | 浏览器中的JavaScript | Node.js中的JavaScript |
|---|---|---|
| 运行环境 | 浏览器(Chrome/Firefox/Safari) | 操作系统(直接跑在服务器/电脑上) |
| 全局对象 | window/document | global/process |
| DOM操作 | ✅ 可以操作网页元素 | ❌ 没有DOM,没有网页概念 |
| 文件系统 | ❌ 不能读写本地文件 | ✅ 可以读写、监听、删除文件 |
| 网络服务 | ❌ 只能发请求,不能监听端口 | ✅ 可以创建HTTP/TCP/UDP服务器 |
| 模块系统 | ES Modules(import/export) | CommonJS(require/module.exports)+ ESM |
| 操作系统交互 | ❌ 无权限 | ✅ 可以执行命令、管理进程、获取系统信息 |
| 多线程 | Web Workers(受限) | Worker Threads / Cluster |
| 定时器 | setTimeout/setInterval | 相同,但精度和机制有差异 |
| 网络请求 | fetch/XMLHttpRequest | http模块/axios/fetch(Node 18+) |
关键认知:JavaScript语言本身(语法、变量、函数、对象、原型链、Promise等)在浏览器和Node.js中是完全一样的。区别只在于运行环境给你提供了什么API。
举个代码例子,同样是"读取一个文件的内容":
浏览器里(受限于安全策略,只能通过用户选择文件):
// 浏览器中读取文件:必须用户主动选择constfileInput=document.createElement('input');fileInput.type='file';fileInput.onchange=(e)=>{constfile=e.target.files[0];constreader=newFileReader();reader.onload=(event)=>{console.log('文件内容:',event.target.result);};reader.readAsText(file);};fileInput.click();// 必须用户点击选择Node.js里(直接读取硬盘上的任意文件):
// Node.js中读取文件:直接指定路径constfs=require('fs');// 同步读取constcontent=fs.readFileSync('./hello.txt','utf-8');console.log('文件内容:',content);// 异步读取(推荐)fs.readFile('./hello.txt','utf-8',(err,data)=>{if(err)throwerr;console.log('文件内容:',data);});// Promise方式(更现代)constfsp=require('fs').promises;fsp.readFile('./hello.txt','utf-8').then(data=>console.log('文件内容:',data)).catch(err=>console.error('出错了:',err));在Node.js里,你不需要用户的许可,不需要弹窗选择文件,你直接告诉它路径,它就给你读。这就是"服务器端JavaScript"的权力。
三、Node.js的诞生背景:解决一个核心痛点
要真正理解Node.js为什么存在,我们需要回到2009年的技术背景。
当年的痛点:当一个用户在网页上操作(比如点击按钮、输入文字),前端需要把这个操作发给服务器处理。服务器收到请求后,可能需要查数据库、调用其他接口、做计算——这些操作都需要等待I/O(输入/输出)。
传统的服务器(如Apache + PHP)处理I/O的方式是:一个请求开一个线程。线程在等待数据库返回的时候是阻塞的——它什么都不干,但占着内存。如果同时有10000个用户访问,服务器就要开10000个线程,内存直接爆掉。
Ryan Dahl的洞察:I/O操作(读文件、查数据库、发网络请求)本质上是在"等"——等磁盘转、等网络传、等数据库查。在"等"的过程中,CPU其实是空闲的。与其让线程傻等,不如在等待的时候去处理别的请求。
这就是事件驱动、非阻塞I/O的核心思想:
传统模型(阻塞式): 请求A → 查数据库(等100ms)→ 返回A 请求B在排队等... 请求B → 查数据库(等100ms)→ 返回B Node.js模型(非阻塞): 请求A → 发起数据库查询 → 立刻去处理请求B 请求B → 发起数据库查询 → 立刻去处理请求C ↓ 数据库A查完了 处理A的结果 → 返回A ↓ 数据库B查完了 处理B的结果 → 返回BNode.js用单线程 + 事件循环实现了这个模型。单线程不会因为I/O等待而阻塞,事件循环负责在I/O完成后回调处理结果。这意味着Node.js可以用极少的内存处理大量的并发连接。
这就是Node.js最适合做I/O密集型应用的原因——API服务器、实时聊天、流媒体处理等场景,Node.js表现优异。
四、Node.js能做什么?不能做什么?
✅ Node.js擅长的场景
1. Web API服务器(最主流)
用Express/Koa/NestJS等框架开发RESTful API,这是Node.js最常见的用途。前端发请求,Node.js处理业务逻辑,查数据库,返回JSON。
前端App → HTTP请求 → Node.js服务器 → 数据库 ← JSON响应 ← ← 查询结果 ←2. 实时应用(WebSocket)
聊天室、在线协作、实时通知、股票行情推送——这些需要服务器主动向客户端推消息的场景,Node.js的事件驱动模型天然适合。
3. 服务端渲染(SSR)
Next.js/Nuxt.js等框架用Node.js在服务端渲染React/Vue组件,生成HTML返回给浏览器。解决首屏白屏和SEO问题。
4. 命令行工具(CLI)
Webpack、Vite、ESLint、TypeScript编译器——你日常用的前端工具,绝大多数都是用Node.js写的。你也可以写自己的CLI工具。
5. 桌面应用
Electron(VS Code、Discord、飞书)用Node.js + Chromium做桌面应用,JS既管界面又管系统调用。
6. 中间层/BFF(Backend for Frontend)
前端和后端之间加一层Node.js,做接口聚合、数据裁剪、协议转换。前端只和一个Node.js服务通信,不用对接多个后端微服务。
7. Serverless函数
云函数(AWS Lambda、腾讯云SCF、Vercel)大量使用Node.js。一个函数处理一个请求,按调用次数计费,天然适合事件驱动。
❌ Node.js不擅长的场景
1. CPU密集型计算
图片处理、视频转码、机器学习训练、大规模数据排序——这些需要大量CPU计算的任务,Node.js的单线程会成为瓶颈。一个计算任务卡住,整个Node.js进程都卡住。
解决方案:用Worker Threads开子线程,或用C++插件,或干脆用Python/Go/Rust处理。
2. 大型企业级复杂系统
虽然NestJS等框架在努力弥补,但Node.js在类型安全(虽然有TypeScript)、事务管理、领域建模等方面相比Java/Spring Boot仍有差距。银行核心系统、ERP等超大型系统通常不选Node.js。
3. 需要超高并发的计算服务
如果每个请求都需要大量CPU计算(如AI推理),Node.js的单线程模型反而不如多线程模型。不过这种场景通常用专门的计算服务。
五、2026年学Node.js的5个理由
理由1:前端→全栈的最短路径
你已经会JavaScript了,学Node.js不需要换语言。同样的语法、同样的ES6+特性、同样的Promise/async-await。从前端到全栈,Node.js是最低成本的路径。
理由2:岗位需求稳定增长
2026年,前端岗位的JD里"熟悉Node.js"已经是标配。很多公司(尤其中小厂和创业公司)的后端API就是Node.js写的。掌握Node.js,你的可选岗位直接翻倍。
理由3:AI时代的基础设施
大模型的API调用、Agent工具链、MCP协议——这些AI应用的底层很多都是Node.js。OpenAI SDK、LangChain.js、Vercel AI SDK都是JS生态的。学Node.js = 给自己打开AI应用开发的大门。
理由4:工具链的核心
不管你用什么框架,前端的构建工具(Vite/Webpack)、代码检查(ESLint)、测试(Jest)都跑在Node.js上。理解Node.js = 理解你的工具链,遇到问题能自己排查。
理由5:独立开发/副业的利器
想做一个全栈App?用Node.js写后端API,前端用React/Vue,数据库用MongoDB/PostgreSQL。一个人就能搞定前后端,不需要学Java/Go/Python另一门语言。
六、动手实战:你的第一个Node.js程序
别光看理论,我们来写代码。
步骤1:确认安装
打开终端(Windows用PowerShell/Git Bash,Mac用Terminal),输入:
node-v如果输出类似v22.12.0,说明Node.js已安装。如果提示找不到命令,去 nodejs.org 下载安装LTS版本。
npm-vnpm是Node.js的包管理器,随Node.js一起安装。输出类似10.9.0即可。
步骤2:创建项目
mkdirmy-first-node-appcdmy-first-node-appnpminit-ynpm init -y会生成一个默认的package.json文件,这是Node.js项目的配置文件。
步骤3:写第一个程序
创建index.js文件,写入:
// index.js - 你的第一个Node.js程序// 1. 最简单的:打印一句话console.log('Hello, Node.js! 🎉');// 2. 获取命令行参数constargs=process.argv.slice(2);console.log('你传入的参数:',args);// 3. 获取当前时间constnow=newDate();console.log('当前时间:',now.toLocaleString('zh-CN'));// 4. 获取系统信息console.log('操作系统:',process.platform);console.log('Node.js版本:',process.version);console.log('CPU架构:',process.arch);// 5. 环境变量console.log('PATH前50个字符:',process.env.PATH?.slice(0,50));// 6. 计时器console.time('计算耗时');letsum=0;for(leti=0;i<1000000;i++){sum+=i;}console.timeEnd('计算耗时');console.log('1到100万求和结果:',sum);步骤4:运行程序
nodeindex.js你会看到类似输出:
Hello, Node.js! 🎉 你传入的参数:[] 当前时间:2026/7/6 18:30:00 操作系统:win32 Node.js版本:v22.12.0 CPU架构:x64 PATH前50个字符:C:\Program Files\nodejs\; 计算耗时: 3.245ms 1到100万求和结果:499999500000也可以传参数运行:
nodeindex.js hello world输出会包含:你传入的参数:['hello', 'world']
步骤5:写第一个Web服务器
把index.js改成:
// 用Node.js内置的http模块创建一个Web服务器consthttp=require('http');constserver=http.createServer((req,res)=>{// req: 请求对象,包含请求的所有信息// res: 响应对象,用来发送响应consturl=req.url;constmethod=req.method;console.log(`收到请求:${method}${url}`);// 设置响应头res.setHeader('Content-Type','application/json; charset=utf-8');// 路由if(url==='/'&&method==='GET'){res.statusCode=200;res.end(JSON.stringify({message:'欢迎来到我的第一个Node.js服务器!',time:newDate().toLocaleString('zh-CN')}));}elseif(url==='/users'&&method==='GET'){res.statusCode=200;res.end(JSON.stringify({users:[{id:1,name:'张三',age:25},{id:2,name:'李四',age:30}]}));}elseif(url==='/health'&&method==='GET'){res.statusCode=200;res.end(JSON.stringify({status:'ok',uptime:process.uptime()}));}else{res.statusCode=404;res.end(JSON.stringify({error:'找不到这个路径'}));}});constPORT=3000;server.listen(PORT,()=>{console.log(`🚀 服务器已启动!`);console.log(`📍 访问地址: http://localhost:${PORT}`);console.log(`📍 用户接口: http://localhost:${PORT}/users`);console.log(`📍 健康检查: http://localhost:${PORT}/health`);console.log(`按 Ctrl+C 停止服务器`);});运行:
nodeindex.js然后打开浏览器,访问http://localhost:3000,你会看到JSON响应。这就是一个最简单的Web服务器——没有框架,纯用Node.js内置的http模块。
恭喜你,你已经写出了第一个后端API!🎉
七、新手最常见的5个误区
误区1:“Node.js就是用JavaScript写后端”
不完全对。Node.js是用JavaScript语法 + V8引擎 + C++绑定的运行时。"写后端"只是它的用途之一。它还能写CLI工具、桌面应用、脚本、Serverless函数等。
误区2:“Node.js是单线程,所以不能用于生产”
这是对"单线程"的误解。Node.js的主线程是单线程,但底层I/O(文件、网络)是多线程的(由libuv的线程池处理)。而且可以通过Cluster模式或Worker Threads利用多核CPU。Netflix、PayPal、LinkedIn、阿里巴巴都在生产环境大量使用Node.js。
误区3:“学Node.js必须先精通JavaScript”
不需要"精通",但需要掌握基础:变量、函数、对象、数组方法、Promise/async-await、ES6+语法。边学Node.js边巩固JS是完全可行的。但如果你连箭头函数和解构赋值都看不懂,建议先补一下JS基础。
误区4:“Node.js只能做小型项目”
NestJS + TypeScript + PostgreSQL的组合完全可以支撑大型企业项目。国内的字节跳动、滴滴、美团,国外的Netflix、PayPal、Trello都有大规模Node.js应用。
误区5:“Node.js要被Deno/Bun取代了”
Deno和Bun确实在性能和开发体验上有亮点,但Node.js的生态(npm上超过200万个包)和社区是不可替代的。2026年,Node.js仍然是服务端JavaScript的绝对主流。学Node.js不会过时。
🛠️ 实战练习
练习1:基础题 — 个人信息卡片
创建card.js,用console.log打印一张"个人信息卡片":
// 要求:// 1. 打印你的姓名、年龄、城市// 2. 打印当前Node.js版本和操作系统// 3. 打印一段分隔线(用 - 或 = 组成)// 格式参考:// ============================// 姓名:张三// 年龄:25// 城市:深圳// Node版本:v22.12.0// 系统:win32// ============================练习2:进阶题 — 命令行计算器
创建calculator.js,做一个命令行计算器:
# 用法nodecalculator.jsadd53# 输出: 5 + 3 = 8nodecalculator.js multiply47# 输出: 4 × 7 = 28nodecalculator.js power210# 输出: 2^10 = 1024提示:
- 用
process.argv获取参数 - 用
switch或对象映射处理不同运算 - 处理参数不足或非法输入的情况
练习3:挑战题 — 多路由API服务器
扩展第05步的Web服务器,增加以下路由:
GET / → 返回欢迎信息 GET /users → 返回用户列表(写死3个用户) GET /users/:id → 返回指定用户信息(提示:需要解析URL参数) POST /users → 返回"创建成功"(提示:需要读取请求体) GET /time → 返回服务器当前时间 GET /info → 返回服务器信息(Node版本、运行时长、内存使用)提示:
- 用
req.url和req.method做路由判断 - 用
req.on('data')和req.on('end')读取请求体 - 用
process.memoryUsage()获取内存信息 - 用
process.uptime()获取运行时长
💡 面试考点
Q1: Node.js和浏览器中的JavaScript有什么区别?
核心答:运行环境不同。浏览器JS的全局对象是window,有DOM/BOM API,受同源策略限制,不能直接操作文件系统。Node.js的全局对象是global,有fs/http/path等模块,可以直接操作文件系统、创建网络服务器、管理进程。JS语言本身(语法)完全一致,区别在于运行环境提供的API不同。
Q2: 为什么Node.js适合I/O密集型应用?
核心答:Node.js采用单线程+事件循环+非阻塞I/O模型。当执行I/O操作(读文件、查数据库)时,主线程不会等待,而是继续处理其他请求。I/O完成后通过回调通知主线程处理结果。这样单线程就能处理大量并发连接,不会因为I/O等待而阻塞。
Q3: Node.js的单线程意味着它只有一个线程在运行吗?
核心答:不是。Node.js的JavaScript代码在单线程(主线程)上执行,但底层libuv有一个线程池(默认4个线程)处理I/O操作。此外,可以通过Worker Threads创建额外的JavaScript执行线程,通过Cluster模式启动多个Node.js进程利用多核CPU。
Q4: Node.js的V8引擎是什么?
核心答:V8是Google开发的开源JavaScript引擎,用C++编写,用于Chrome浏览器和Node.js。V8负责将JavaScript代码编译成机器码执行,JIT(即时编译)是其性能关键。Node.js把V8引擎和系统级C++绑定结合,让JavaScript拥有了操作系统级别的权限。
📌 本期要点
- Node.js = V8引擎 + 系统级API + 事件循环,让JavaScript脱离浏览器,在服务器上运行
- 浏览器JS管界面,Node.js管系统——前者操作DOM,后者操作文件/网络/进程
- 单线程+非阻塞I/O是Node.js的核心特性,适合高并发I/O密集型场景,不适合CPU密集型计算
- 前端→全栈的最短路径:不需要换语言,已有JS基础直接上手
- 2026年Node.js依然主流:AI应用开发、SSR、工具链、Serverless都需要Node.js
- 生态不可替代:npm拥有200万+包,是最大的开源生态系统
- 你已经写出了第一个Web服务器:用http模块创建服务器、处理路由、返回JSON
🔗 下期预告
第02期《环境搭建:安装Node.js与开发工具配置》—— 我们会详细讲解nvm版本管理、VS Code的Node.js开发配置、npm/npx的区别与用法、以及如何用ESLint+Prettier搭建一个规范的项目工程。确保你的开发环境万无一失,再开始正式的编码之旅。
如果你没有苹果电脑,需要上传ios到APPStore可以访问以下网站
iPA上传工具 - IPA解析与AppStore提交