iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
自我挑戰組

《轉職學習日記:JavaScript × Node.js × TypeScript × Docker × AWS ECS》系列 第 10

Day10 - 持續成長學習藍圖 - Node.js(Event Loop 與模組系統)

  • 分享至 

  • xImage
  •  

第一步先搞清楚兩件事:

  1. Node.js 是怎麼跑程式的(Event Loop 機制)
  2. 模組系統(require / module.exports vs import / export)
    這些雖然是基礎,但真的超重要。

1. Node.js 執行模式

Node.js 是 單執行緒(single-threaded) 的,但它能同時處理很多事情,靠的就是 Event Loop

可以想像 Node.js 的工作流程:

  1. 先執行「主程式」
  2. 把需要等待的東西(像計時器、I/O)丟給 Event Loop
  3. 主程式跑完後,Event Loop 會負責一個一個把任務拉回來執行

2. Event Loop 小實驗

今天我用 setTimeoutsetImmediateprocess.nextTick 來感受一下 Event Loop 的順序。

console.log("開始");

setTimeout(() => {
  console.log("setTimeout");
}, 0);

setImmediate(() => {
  console.log("setImmediate");
});

process.nextTick(() => {
  console.log("process.nextTick");
});

console.log("結束");

執行結果通常會是:

開始
結束
process.nextTick
setTimeout
setImmediate

解釋:

  • process.nextTick:會在目前這個階段結束後「馬上」執行(比 setTimeout 還快)
  • setTimeout(fn, 0):丟到 Event Loop 的 timer 階段,等到主程式跑完才執行
  • setImmediate:等到 check 階段 才跑,通常比 setTimeout 晚

這個順序一開始很難記,但實際跑過一次就會有感覺。


3. 模組系統

寫 Node.js 不可能把所有程式都塞在同一支檔案,所以必須要學會「模組化」。

CommonJS(舊系統,用 require / module.exports)

utils.js

function add(a, b) {
  return a + b;
}

module.exports = { add };

index.js

const { add } = require("./utils");

console.log(add(2, 3)); // 5

ES Module(新系統,用 import / export)

utils.js

export function add(a, b) {
  return a + b;
}

index.js

import { add } from "./utils.js";

console.log(add(2, 3)); // 5

注意:ESM 在 Node.js 要記得設定 "type": "module"(放在 package.json 裡)。


4. 實作練習

今天的實作我分成兩部分:

(1) Event Loop 小實驗

跑一遍 setTimeoutsetImmediateprocess.nextTick,感受它們執行順序的差別。

(2) 模組匯入匯出

  • 建立 math.js:裡面 export 一個 add 函式
  • 建立 app.js:import 這個函式,拿來做簡單運算

這樣就能清楚體會模組拆分的好處:檔案更乾淨、功能更獨立。


🎯 學習心得 / 今日收穫

今天最有感的有兩點:

  1. Event Loop:雖然 Node.js 是單執行緒,但靠 Event Loop 能同時處理很多任務。跑過實驗之後,我才真正理解為什麼 process.nextTicksetTimeout 還要快。
  2. 模組化:用 requireimport 都能拆檔案,但新的專案還是建議用 ESM(import/export),語法比較直覺。

整體來說,今天算是 Node.js 的暖身。


上一篇
Day9 - 持續成長學習藍圖 - JavaScript (小作品完成與整理)
系列文
《轉職學習日記:JavaScript × Node.js × TypeScript × Docker × AWS ECS》10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言