node.js 零基础入门

Node.js 零 基础入门与核心语法

适用对象:完全没接触过 Node.js 的同学
目标:从 0 到能写 CLI、小型 HTTP 服务、文件脚本、调用系统/网络资源

目录

  1. 什么是 Node.js
  2. 安装与运行
  3. 运行脚本与 REPL
  4. 模块体系:CommonJS 与 ES Modules
  5. 基础语法在 Node 环境下的差异与全局对象
  6. 内置核心模块概览与常用模块
  7. 异步编程:回调 → Promise → async/await
  8. 事件循环与微任务/宏任务(Node 特性)
  9. Buffer 与二进制
  10. Stream(流)与管道、背压
  11. HTTP:原生 http 模块
  12. 使用 Express 快速开发
  13. 环境变量与配置
  14. 调试、热重载、脚手架
  15. 实战:小项目骨架(原生与 Express)
  16. 常见错误与最佳实践

1. 什么是 Node.js

  • Node.js 是一个基于 V8 引擎的 JavaScript 运行时,提供了对文件、网络、进程等系统能力的访问。
  • 单线程、事件驱动、非阻塞 I/O,擅长 I/O 密集任务(HTTP 网关、代理、BFF、CLI、任务脚本等)。

2. 安装与运行

  • 建议安装 LTS 版本:https://nodejs.org/
  • 包管理器:npm 随 Node 附带,也可以用 yarn / pnpm
  • 常用命令:
node -v
npm -v
npm config set registry https://registry.npmmirror.com # 切国内镜像(可选)

3. 运行脚本与 REPL

  • 运行文件:node app.js
  • 交互式 REPL:node 回车后直接执行表达式
// app.js
console.log('Hello Node');

4. 模块体系:CommonJS 与 ES Modules

Node 支持两种模块系统。

A) CommonJS(CJS)默认

  • 文件后缀通常 .jsrequire() 引入,module.exports/exports 导出
// lib/math.js (CommonJS)
exports.add = (a,b) => a + b;// app.js
const { add } = require('./lib/math');
console.log(add(2,3));

B) ES Modules(ESM)

  • 在 package.json 中设置 "type": "module",或使用 .mjs 后缀
  • 使用 import / export
// package.json
{"name": "demo","type": "module","version": "1.0.0"
}
// lib/math.js (ESM)
export const add = (a,b) => a + b;// app.js
import { add } from './lib/math.js';
console.log(add(2,3));

C) ESM 的 __dirname__filename 替代:

// ESM 获取当前文件路径
import { fileURLToPath } from 'node:url';
import { dirname } from 'node:path';const __filename = fileURLToPath(import.meta.url);
const __dirname  = dirname(__filename);

