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
英文地址,請注明出處:http://en.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進程信號(上)

目錄 一、信號速識 ??生活中的信號 ??技術上的信號 ??信號的發送和記錄 ??信號處理概述 二、產生信號 ??通過終端產生信號 ??通過函數發送信號 ??通過軟件產生信號 ??通過硬件產生信號 一、信號速識 ??生活中的信號 你在網上買了很多件商品&…