一、Node.js 是什么?
😺 定義:
Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行時環境,讓你可以在瀏覽器之外運行 JavaScript 代碼,主要用于服務端開發。
😺從計算機底層說:什么是“運行環境”?
“運行環境” = 能接收你寫的高級語言代碼,并把它翻譯成 CPU 能執行的機器指令,然后 管理運行所需的一切資源(內存、I/O、線程等) 的一套系統。
😺😺Node.js 是如何做到“運行 JS 代碼”的?
1. node.exe 本質上 = V8 引擎 + Node API 的封裝
2. 當你運行命令:
😺V8 引擎是怎么工作的?
? V8 本身也是用 C++ 寫的
? 它把 JS 源碼:
? 先解析成 AST(抽象語法樹)
? 再編譯成字節碼(Bytecode)
? 然后使用 JIT(即時編譯器)編譯成機器碼
? 最后直接交給 CPU 執行
😺什么是 Node API?
Node 提供了很多“可以直接調用的功能”,比如:
? fs.readFileSync() → 讀文件
? http.createServer() → 啟動服務器
? process.pid → 訪問當前進程
😺看一下例子,那運行一個 .js 文件時到底發生了什么?
舉例:你運行 node hello.js
背后的流程大致是這樣:
1)你敲命令:node hello.js
? 系統運行 node.exe 程序
? 并把參數 hello.js 傳進去
2)node 程序啟動:初始化 C++ 層
Node 的主程序是 C++ 寫的,它首先會做以下事:
main(argc, argv) {
InitNode(); // 初始化 Node 環境
InitV8(); // 初始化 V8 引擎
StartExecutionLoop(); // 開始 JS 代碼執行流程
}
3)調用 V8,加載并解析 hello.js 文件
? Node 用 fs 模塊(C++)讀取 hello.js 源碼(UTF-8 字符串)
? 把代碼傳給 V8:
v8::Script::Compile(js_code); // 編譯 JS
4)V8 做的事(內部原理簡化)
👉 V8 執行流程:
1. 把 JS 源碼解析成 抽象語法樹 AST
2. 編譯成中間語言(字節碼)
3. 熱代碼用 JIT 編譯成本地機器碼(x86 指令)
4. 執行!
5)JS 調用 Node API 時發生了啥?
假設你寫了:
const fs = require(‘fs’);
fs.readFileSync(‘hello.txt’, ‘utf-8’);
? require() 是 Node 實現的模塊系統
? fs.readFileSync 實際是 JS 調到 Node 的 C++ 層代碼
? 通過 C++ 實現的 fs_module.cc 調用操作系統的文件 API(如 Windows 的 ReadFile,Linux 的 read())
6)事件循環(Event Loop)開始轉起來了
如果你的代碼中有異步操作,比如:
setTimeout(() => {
console.log(‘hello’);
}, 1000);
Node 會:
? 利用 libuv 庫管理異步事件
? 注冊回調、設置定時器
? 等待時鐘完成后,事件循環調度你注冊的 JS 回調重新進入 V8 執行
? 圖示總結一下:
你敲:node hello.js
↓
[ node.exe ] 啟動(C++)
↓
加載 V8 引擎(C++)
↓
讀取 JS 文件 → 源碼字符串
↓
[ V8 ]
- 解析 JS
- 編譯成字節碼
- JIT 編譯為機器碼
- 執行代碼
↓
遇到 require(‘fs’) 等 Node API
→ 跳到 C++ 層的模塊(文件系統、網絡等)
→ 操作系統調用
↓
執行結果返回 JS
↓
繼續事件循環(libuv)
😺npm是什么
npm(Node Package Manager)是 Node.js 的官方包管理工具,用來下載、安裝、管理和分享 JavaScript 包(模塊)。
用最簡單的話來說:
npm 是一個 JS 世界的“應用市場 + 安裝器 + 項目管理助手”。
它做了三件事:
1. 下載安裝開源包:比如你運行 npm install express,它就從網上把 express 框架的代碼包下載下來。
2. 自動管理依賴關系:比如 A 模塊依賴 B 模塊,npm 會自動把 B 一起裝上,不需要你手動找。
3. 維護你的項目依賴信息:通過 package.json 這個文件記錄你用的所有包版本,方便協作和還原環境。
🧠 它和 Node.js 是什么關系?
? Node.js 是運行環境(JS 解釋器 + 系統 API)
? npm 是 Node.js 附帶的“包管理器”
你安裝 Node.js 的時候,其實 npm 也一并被裝好了(就像你裝了 Python,也會帶上 pip)。
你可以在終端里輸入:
node -v # 查看 Node 版本
npm -v # 查看 npm 版本
📦 npm 的核心組成:
1. npm CLI(命令行工具)
就是你常用的 npm install、npm run dev 等命令,其實是由 JS + Node 寫的程序。
2. npm Registry(注冊中心)
一個巨大的“線上代碼倉庫”,地址是 https://registry.npmjs.org
上面有幾百萬個 JS 包,是全世界開發者共享代碼的中心。
3. package.json(項目描述文件)
記錄你的依賴、項目名、腳本命令等,比如這樣:
{
“name”: “my-app”,
“version”: “1.0.0”,
“dependencies”: {
“axios”: “^1.6.0”
},
“scripts”: {
“start”: “node index.js”
}
}
😺npm 管理的“包”到底是什么?
舉個例子:
? 你寫網頁或服務器代碼時,可能會用到別人寫好的功能模塊,比如:
? axios:幫你方便地發送網絡請求(AJAX)
? express:快速搭建后端服務器框架
? lodash:提供各種實用的函數工具庫
? moment 或 dayjs:處理時間和日期
? react 或 vue:前端的 UI 框架
這些“包”就是一堆寫好的 JS 文件和資源集合,別人寫好了,你直接裝到項目里用,省時又省力。
😺Node.js 的應用場景:
? 構建 Web 服務(如 Express 框架)
? 命令行工具(如 npm)
? 文件處理 / 流式處理
? 后端 API 服務
? 前端工具鏈(webpack、vite、babel 都基于 Node)
😺js和node.js的對比
😺Vue 是做什么的?
Vue 是一個用于構建網頁用戶界面的 JavaScript 框架。
說人話就是:
你寫網頁的時候,不再用手搓 DOM、堆 jQuery,而是像搭積木一樣寫“組件”,Vue 幫你把它們拼起來、渲染成頁面,并且自動響應數據變化。
🧱 它能幫你做什么?
? 1. 快速構建“動態網頁”
Vue 的核心思想是:數據驅動視圖。你只要綁定好數據,Vue 就幫你把頁面更新到位。
{{ message }}
data() {
return { message: ‘你好,小*!’ }
}
只要你改了 message 的值,頁面會立刻變,不用你去操作 DOM,特別適合開發復雜的網頁應用。
? 2. 組件化開發
你可以把網頁拆成一個個“小零件”(組件)來寫,每個 .vue 文件就是一個功能獨立的模塊:
? 頂部導航欄組件
? 登錄表單組件
? 商品列表組件
? 評論模塊組件
這樣不僅 易維護、可復用、便于協作開發,也更現代。
? 3. 豐富生態 + 插件
你剛才提到的這些:
? vue-router:做前端路由(頁面切換)
? vuex 或 pinia:做全局狀態管理
? axios:做網絡請求
? element-plus:一整套好看的 UI 組件庫
這些都可以和 Vue 搭配使用,幫你從頁面到功能一步到位。
🚀 用 Vue 可以做哪些項目?
? 個人博客 / 作品集網站
? 電商后臺管理系統(管理商品、訂單、用戶)
? 微信小程序 H5 前端
? 公司官網 / 展示頁
? 與 Node.js 配合寫全棧應用(前后端都用 JS)
😺比較js原生。vue。react的寫法
? ? 原生 HTML + JS 怎么寫
? ? 用 Vue 怎么寫
? ? 用 React 怎么寫
再告訴你Vue 和 React 的區別
🧪 需求:實現一個簡單的“計數器”
功能:
? 顯示一個數字(初始是 0)
? 點按鈕,數字 +1
💻 1. 原生 HTML + JS 寫法(手動操作 DOM)
0
點我加 1<script>let count = 0;function increment() {count++;document.getElementById('counter').innerText = count;}
</script>
🧠 問題:
? 要手動獲取 DOM、更新內容。
? 頁面和數據是“分開的”,容易出 bug。
? 難以維護,邏輯混亂。
🍃 2. Vue 寫法(數據驅動視圖)
{{ count }}
? 好處:
? 頁面和數據綁定在一起({{ count }} 自動顯示)
? 不需要自己操作 DOM
? 寫法直觀,邏輯清晰
?? 3. React 寫法(函數組件 + Hook)
import React, { useState } from ‘react’;
function Counter() {
const [count, setCount] = useState(0);
return (
{count}
<button onClick={() => setCount(count + 1)}>點我加 1
);
}
export default Counter;
? 特點:
? 也是數據驅動視圖(count 改變頁面自動更新)
? 使用 useState() 管理狀態
? 語法偏向函數式,寫法更自由靈活
? 總結一句話對比:
? 原生 JS 是手動木工:你寫的代碼像“自己鋸木頭、拼木板”
? Vue 是半自動裝配:你提供模板 + 數據,Vue 幫你裝好
? React 是全 JS 式裝配:你用函數式思維、寫純 JS,靈活但對腦子有點挑戰