很多零基础同学学 Node.js 的第一个误区,就是上来就啃框架、学全栈项目,结果连代码运行报错都找不到原因。这份笔记完全按照「新手认知规律」排序,每一节都先讲「是什么、为什么要学、不学踩什么坑」,再讲核心知识点和避坑指南,完全不用死记硬背,跟着走就能跑通第一个 Node 程序,完成入门闭环。
Node.js 入门三层核心问题解答
一,目标与定位 —— 明确「为什么学 Node.js」
1. 课程目标
本门 Node.js 零基础入门课,核心目标是帮学习者建立 Node.js 完整的基础认知体系,掌握入门必备的核心开发能力,能独立完成基础后端服务开发、自动化脚本编写,同时理解前端工程化的底层逻辑。
- 课程侧重点:不深入算法实现、底层编译原理,核心聚焦「JavaScript 基础语法落地 + Node 核心 API 使用 + 模块化与工程化入门 + Web 后端基础开发能力」
- 适配场景:为 Web 全栈开发、前端工程化基建、自动化脚本工具开发三大核心应用场景做入门铺垫,学完可无缝衔接 Express/Koa 等框架进阶学习。
2. 语言核心定位
表格
| 核心维度 | 精准定位 |
|---|---|
| 运行类型 | 基于 Chrome V8 引擎的JavaScript 解释型运行时(带 JIT 即时编译优化),无需预编译,代码写完即可直接运行 |
| 核心应用领域 | Web 后端服务开发、前端工程化基建(webpack/vite 等)、自动化脚本工具、跨端桌面应用(Electron)、微服务开发、IoT 设备编程 |
| 设计哲学 | 事件驱动、异步非阻塞 IO,以最小的硬件开销处理高并发 IO 请求;同时实现前后端统一 JavaScript 语言栈,大幅降低全栈开发的学习与协作成本 |
| 核心优势 | 轻量高效、高并发 IO 处理能力强、前后端同语言、拥有全球最大的开源包生态 npm |
二,核心特征 —— 抓住「Node.js 是什么」
1. 核心范式与语法风格
- 编程范式:多范式兼容,完全继承 JavaScript 特性,同时支持面向对象、函数式、过程式编程,无强制范式约束,开发灵活度极高。
- 语法风格:和浏览器端 JavaScript 完全一致,弱类型、简洁灵活、无强制编译步骤,对前端开发者零语法学习成本。
- 与主流语言的核心区别:
表格
对比语言 核心差异 Java/C#(强类型编译型) 无需提前声明类型、无需预编译,开发效率更高;前后端同语言,无技术栈切换成本 Python(脚本语言) 核心采用异步非阻塞事件模型,高并发 IO 场景(接口请求、批量文件处理)性能优势显著,更适配 Web 服务开发 浏览器 JavaScript 移除了 DOM/BOM 网页操作 API,新增系统级 API(文件、网络、进程),拥有本地系统的完全操作权限
2. 核心抽象机制
- 代码组织的基本单元:模块化(默认 CommonJS 规范,兼容 ES Module),以单个 JS 文件为最小模块单元,通过
require/import导入、module.exports/export导出,实现代码的拆分、复用与隔离;其次以函数、对象 / 类作为业务逻辑的封装单元。 - 核心数据结构:
- 完全兼容 JavaScript 原生结构:数组、对象、Map、Set、字符串、数值等;
- Node 专属核心结构:Buffer(二进制数据处理)、Stream(流式数据处理)、EventEmitter(事件发布订阅)。
3. 独特的「王牌特性」(入门必吃透的 2 个核心)
- 异步非阻塞的事件驱动 IO 模型这是 Node.js 的灵魂与核心竞争力。所有 IO 操作(文件读写、网络请求、数据库操作)均为异步执行,不会阻塞主线程,单线程即可轻松处理上万并发请求,无需像传统后端语言为每个请求新建线程,硬件开销极低,特别适配 IO 密集型的 Web 服务开发。
- 前后端统一 JavaScript 全栈语言栈这是 Node.js 不可替代的核心优势。前端开发者无需学习新的编程语言,即可无缝切换到后端开发;前后端可共享代码、类型定义、工具库,大幅降低全栈开发的学习成本与团队协作成本,同时依托 npm 全球最大的 JS 开源生态,可直接复用海量成熟的工具与框架。
三,学习路径与资源 —— 规划「怎么学 Node.js」
1. 如何建立「最小可运行」环境(3 步零基础落地)
- 安装核心程序:访问 Node.js 官方中文网,下载LTS 长期支持版本(稳定无坑,不建议下载 Current 最新版),Windows/Mac 均为一键安装,默认选项即可(安装包自动配置环境变量,自带 npm 包管理工具)。
- 验证安装成功:打开终端(Windows 用 CMD/PowerShell,Mac 用终端),分别输入
node -v和npm -v,回车后正常输出版本号,即为安装成功。 - 完成最小运行闭环:新建空白文件夹,在里面新建
hello.js文件,写入代码console.log("Hello Node.js! 我的第一个Node程序运行成功");打开终端 cd 到该文件夹,执行node hello.js,终端成功打印对应内容,即完成最小可运行环境搭建。
2. 最高效的实践路径(边学边敲,以练促学)
| 学习阶段 | 核心学习内容 | 必做实操练习 | 阶段达标标准 |
|---|---|---|---|
| 前置准备 | JS 基础语法、ES6 + 异步核心(Promise/async-await)、基础命令行操作 | JS 基础逻辑 demo、熟练使用 cd 等命令、跑通 Hello World | 能看懂基础 JS 代码,能通过命令行正常运行 Node 文件 |
| 核心认知 | Node.js 核心定义、与浏览器 JS 的区别、两种运行方式、高频全局对象 | 全局对象使用 demo、交互模式测试代码 | 能清晰区分 Node 与浏览器 JS 的边界,无调用 DOM API 的低级错误 |
| 核心基础 | CommonJS 模块化规范、三大核心内置模块(path/fs/http) | 模块导入导出 demo、文件读写脚本、搭建可访问的 HTTP 服务 | 能独立完成文件读写,能搭建返回自定义内容的 HTTP 服务,无路径报错 |
| 工程化入门 | npm 核心命令、package.json 配置、依赖管理、自定义脚本 | 初始化 npm 项目、安装第三方包、配置启动脚本、写批量文件处理工具 | 能熟练用 npm 管理项目依赖,能通过 npm run 命令启动服务 |
| 异步核心闭环 | 异步编程规范、async/await 标准写法、错误处理机制 | 用 async/await 重写文件读写、开发带错误捕获的异步接口 | 能写出规范的异步代码,正确处理异步错误,无回调地狱问题 |
| 入门验收 | 综合运用所有知识点完成完整入门项目 | 开发简易后端接口服务,实现多路由数据返回、静态文件访问 | 独立完成项目开发,服务正常运行无报错,完成入门闭环 |
核心实践原则:拒绝只看文档 / 视频不动手,每学一个知识点,必须亲手敲代码运行验证,用最小 demo 吃透每一个核心特性,所有报错必须亲手解决,这是零基础入门的唯一捷径。
3. 官方权威资源(最高效、最准确的信息源)
- Node.js 官方中文文档:https://nodejs.cn/ ,零基础入门首选,包含完整的入门指南、API 参考、最佳实践,全中文无门槛,是最权威的中文学习资源。
- Node.js 官方英文文档:https://nodejs.org/ ,一手官方资源,包含最新的特性更新、语言规范、完整 API 文档,适合进阶学习与查阅最新内容。
- npm 官方文档:https://docs.npmjs.com/ ,包管理工具的权威指南,包含 npm 全命令用法、package.json 配置详解、依赖管理最佳实践。
- Node.js 官方 GitHub 仓库:https://github.com/nodejs/node ,可查看 Node.js 源码、了解迭代规划,仓库内的文档与示例也是最权威的学习材料。
Node.js 知识学习
一、前置必备知识(入门前提,不学根本推进不下去)
Node.js 是 JavaScript 的运行时,说白了就是「让 JS 能脱离浏览器跑在电脑 / 服务器上的工具」,所以 JS 语法是底层根基;而 Node 所有的运行、安装、服务启动都要靠命令行操作,这两项是绕不开的入门门槛,不用精通,够用就行。
1. JavaScript 基础语法(入门够用标准,不用啃进阶内容)
必学核心内容
- 基础语法:变量定义、函数声明与调用、数组 / 对象的基础操作、if 条件判断、for/forEach 循环
- ES6+ 核心:箭头函数、解构赋值、
Promise、async/await(Node 异步编程的核心,必须会基础用法)
【新手讲解 & 避坑】
- 为什么不用学原型链、闭包、继承这些进阶内容?入门阶段你只需要写基础的业务逻辑,这些进阶内容完全用不上,先把 Node 核心跑通,等入门后再回头补,完全不影响学习进度,很多新手卡在 JS 进阶内容上,直接放弃了 Node 学习,完全没必要。
- 最低标准:你能写一个函数,处理数组里的数据,会用 Promise 处理异步,就算达标。
2. 命令行基础(终端 / CMD,必会的核心命令)
必学通用命令
表格
| 命令作用 | 对应系统命令 | 核心说明 |
|---|---|---|
| 切换目录 | cd 文件夹名 | 全平台通用,Node 开发最高频命令 |
| 查看当前目录内容 | ls(Mac/Linux) /dir(Windows) | 查看当前文件夹里的所有文件 / 子文件夹 |
| 运行 Node 脚本文件 | node xxx.js | Node 核心执行命令,全平台通用 |
| 进入 Node 交互模式 | node | 临时测试代码用,输入后回车即可进入 |
| 退出交互模式 / 终止程序 | 两次ctrl+c或ctrl+d | 全平台通用 |
【新手讲解 & 避坑】
- 新手灵魂拷问:我用鼠标点文件夹不行吗?为什么非要用命令行?答:Node 程序是跑在终端里的,你用鼠标点文件夹,只是能看到文件,但是没法告诉 Node「去运行这个文件、去安装这个包、去启动这个服务」,这些操作只能靠命令行完成,这几个命令是你 Node 开发的「吃饭家伙」,必须练熟。
- 【90% 新手第一天必踩的坑】运行
node xxx.js报错「找不到模块 xxx.js」100% 是因为你没有 cd 到这个 js 文件所在的文件夹!举个例子:你的demo.js文件放在D盘/node-demo文件夹里,正确操作是:- Windows 打开 CMD,先输入
D:回车,切换到 D 盘 - 再输入
cd node-demo回车,进入 js 文件所在的文件夹 - 最后输入
node demo.js回车,才能正常运行
- Windows 打开 CMD,先输入
- 补充小技巧:文件夹名字有空格,要用引号包起来,比如
cd "我的 node 项目"。
二、Node.js 核心认知(先搞懂「是什么」,建立正确认知)
很多新手学了很久,都没搞懂「我写的 JS 和浏览器里的 JS 有什么区别?为什么 Node 能做后端?」,这一节先把底层逻辑讲透,避免越学越懵。
1. Node.js 核心定义
大白话翻译:Node.js 是基于 Chrome V8 引擎的JavaScript 运行环境。
- 浏览器里的 V8 引擎,负责解析执行网页里的 JS 代码;
- Node.js 把 V8 引擎单独拿了出来,给它加了系统级的权限(读写文件、开网络服务、管理进程等),让 JS 能脱离浏览器,直接跑在你的电脑本地、或者服务器上。
- 核心用途:后端接口开发、自动化脚本工具、前端工程化脚手架、桌面应用开发等。
2. 浏览器 JS vs Node.js 核心区别(新手必记)
表格
| 特性 | 浏览器 JS | Node.js |
|---|---|---|
| 运行环境 | 浏览器 | 本地设备 / 服务器 |
| 权限 & 独有 API | DOM、BOM(只能操作网页) | 文件系统、网络、进程等系统级 API |
| 顶层全局对象 | window | global/globalThis |
| 核心用途 | 前端页面交互、用户行为处理 | 后端服务、脚本工具、工程化脚手架 |
【新手讲解 & 避坑】
- 最核心的区别:权限不同!浏览器为了用户安全,给 JS 的权限极低,绝对不允许 JS 操作你电脑的本地文件(不然你打开一个恶意网页,它就能把你电脑文件删光);而 Node 是跑在你自己的电脑 / 服务器上的,给了 JS 完全的系统权限,所以 JS 才能当后端语言用,读写文件、操作数据库、搭建网络服务。
- 【新手高频报错坑】在 Node 里写
window.alert()、window.document直接报错记住:Node 里没有浏览器的window对象,也没有 DOM、BOM,所有浏览器里操作网页的 API,在 Node 里都不能用!反过来,Node 里的fs、http模块,在浏览器里也不能用。
3. Node.js 两种运行方式
1. 脚本文件运行(开发主流方式)
操作步骤:新建一个demo.js文件,写好代码 → 打开终端,cd 到文件所在文件夹 → 执行node demo.js运行代码。
2. 交互模式运行(仅临时测试用)
操作步骤:打开终端,直接输入node回车,就进入了交互环境,直接输入 JS 代码,回车就能立刻看到执行结果,用完按两次ctrl+c退出。
【新手讲解】
- 正经开发永远用「脚本文件运行」,代码可以保存、修改、复用;
- 交互模式只适合临时测试,比如你想试试
1+2*3等于几,或者试一个数组方法怎么用,不用新建文件,直接敲代码测试就行。
三、Node.js 高频全局对象(无需引入,直接使用)
全局对象,就是你不用写require导入,在任何 Node 代码里都能直接用的对象,以下是开发最高频的几个,不用死记硬背,写代码多用几次就记住了。
console:日志打印- 用法和浏览器里的
console完全一致,最常用console.log(),用来调试代码、打印变量值、查看程序运行结果。 - 【新手技巧】代码运行结果不对,先在关键位置加
console.log打印变量,看值是不是符合预期,这是最基础的调试方法。
- 用法和浏览器里的
__dirname:【重中之重】当前文件所在的绝对目录路径- 【新手必懂】这是解决 Node 路径报错的终极方案,90% 的新手文件读取报错,都是因为没用这个变量!
- 举个例子:你的
a.js文件放在D:/node-demo/test/a.js里,那么__dirname的值,永远是D:/node-demo/test,和你在哪里执行node命令无关。
__filename:当前文件的完整绝对路径- 上面的例子里,
__filename的值就是D:/node-demo/test/a.js,包含文件名本身,开发中用的比__dirname少。
- 上面的例子里,
process:进程对象- 大白话:管当前正在运行的这个 Node 程序的对象,能获取程序运行的系统信息、命令行参数、环境变量,也能控制程序退出。
- 入门必用示例:
js
// 查看当前程序运行的系统(Windows/Mac/Linux) console.log(process.platform); // 获取系统环境变量(后面开发/生产环境区分会高频用) console.log(process.env); // 直接退出当前Node程序 process.exit();
【新手避坑终极提醒】
绝对不要手写相对路径./test.txt!新手最常见的错误:在a.js里写fs.readFile('./test.txt'),明明test.txt和a.js放在同一个文件夹里,却报错「找不到文件」。
- 原因:
./相对路径,是相对于你执行 node 命令的终端所在的文件夹,不是相对于a.js所在的文件夹! - 正确写法:永远用
path.join(__dirname, 'test.txt')来拼接路径,不管你在哪里执行 node 命令,永远能精准找到文件,后面 path 模块会详细讲。
四、CommonJS 模块化系统(Node 核心,所有项目的基础)
这是 Node.js 的灵魂,所有 Node 项目都是基于模块化开发的,必须吃透。
1. 先搞懂:为什么要有模块化?
新手灵魂拷问:我把所有代码都写在一个app.js文件里不行吗?
- 当然可以,但是当你的项目代码超过 1000 行,你找一个功能要翻半天,改一个地方怕影响其他代码,完全没法维护;
- 模块化,就是把你的代码,按照功能拆成一个个独立的小文件(比如
user.js管用户相关逻辑,file.js管文件操作),每个文件只负责一个功能,代码好维护、好复用; - 更重要的是,别人写好的成熟模块,你直接导入就能用,不用自己从零开始写轮子,大大提升开发效率。
2. CommonJS 核心语法规则
Node.js 默认使用 CommonJS 模块化规范,核心就两个语法:
- 模块导出:
module.exports = 你要导出的内容 - 模块导入:
const 变量名 = require('模块标识')
3. 模块三大分类(新手必记导入规则)
表格
| 模块类型 | 说明 | 正确导入方式 | 新手高频错误 |
|---|---|---|---|
| 核心模块 | Node.js 内置自带,无需下载 | require('fs')直接写模块名 | 不用加路径,加了反而报错 |
| 文件模块 | 你自己写的 JS 文件 | require('./a.js')必须写相对 / 绝对路径 | 忘记加./,导致 Node 找不到文件 |
| 第三方模块 | 通过 npm 下载的外部包 | require('express')直接写包名 | 没提前 npm 安装,就直接导入 |
4. 极简入门示例(逐行讲解)
js
// 1. 新建 a.js 文件:导出模块内容 // 把要给别人用的内容,挂在module.exports上 module.exports = { name: "Node.js入门", // 导出一个方法 sayHello: () => { console.log("Hello 新手同学!"); } }js
// 2. 新建 b.js 文件:导入并使用a.js的内容 // 用require导入a.js,相对路径必须加./,拿到a.js导出的对象 const moduleA = require('./a.js'); // 直接使用a.js里导出的属性和方法 console.log(moduleA.name); // 打印:Node.js入门 moduleA.sayHello(); // 执行方法,打印:Hello 新手同学!【新手讲解 & 避坑】
- 【必记规则】导入自己写的文件模块,路径必须加
./!如果你写require('a.js'),Node 不会去当前文件夹找 a.js,只会去内置核心模块、node_modules 文件夹里找,100% 报错找不到。 - 入门阶段,只用
module.exports,别用exports!很多教程会讲exports,新手很容易踩坑,比如exports = {name:1}是完全无效的,而module.exports = {name:1}永远不会错,等你入门后再去研究两者的区别,完全不影响开发。 - 模块的代码只会执行一次:多次导入同一个模块,只会在第一次导入的时候执行代码,后面都会复用导出的结果,不会重复执行。
五、入门必学 4 大内置模块(Node.js 入门灵魂)
Node.js 内置了上百个开箱即用的模块,但是入门阶段,你只需要吃透这 4 个高频核心模块,就能覆盖 80% 的基础开发场景,不用贪多学其他的。
1. path 模块(路径处理)
核心用途
解决跨平台路径兼容问题,永远不要手动拼接路径!
- Windows 系统的路径用反斜杠
\,Mac/Linux 系统用正斜杠/,你手动拼接的路径,换个系统就可能报错; - path 模块会自动根据你当前的系统,生成正确的路径,搭配
__dirname使用,永远不会出现路径找不到的问题。
高频方法 & 入门示例
js
// 第一步:导入path模块(核心模块,直接写模块名导入) const path = require('path'); // 1. path.join():拼接路径,开发最高频用法 // 拼接当前文件所在目录 + test.txt,生成全平台兼容的绝对路径 const filePath = path.join(__dirname, 'test.txt'); console.log(filePath); // 会自动根据系统生成正确的路径 // 2. path.resolve():生成绝对路径,效果和join类似,入门会一个就行 const absolutePath = path.resolve('test.txt');【新手讲解】
记住一个固定写法:只要你要写文件路径,就用path.join(__dirname, '你的文件名/文件夹名'),这是 Node 开发的行业标准写法,能帮你避开 90% 的路径报错问题。
2. fs 模块(文件系统)
核心用途
大白话:让你的 JS 能操作你电脑里的文件和文件夹,比如读取文件内容、写入文件、新建文件夹、删除文件,这是后端开发最基础的能力。
入门必学:异步读取文件(逐行讲解)
js
// 导入fs模块 const fs = require('fs'); // 异步读取文件:fs.readFile(文件路径, 编码格式, 回调函数) fs.readFile(path.join(__dirname, 'test.txt'), 'utf8', (err, data) => { // Node.js 规范:回调函数第一个参数,永远是错误对象(错误优先回调) if(err) { // 如果读取失败,打印错误,终止执行 return console.log('文件读取失败:', err); } // 读取成功,打印文件内容 console.log('文件内容:', data); });【新手讲解 & 避坑】
- 为什么要加
utf8编码格式?不加的话,readFile 返回的是 Buffer 二进制数据,你看不懂,加了utf8,才会返回我们能看懂的文本内容。 - 为什么要用异步?Node.js 是异步非阻塞模型,同步读取文件会卡住整个程序,只有等文件读取完,才能执行后面的代码;而异步读取不会卡住,文件读取的同时,后面的代码正常执行,等读取完成后,再执行回调函数里的内容,这是 Node 的核心优势。
- 入门阶段,先掌握读和写,其他的删除、文件夹操作,等你熟练了再学,完全够用。
3. http 模块(服务搭建)
核心用途
这是 Node.js 能做后端开发的核心!它能让你的电脑变成一台服务器,接收浏览器的请求,给浏览器返回数据,实现后端接口、网站服务的开发。
入门必写:Hello World 服务(逐行讲解)
js
// 导入http模块 const http = require('http'); // 1. 创建服务器 // 回调函数:每次有客户端(浏览器)访问这个服务,就会执行一次 // req:请求对象,包含客户端的所有信息(访问地址、请求方法、参数等) // res:响应对象,用来给客户端返回内容 const server = http.createServer((req, res) => { // 【新手必加】设置响应头,解决浏览器中文乱码问题 res.setHeader('Content-Type', 'text/plain;charset=utf-8'); // 给客户端返回内容,并结束本次响应 res.end('Hello Node.js!新手入门成功啦!'); }); // 2. 监听端口,启动服务 // 3000是端口号,回调函数是服务启动成功后执行的内容 server.listen(3000, () => { console.log('服务已启动,访问地址:http://localhost:3000'); });【新手讲解 & 操作步骤】
- 把上面的代码写在
server.js文件里,cd 到文件所在文件夹,执行node server.js启动服务; - 打开浏览器,输入
http://localhost:3000,就能看到你写的内容,你的第一个后端服务就跑通了! - 【新手高频坑】
- 端口占用报错:如果启动报错「端口已被占用」,要么关掉之前启动的 Node 服务,要么把 3000 改成其他端口(比如 8080、8000),重新启动就行;
- 中文乱码:必须加
res.setHeader那一行代码,不然浏览器里的中文会变成乱码; - 修改代码后,必须重启服务才能生效!改完代码,先按
ctrl+c关掉之前的服务,再重新执行node server.js,不然浏览器看不到修改后的内容。
4. url 模块(网址解析)
核心用途
解析客户端请求的 URL 地址,提取接口路径、请求参数,比如用户访问http://localhost:3000/user?name=张三&age=20,你要用 url 模块,拿到name和age的参数,才能处理对应的业务逻辑,后端接口开发高频使用。
六、npm 包管理工具(Node.js 开发必备)
可以说,没有 npm,Node.js 开发寸步难行,入门必须掌握核心用法。
1. 先搞懂:npm 是什么?为什么要用?
大白话翻译:
- npm 是 Node.js 自带的包管理工具,装 Node 的时候就自动装好了,不用额外安装;
- npm 有一个全球最大的 JS 代码仓库,全世界的开发者,把自己写的成熟的 Node 代码包(比如接口开发框架 express、数据库操作包 mysql)都上传到这个仓库里;
- 你不用自己从零写轮子,比如你要写后端接口,不用自己用 http 模块磨底层逻辑,直接 npm 下载 express 包,几行代码就能搞定,大大提升开发效率;
- npm 帮你管理所有的第三方包:下载、更新、卸载、版本控制,全靠它。
2. 核心高频命令(新手必会)
表格
| 命令作用 | 完整命令 | 简写 / 补充说明 |
|---|---|---|
| 项目初始化 | npm init | npm init -y一键生成默认配置,不用一步步回车确认 |
| 本地安装第三方包 | npm install 包名 | 简写npm i 包名,安装到当前项目,业务依赖用 |
| 全局安装第三方包 | npm install 包名 -g | 简写npm i 包名 -g,工具类包(比如脚手架)用 |
| 卸载包 | npm uninstall 包名 | 简写npm un 包名,全局卸载加-g |
| 安装项目所有依赖 | npm install | 简写npm i,有 package.json 就能一键安装所有依赖 |
| 运行项目脚本 | npm run 脚本名 | 执行 package.json 里 scripts 配置的自定义命令 |
3. 核心文件 / 文件夹讲解(新手必懂)
package.json:项目的核心配置文件,你的项目「身份证」- 记录项目名称、版本号、作者信息;
- 记录项目依赖的所有第三方包,以及版本号;
- 配置自定义脚本命令,比如启动服务、打包项目的命令;
- 【重要】别人拿到你的项目,只要有这个文件,执行
npm i就能安装所有依赖,不用给对方传几百兆的 node_modules 文件夹。
node_modules:第三方依赖包的存放文件夹- 你 npm 安装的所有包,都存在这里,npm 自动生成、自动管理,你不用手动修改里面的内容;
- 【新手避坑】这个文件夹可以随便删,只要有 package.json,执行
npm i就能重新生成;git 上传项目的时候,绝对不要上传这个文件夹,又大又慢,只需要传 package.json 就行。
package-lock.json:依赖版本锁定文件- 自动生成的,用来锁定你安装的包的精确版本号,保证团队所有人、所有环境安装的依赖版本完全一致,不会出现「我电脑上能跑,你电脑上跑不了」的问题,不要手动修改。
【新手讲解 & 实操示例】
- 新建一个项目文件夹,cd 进去,执行
npm init -y,生成 package.json 文件; - 执行
npm i express,安装 express 框架,你会发现自动生成了 node_modules 文件夹和 package-lock.json,package.json 里多了 dependencies 依赖项; - 在 package.json 的 scripts 里,加一行
"start": "node server.js",然后执行npm run start,就能启动你的服务,不用每次都敲长命令。
七、Node.js 异步编程(核心难点,必学必会)
这是 Node.js 入门最难的一个知识点,但是只要你理解了底层逻辑,就会发现非常简单,我们用大白话讲透,不用记晦涩的术语。
1. 先搞懂:什么是同步?什么是异步?
举个生活里的例子,你一下就懂了:
- 同步:你去奶茶店排队点单,前面的人没做好,你就一直站在柜台等着,啥也干不了,直到你的奶茶做好,你才能走。代码里就是:一行代码没执行完,下一行代码永远等着,整个程序会卡住。
- 异步:你去奶茶店点单,付了钱拿了号,就找个位置坐着刷手机,不用在柜台等着,奶茶做好了会叫号,你再去拿。代码里就是:异步操作(读文件、网络请求)发起后,不用等着它完成,先执行后面的代码,等异步操作有结果了,再回来处理,程序永远不会卡住。
Node.js 所有的 IO 操作(文件读写、网络请求、数据库操作)都是异步的,这也是 Node 能高性能处理高并发请求的核心原因。
2. 异步编程的发展历程(按学习优先级排序)
- 回调函数:异步基础,Node.js 默认的异步方案,但是多层嵌套会出现「回调地狱」,代码很难维护;
- Promise:为了解决回调地狱,把嵌套的回调,改成了
.then().then()的链式调用,代码扁平化,好维护了很多; - async/await:现代 JS 异步编程的标准写法,也是入门最终要掌握的写法,能把异步代码写的像同步代码一样,从上到下执行,好读、好写、好维护。
3. 现代标准写法:async/await 入门示例(逐行讲解)
js
// 导入promise版本的fs模块,支持async/await,不用写回调函数 const fs = require('fs/promises'); const path = require('path'); // 1. 用async关键字,声明这是一个异步函数,只有async函数里,才能用await async function readFileTest() { // 2. 用try/catch捕获异步操作的错误,相当于回调函数里的err参数 try { // 3. await关键字,放在异步操作前面,会等着异步操作完成,拿到结果再往下执行 const data = await fs.readFile(path.join(__dirname, 'test.txt'), 'utf8'); // 上面的读取完成,才会执行这一行 console.log('文件读取成功:', data); } catch (err) { // 如果异步操作出错,会直接进到catch里,不会让程序崩溃 console.log('操作失败:', err); } } // 执行异步函数 readFileTest();【新手讲解 & 避坑】
- 【90% 新手必踩的坑】await 必须写在 async 函数里!如果你直接在代码的最顶层写
await fs.readFile(),会直接报错,必须把 await 放在带 async 关键字的函数里,这是硬性语法规则。 - 为什么要用
fs/promises?普通的fs模块是回调函数版本的,不支持 await,fs/promises是 Node 官方提供的 Promise 版本的 fs 模块,直接支持 async/await,不用自己封装。 - 必须加 try/catch 捕获错误!异步操作很容易出错(比如文件不存在),如果不捕获错误,整个 Node 程序会直接崩溃,这是开发规范,必须养成习惯。
- 入门阶段,你只要会用 async/await 写异步代码,就算达标,回调和 Promise 理解原理就行,实际开发优先用 async/await。
八、入门必备开发常识(新手避坑指南)
错误处理规范
- 回调函数:永远遵循「错误优先」原则,第一个参数是错误对象,必须先判断 err 是否存在;
- async/await:永远用
try/catch捕获异步错误,不要让程序直接崩溃。
环境变量区分开发 / 生产环境用
process.env读取环境变量,区分开发环境(你自己写代码的电脑)和生产环境(上线的服务器),比如开发环境用本地数据库,生产环境用线上数据库,不用每次上线改代码,安全又方便。端口占用问题解决启动服务报错端口被占用,最简单的办法就是换个端口号;也可以用命令找到占用端口的进程,关掉它:
- Windows:
netstat -ano | findstr "3000"找到进程 PID,去任务管理器关掉; - Mac/Linux:
lsof -i:3000找到进程 PID,执行kill -9 PID关掉。
- Windows:
九、Node.js 最简入门学习路径(零基础按步骤走,不跳步)
很多新手学不会 Node,都是因为跳步,上来就学框架、做项目,结果基础不牢,报错了都找不到原因,按这个步骤一步步来,每一步达标再往下走,零基础也能顺利入门:
- 补齐 JS 基础语法 + 命令行基础,能熟练 cd 到指定文件夹,运行 node 命令不报错;
- 安装 Node.js 环境,写第一个 hello world 脚本,成功运行,打印出内容;
- 吃透 CommonJS 模块化规范,能熟练实现模块的导入导出,不报错;
- 掌握
path/fs/http三大核心模块,能成功读取文件、启动一个后端服务,浏览器能正常访问; - 熟练使用 npm 初始化项目、安装第三方包、配置并运行自定义脚本;
- 掌握
async/await异步编程标准写法,能用同步的写法写异步代码,正确处理错误; - 独立用 http 模块,写一个简单的后端接口,能根据不同的请求地址,返回不同的内容,完成入门闭环