5. 基础语法在 Node 环境下的差异与全局对象

  • 浏览器的 window 在 Node 中不存在,Node 的全局是 global(等价于 globalThis
  • 常见全局:process/Buffer/__dirname(CJS)/setTimeout/console
console.log(globalThis === global); // true
console.log('cwd', process.cwd());  // 当前工作目录

6. 内置核心模块概览与常用模块

按频率与实用性排序(以 ESM 写法;CJS 用 require 即可):

6.1 path:路径拼接与解析

import path from 'node:path';console.log(path.join('/a', 'b', 'c.txt'));   // \a\b\c.txt (win)
console.log(path.resolve('a/b', '../c'));     // 绝对路径
console.log(path.extname('file.tar.gz'));     // .gz

6.2 fs:文件系统(同步/回调/Promise)

// Promise API(推荐):node >= 14
import { readFile, writeFile, mkdir } from 'node:fs/promises';
import path from 'node:path';const p = path.join(process.cwd(), 'data.txt');
await writeFile(p, 'hello\n', { flag: 'a' });
const content = await readFile(p, 'utf-8');
console.log(content);

6.3 os:系统信息

import os from 'node:os';
console.log(os.platform(), os.cpus().length, os.totalmem());

6.4 url:URL 与文件路径互转

import { URL, fileURLToPath } from 'node:url';
const u = new URL('https://example.com?a=1');
console.log(u.searchParams.get('a')); // 1

6.5 events:事件总线

import { EventEmitter } from 'node:events';
const bus = new EventEmitter();
bus.on('tick', (n) => console.log('tick', n));
bus.emit('tick', 1);

6.6 child_process:子进程

import { exec } from 'node:child_process';
exec('node -v', (err, stdout) => console.log(stdout));

7. 异步编程:回调 → Promise → async/await

7.1 回调风格(历史)

import { readFile } from 'node:fs';
readFile('a.txt', 'utf-8', (err, data) => {if (err) return console.error(err);console.log(data);
});

7.2 Promise 风格

import { readFile } from 'node:fs/promises';
readFile('a.txt', 'utf-8').then(console.log).catch(console.error);

7.3 async/await(推荐)

import { readFile } from 'node:fs/promises';async function main() {try {const data = await readFile('a.txt', 'utf-8');console.log(data);} catch (e) {console.error(e);}
}
main();

7.4 并发与控制

// 同时并发 3 个任务,等待全部完成
await Promise.all([fetch(url1), fetch(url2), fetch(url3)
]);// 并发限制:自写一个简单限流器
function pLimit(limit){const queue = [];let active = 0;const next = () => {active--;if (queue.length) queue.shift()();};return fn => (...args) => new Promise((res, rej) => {const run = () => {active++;fn(...args).then(res, rej).finally(next);};active < limit ? run() : queue.push(run);});
}

8. 事件循环与微任务/宏任务(Node 特性)

Node 的队列优先级(简化理解):

  • process.nextTick(比微任务还早)
  • 微任务(Promise.then/queueMicrotask)
  • 宏任务(timers、I/O、setImmediate)
setTimeout(()=>console.log('timeout'));          // 宏任务
setImmediate(()=>console.log('immediate'));      // 宏任务(检查阶段)
Promise.resolve().then(()=>console.log('micro')); // 微任务
process.nextTick(()=>console.log('nextTick'));     // 最早// 输出:nextTick -> micro -> (timeout/immediate 先后与上下文有关)

9. Buffer 与二进制

  • Buffer 是 Node 操作二进制数据的结构
const buf = Buffer.from('abc', 'utf-8');
console.log(buf, buf.toString('hex'));const copy = Buffer.alloc(3);
buf.copy(copy);
console.log(copy.toString()); // 'abc'

10. Stream(流)与管道、背压

四类流:Readable / Writable / Duplex / Transform

import { createReadStream, createWriteStream } from 'node:fs';
const rs = createReadStream('in.txt');
const ws = createWriteStream('out.txt');
rs.pipe(ws); // 自动处理背压

自定义 Transform:

import { Transform } from 'node:stream';const upper = new Transform({transform(chunk, enc, cb){cb(null, chunk.toString().toUpperCase());}
});
process.stdin.pipe(upper).pipe(process.stdout);

11. HTTP:原生 http 模块

11.1 最小 HTTP 服务

import http from 'node:http';const server = http.createServer((req,res)=>{res.writeHead(200, {'Content-Type':'application/json'});res.end(JSON.stringify({ ok:1, path:req.url }));
});server.listen(3000, ()=>console.log('http://localhost:3000'));

11.2 路由与 JSON 解析(最简)

import http from 'node:http';const server = http.createServer(async (req,res)=>{if (req.method==='POST' && req.url==='/echo'){let body='';for await (const chunk of req) body += chunk;res.setHeader('Content-Type','application/json');return res.end(JSON.stringify({ body: JSON.parse(body) }));}res.statusCode = 404;res.end('Not Found');
});server.listen(3000);

12. 使用 Express 快速开发

npm init -y
npm i express
// app.js (CommonJS 例)
const express = require('express');
const app = express();
app.use(express.json());app.get('/ping', (req,res)=>res.json({pong:1}));
app.post('/echo', (req,res)=>res.json(req.body));app.listen(3000, ()=>console.log('http://localhost:3000'));

ESM 写法:

// package.json -> "type":"module"
import express from 'express';
const app = express();
app.use(express.json());
app.get('/ping', (req,res)=>res.json({pong:1}));
app.listen(3000);

13. 环境变量与配置

  • 使用 process.env 读取
  • 推荐 .envdotenv
npm i dotenv
import 'dotenv/config';
console.log(process.env.DB_HOST);

.env:

DB_HOST=localhost
DB_USER=root

14. 调试、热重载、脚手架

  • 调试:VS Code 中直接“Run and Debug” → Node.js
  • 热重载:npm i -D nodemon,package.json:
"scripts": {"dev": "nodemon app.js"
}
  • 脚手架/工具:ts-node、tsx、vite-node(进阶)

15. 实战:小项目骨架

15.1 原生 http 版项目结构

my-http/
├─ package.json
├─ app.js
└─ lib/└─ router.js

package.json

{"name": "my-http","type": "module","version": "1.0.0","scripts": { "start": "node app.js" }
}

lib/router.js

export async function handle(req, res) {if (req.method === 'GET' && req.url === '/ping') {res.writeHead(200, {'Content-Type':'application/json'});return res.end(JSON.stringify({ pong:1 }));}res.statusCode = 404; res.end('Not Found');
}

app.js

import http from 'node:http';
import { handle } from './lib/router.js';http.createServer(handle).listen(3000, ()=>console.log('http://localhost:3000'));

15.2 Express 版项目结构

my-express/
├─ package.json
└─ app.js

package.json

{"name": "my-express","version": "1.0.0","scripts": { "dev": "nodemon app.js", "start": "node app.js" },"dependencies": { "express": "^4.19.0" },"devDependencies": { "nodemon": "^3.0.0" }
}

app.js

const express = require('express');
const app = express();
app.use(express.json());app.get('/users/:id', (req,res)=>res.json({ id:req.params.id }));
app.post('/users', (req,res)=>res.status(201).json(req.body));app.use((err,req,res,next)=>{console.error(err); res.status(500).json({ message:'server error' });
});app.listen(3000, ()=>console.log('http://localhost:3000'));

16. 常见错误与最佳实践

  • 明确模块体系:CJS vs ESM,不要混用不清。Node 18+ 推荐 ESM
  • 文件/网络 I/O 一律用 Promise/async
  • 注意事件循环优先级:process.nextTick 仅用于兼容/必要场景,慎用
  • 使用 fs/promises 与流(大文件)
  • 错误处理:try/catch、Express 中用错误中间件
  • 生产建议:使用 PM2/容器编排;日志落地到文件(winston/pino)
  • 安全:避免 eval,校验输入,使用 Helmet(Express)等中间件

附:常用代码速查

package.json(CJS)

{"name": "demo","version": "1.0.0","main": "app.js","scripts": { "start": "node app.js" }
}

package.json(ESM)

{"name": "demo","version": "1.0.0","type": "module","scripts": { "start": "node app.js" }
}

顶层 await(ESM)

// app.mjs or "type":"module"
import { readFile } from 'node:fs/promises';
const txt = await readFile('a.txt','utf-8');
console.log(txt);

推荐学习顺序

  1. 安装与运行、REPL → 模块体系(CJS/ESM)
  2. fs/path/os/url/events 等常用模块 → 异步编程(Promise/async)
  3. 事件循环 → Buffer/Stream → HTTP/Express
  4. 环境变量/调试 → 小项目实战 → 最佳实践与部署

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918250.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Day3-PyTorch 自动微分入门:从计算图到梯度下降的实践指南》

八、自动微分自动微分模块torch.autograd负责自动计算张量操作的梯度&#xff0c;具有自动求导功能。自动微分模块是构成神经网络训练的必要模块&#xff0c;可以实现网络权重参数的更新&#xff0c;使得反向传播算法的实现变得简单而高效。1. 基础概念张量Torch中一切皆为张量…

apache cgi测试

test.cgi #!/bin/sh echo "Content-type: text/html" echo "" echo "<h1>Hello from a Mac CGI script!</h1>" echo "<p>Current time is: $(date)</p>"ƒ% 放置目录 /opt/homebrew/Cellar/mapserver/8.4.0_1…

力扣 30 天 JavaScript 挑战 第二题笔记

这道题是涉及知识–闭包 1. 闭包定义以及相关知识点 官方定义为&#xff1a;在 JavaScript 中&#xff0c;函数具有对在相同作用域以及任何外部作用域中声明的所有变量的引用。这些作用域被称为函数的 词法环境。函数与其环境的组合被称为 闭包。 简单理解&#xff1a;内层函数…

OpenAI GPT-5 深度解析:API Key定价与ChatGPT(Free, Plus, Pro)用户的区别

前言&#xff1a;两年等待&#xff0c;只为这一跃 在科技圈长达两年的屏息期待与无尽猜想之后&#xff0c;2025年8月8日北京时间凌晨&#xff0c;OpenAI终于揭开了其新一代旗舰模型——GPT-5的神秘面纱。这不仅仅是一次常规的产品迭代&#xff0c;更被整个行业视为一块试金石&a…

ClickHouse集群部署实践---3分片2副本集群

ClickHouse集群部署实践—3分片2副本集群 未完待续。。。 喜欢的先点赞收藏&#xff01;&#xff01; 由于我们准备部署的是3分片2副本的集群&#xff0c;现在来解释一下配置参数的意思&#xff1a; shard标签代表分片的意思&#xff0c;如上图我们有3个分片&#xff0c;clickh…

Unity_VR_Pico开发手册

文章目录一、配置开发环境1.下载PICO Unity Integration SDK2.安装 Unity 编辑器&#xff08;添加安卓开发平台模块&#xff09;3.导入下载的SDK4.项目配置和切换开发平台5.导入 XR Interaction Toolkit6.安装 Universal RP(通用渲染管线)并设置 (选做)二、调试环境搭建&#x…

Linux系统之Docker命令与镜像、容器管理

目录 一、 Docker命令 docker命令帮助 docker常用子命令&#xff08;必须背会&#xff09; docker管理子命令(暂时不需要) swarm集群管理子命令&#xff08;不需要&#xff09; docker容器管理子命令&#xff08;必须背会&#xff09; docker全局选项 二、 docker镜像管…

比亚迪第五代DM技术:AI能耗管理的深度解析与实测验证

比亚迪第五代DM技术&#xff1a;AI能耗管理的深度解析与实测验证 &#xff08;面向新能源汽车研发/测试工程师&#xff09;目录 技术背景与核心突破AI能耗管理系统架构解析关键技术创新点 2.1 动力域三脑合一控制2.2 全温域热管理协同2.3 导航数据深度耦合 实测数据与场景验证 …

sqli-labs通关笔记-第37关POST宽字符注入(单引号闭合 手工注入+脚本注入 3种方法)

目录 一、宽字符注入 二、sqlmap之unmagicquotes 三、addslashes与mysqli_real_escape_string 四、源码分析 1、代码审计 2、SQL注入安全性分析 五、渗透实战 1、进入靶场 2、正确用户名密码探测 3、手工注入&#xff08;方法1&#xff09; &#xff08;1&#xff…

Kubernetes 集群密钥与机密管理方案对比分析:Vault、Sealed Secrets 与 AWS KMS

Kubernetes 集群密钥与机密管理方案对比分析&#xff1a;Vault、Sealed Secrets 与 AWS KMS 在容器化与编排环境中&#xff0c;机密&#xff08;Secrets&#xff09;管理是确保应用安全性的重要环节。对于 Kubernetes 集群而言&#xff0c;内置的 Secret 对象存在明文存储的风…

Java基础-TCP通信单服务器接受多客户端

目录 案例要求&#xff1a; 实现思路&#xff1a; 代码&#xff1a; User类&#xff1a;用户端 Client类&#xff1a;服务端 ServerReader类&#xff1a;多线程通信类 总结&#xff1a; 案例要求&#xff1a; TCP通信下,正常的写法只能单个服务器和单个客户端进行通信&a…

electron:vue3+vite打包案例

1、安装electron 首先设置镜像源&#xff0c;否则安装会非常非常慢。 打开npm的配置文件。 npm config edit 修改配置项。 registryhttps://registry.npmmirror.com electron_mirrorhttps://cdn.npmmirror.com/binaries/electron/ electron_builder_binaries_mirrorhttp…

traceroute命令调试网络

文章目录 @[toc] 一、核心原理与参数解析 1. 工作原理 2. 关键参数 二、六大运维场景实战 场景1:内网服务器无法访问公网 场景2:跨国访问延迟高(电商业务卡顿) 场景3:VPN分流异常(流量泄露) 场景4:检测DNS劫持 场景5:防火墙规则验证 场景6:云服务跨区延迟优化 三、高…

自己本地搭建的服务器怎么接公网?公网IP直连服务器方法,和只有内网IP直接映射到互联网

​ 你是不是也遇到过这样的问题&#xff1a;在家里或者公司搭建了一个服务器&#xff0c;但是不知道怎么通过公网IP直接访问它&#xff1f;别急&#xff0c;其实很简单&#xff01;今天就给大家分享几种方法&#xff0c;手把手教你如何实现公网IP直连服务器&#xff0c;和无公网…

MATLAB中文乱码的解决方法

文章目录问题描述解决方法问题描述 对于matlab脚本输出乱码&#xff1a; ‘ʮ&#xfffd;&#xfffd;&#xfffd;&#xfffd;Ф&#xfffd;&#xfffd;&#xfffd;&#xfffd;һ&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;й&#xfffd;&#xff…

工业场景反光衣识别准确率↑32%:陌讯多模态融合算法实战解析

原创声明本文为原创技术解析&#xff0c;核心数据与算法逻辑引用自《陌讯技术白皮书》&#xff0c;禁止任何形式的未经授权转载。一、行业痛点&#xff1a;反光衣识别的场景难题在建筑施工、道路养护、仓储物流等工业场景中&#xff0c;作业人员反光衣穿戴规范检测是安全生产的…

北京JAVA基础面试30天打卡05

一、Redis 的持久化机制有哪些&#xff1f;** Redis 提供两种主要的持久化机制&#xff1a; ✅ RDB&#xff08;Redis DataBase&#xff09;快照持久化 定期将 Redis 中的数据以“快照”的形式写入磁盘&#xff08;生成 .rdb 文件&#xff09;。启动 Redis 时会加载 .rdb 文件恢…

深入理解 Maven POM 文件:核心配置详解

前言 在 Java 开发领域&#xff0c;Apache Maven 是一个强大的项目管理和构建自动化工具。而pom.xml文件&#xff0c;作为 Maven 项目的“心脏”&#xff0c;定义了项目的方方面面。本文将带你深入了解pom.xml中最常用和最重要的配置项&#xff0c;帮助你快速掌握 Maven 的核心…

嵌入式学习的第四十天-51单片机

一、基本框架第一阶段&#xff1a;1980年、Intel英特尔MCS-51系列&#xff1a;8051型号单片机、工业控制领域、由MCU市场->CPU市场。1、CPU&#xff08;Central Processing Unit&#xff0c;中央处理单元&#xff09;‌是计算机的核心部件&#xff0c;负责执行计算机指令和处…

Linux(17)——Linux进程信号(上)

目录 一、信号速识 ✍️生活中的信号 ✍️技术上的信号 ✍️信号的发送和记录 ✍️信号处理概述 二、产生信号 ✍️通过终端产生信号 ✍️通过函数发送信号 ✍️通过软件产生信号 ✍️通过硬件产生信号 一、信号速识 ✍️生活中的信号 你在网上买了很多件商品&…