所有文章
2026
TypeScript construct signature 與函式多載:用 new 描述建構子、用函式頭綁定參數關係
09-07
TypeScript void 型別:為什麼回呼參數要用 void 而不是 undefined
09-07
TypeScript callable 型別:用 call signature 替函式與回呼定義型別
09-06
TypeScript 型別註冊表模式:結合 keyof 與 declare module 打造可擴充的資料層
09-06
TypeScript 型別查詢:用 keyof、typeof 與索引存取型別,從既有值反推出型別定義
09-05
TypeScript 遞迴型別:用 NestedNumbers 描述無限巢狀陣列,不再需要 interface 搭配寫法
09-05
TypeScript interface:extends 建立繼承鏈,implements 定義類別必須遵守的契約
09-04
TypeScript 型別別名:取代冗長型別語法,用交集做子型別擴充,且比 interface 更有彈性
09-04
TypeScript 交集型別實戰:用 printEven 等函式驗證嚴格但通用的型別,兼談與聯集的不對稱關係
09-03
TypeScript 聯集型別實戰:型別別名、控制流程回傳值、tuple 屬性限制、instanceof 窄化與判別聯集
09-03
TypeScript 聯集與交集型別:用集合思維理解 | 和 & 的接受範圍與型別保證差異
09-02
TypeScript 結構型別 vs 名義型別:printCar 為什麼不管物件從哪裡來
09-02
TypeScript 陣列型別與 tuple:固定長度結構、readonly 保護與型別安全的落差
09-01
TypeScript 索引簽名:電話簿字典結構、已知欄位並存與 unchecked indexed access
09-01
TypeScript 物件型別與多餘屬性檢查:以 printCar 函式解析選擇性屬性與型別窄化
08-31
TypeScript 函式型別標註全解析:參數型別如何攔下 any 錯誤,回傳型別如何定位問題
08-31
TypeScript 型別轉換再探:相容性邊界、雙重轉型逃生口與 any 與 unknown 的選擇
08-30
TypeScript 變數宣告與型別推斷:let/const 差異、字面值型別與 implicit any
08-30
TypeScript 編譯實戰:tsconfig target/module 設定與宣告檔產生原理
08-29
TypeScript 入門筆記:JavaScript 語法超集定位、編譯器角色與編譯期抓錯的實例解析
08-29
實作 Nginx 負載平衡:upstream 放在 nginx.conf、自訂 log format 驗證流量分配
08-28
容器協調與負載平衡概觀:Kubernetes 是做什麼的,Nginx upstream 怎麼分配流量
08-27
寫第一個 Dockerfile:Alpine 基礎映像、node 使用者權限、COPY 快取順序、多實例部署
08-27
容器化概觀:微服務 vs. 單體架構的取捨,容器與虛擬化的差異,為什麼這門課選用 Docker 管理容器
08-26
在 Nginx 開啟 HTTP/2:一個關鍵字換來 Multiplexing,用 Network 面板驗證協定
08-26
用 Certbot 免費幫網站裝上 HTTPS:snap 安裝、自動改寫 Nginx 設定、開放 443 埠
08-25
HTTP 請求與回應結構完整拆解:常見標頭、狀態碼分類,以及為什麼一定要改用 HTTPS 加密連線傳輸
08-25
SQLite 實作訪客紀錄:記憶體資料庫、建表、Prepared Statement、關閉連線的順序
08-24
關聯式資料庫概觀:為什麼不能只把資料存成一個檔案,用資料表、主鍵、外鍵、JOIN 串接多張表查詢資料
08-24
前端建立 WebSocket 連線:wss/ws 協定判斷、onmessage 接收訊息、部署到正式伺服器
08-23
WebSocket 與 HTTP 連線方式的差異、Nginx 加 Upgrade 標頭、建立 Express 伺服器
08-23
建立子網域:新增 A 記錄、寫 Nginx 虛擬伺服器區塊指定 server_name,串接不同應用程式
08-22
Nginx 路徑重導向與 Gzip 壓縮:壓縮等級為什麼設 6 不設 9,圖片、音訊檔案為什麼壓不動
08-22
find 找檔案位置、grep 找檔案內容:兩個指令搭配 sudo !! 快捷技巧,快速排查系統問題
08-21
讀 log 檔的正確工具:cat、tail -f 怎麼選,以及 POSIX 標準串流與重導向符號全解析
08-21
用 cron 打造假 CI/CD:bash script 自動 git pull,crontab.guru 排程
08-20
CI/CD 是什麼:連續整合、連續交付與連續部署三個名詞的差異,為什麼測試才是核心而非推得更快
08-20
unattended-upgrades 安裝教學:Ubuntu 伺服器自動套用 LTS 更新,多數資安事件只是懶得補洞
08-19
chmod 數字背後的數學:read、write、execute 怎麼變成 4、2、1,以及最小權限原則
08-19
用 UFW 設定防火牆:關閉不該開放的 3000 埠,以及 deny 與 reject 的關鍵差異
08-18
什麼是連接埠(Port):常見服務對應的埠號,用 nmap 掃描伺服器找出不該開放的 3000 埠
08-18
伺服器被入侵之後能做什麼:偷走 GitHub 帳號、清空紀錄,為什麼唯一解法是砍掉重練,SSH 金鑰與防火牆缺一不可
08-17
Git 也是靠雜湊運作的:在伺服器上建一把 GitHub 專用金鑰,改用本機開發後 push、pull 就好
08-17
寫出 Nginx 虛擬伺服器設定檔,用 nginx -t 驗證,並用 PM2 讓 Node 應用程式永遠活著
08-16
安裝 Node.js、初始化專案,並用 Nginx proxy_pass 把請求轉給 Node 伺服器
08-16
Nginx 安裝與設定檔解析:為什麼需要反向代理,root、location、directive 結構全拆解
08-15
用 chmod 644 修正 authorized_keys 權限並停用 root 登入:關閉伺服器最後一道安全破口
08-15
別再用 root 登入伺服器:建立新使用者、加進 sudo 群組取得權限,並手動設定 SSH 金鑰讓新帳號能登入
08-14
實際購買網域名稱:用 Namecheap 買下網域,設定 DigitalOcean 名稱伺服器與 A 記錄
08-14
DNS 是怎麼把網域轉成 IP 的:nslookup、dig 實測,以及 URL 結構與網域搶註爭議
08-13
TCP 與 UDP 差在哪:三向交握、封包、ICMP,以及 ping of death 攻擊的原理
08-13
用 ping、traceroute、netstat 揭開網路請求背後的隱藏層:實際動手驗證架構怎麼運作
08-12
網路是怎麼運作的:從網路卡、路由器、ISP 骨幹到伺服器的請求路徑,兼談 IP 位址與 IPv4、IPv6 差異
08-12
SSH 金鑰流程總複習:known_hosts 是什麼,以及用 SSH config 省去每次打 -i 的麻煩
08-11
實作 SSH 金鑰登入:公鑰私鑰原理、ssh-keygen 產生金鑰,到連上 DigitalOcean 伺服器
08-11
SHA256 與 Salt 加鹽雜湊:為什麼密碼雜湊一定要加鹽,兼談 Bcrypt、加密貨幣與勒索軟體
08-10
SSH 金鑰為什麼比密碼安全:雜湊、字典攻擊與 MD5 彩虹表攻擊原理拆解
08-10
作業系統怎麼選:Windows 與 Unix 的差異、Solaris/Linux/BSD 三大分支,以及三個組成部分
08-09
實際購買一台 VPS:DigitalOcean Droplet 建立流程,地區與 Ubuntu LTS 作業系統怎麼選
08-09
為什麼不能用自己的筆電當伺服器:雲端運算、虛擬化與 VPS 的關係
08-08
從零把 Node.js 伺服器跑起來:Homebrew、NVM 與最陽春的 HTML 檔案
08-08
伺服器到底是什麼:從概念定義到寫一個最陽春的 Node.js Server
08-07
Shell 是什麼:從 bash 到 zsh,設定開啟終端機時的問候語
08-07
命令列迷路指南與 Vim 三種模式入門
08-06
命令列練習解答:從基礎導覽指令到 man page 的使用習慣
08-06
命令列入門:為什麼要學它,以及基本檔案操作指令
08-05
什麼是 Full Stack 工程師:現代運算的三大支柱
08-05
改善 INP:把工作切開,讓出主執行緒
08-04
改善 CLS:版面尺寸提示
08-04
改善回訪使用者體驗:瀏覽器快取策略
08-04
改善 LCP:圖片壓縮、格式轉換與響應式圖片實作
08-03
改善 LCP:使用 picture 元素實作響應式圖片
08-03
改善 LCP:圖片格式與響應式圖片
08-02
改善 LCP:Lazy Loading 與 Eager Loading
08-02
改善 LCP:問題分析與三個策略
08-01
改善 FCP:延遲載入非關鍵 JavaScript
08-01
改善 FCP:資源預載(Preconnect 與 Preload)
07-31
改善 FCP:移除依賴鏈
07-31
改善 TTFB:伺服器容量、地理位置與 CDN
07-30
改善 TTFB:HTTP 協議演進
07-30
改善 TTFB:HTTP 壓縮
07-29
改善效能的核心思維
07-29
設定效能目標:認識你的真實使用者
07-28
設定效能目標:三個決定「夠快」的力量
07-28
設定效能目標:速度的心理學
07-27
效能測試工具:Real User Monitoring(RUM)
07-27
效能測試工具:Web Vitals Chrome 擴充功能
07-26
效能測試工具:Chrome Performance
07-26
效能測試工具:Chrome Lighthouse
07-25
解讀效能資料:百分位數與 Lab vs Field Data 的正確用法
07-25
效能資料的來源:Lab、Synthetic 與 Field Data
07-24
效能指標的瀏覽器支援:Blink、WebKit 與 Gecko
07-24
以程式碼收集效能指標:PerformanceObserver 與 web-vitals 套件
07-23
以程式碼收集效能指標:Performance API 概覽
07-23
其他效能指標:FCP(首次內容繪製)
07-22
其他效能指標:TTFB(首位元組時間)
07-22
已退役的指標:First Input Delay(FID)
07-21
Core Web Vitals:INP(互動到下一幀繪製)
07-21
如何閱讀火焰圖(Flame Chart)
07-20
CLS 的邊界情況:哪些元素計入、viewport 範圍與 iframe 的處理
07-20
Core Web Vitals:CLS(累積版面位移)
07-19
Core Web Vitals 與 LCP(最大內容繪製)
07-19
傳統指標的局限與 Core Web Vitals 的誕生
07-18
傳統效能指標:DOMContentLoaded 與 Load 事件
07-18
如何閱讀瀑布圖(Waterfall Chart)
07-17
網頁效能為什麼重要:SEO 與線上廣告篇
07-17
網頁效能與使用者體驗:關鍵數字與研究根據
07-16
網頁效能是什麼?課程架構與範例應用總覽
07-16
Vanilla JS 在現代開發中的位置
07-15
用 Proxy 實現雙向資料綁定,以及完成應用程式的最後修正
07-15
完成購物車頁面:CartItem 與 OrderPage 元件,以及元件註冊的關鍵機制
07-14
購物車邏輯與響應式徽章更新:Proxy、陣列不可變性與全域事件
07-14
DetailsPage 元件:複用既有模式與調試 dataset 命名
07-13
ProductItem 元件與事件目標判斷:event.target 與 event.currentTarget
07-13
響應式渲染:監聽 Store 變動並動態產生選單 DOM
07-12
Proxy 與響應式程式設計:讓資料變動驅動 UI 更新
07-12
為 Web Component 載入外部 CSS:Fetch API 與效能優化
07-11
為 Custom Element 啟用 Shadow DOM:樣式封裝的實際效果
07-11
在 Custom Element 中載入 Template:connectedCallback 與 Shadow DOM 的必要性
07-10
建立第一個 Web Component:頁面元件的實作起點
07-10
Web Components 的 CSS 策略與常見問題釐清
07-09
Shadow DOM:Web Components 的樣式封裝機制
07-09
HTML Templates:在 DOM 中定義惰性的 HTML 片段
07-08
Web Components 與 Custom Elements:瀏覽器原生的元件化方式
07-08
完成 Router:動態路由參數、popstate 監聽與瀏覽器歷史導覽
07-07
實作 Router 的頁面渲染邏輯:切換路由與清除容器
07-07
實作客戶端 Router:攔截連結、歷史紀錄與深度連結
07-06
SPA 路由原理:History API 與頁面切換的兩種策略
07-06
建立 Services 層:API、Store 與 ES 模組系統
07-05
addEventListener 選項、移除事件與自訂事件
07-05
DOM 事件綁定:事件種類、命名規則與兩種綁定方式比較
07-04
DOMContentLoaded:初始化應用程式的正確時機
07-04
JavaScript 入口點與 script 載入策略
07-03
在實際專案中操作 DOM:查詢範圍與效能意識
07-03
DOM 與 HTML 原始碼的差異:瀏覽器如何解析與補全結構
07-02
操作 DOM 元素:屬性、樣式、事件與內容
07-02
選取 DOM 元素:方法、回傳型別與操作能力
07-01
DOM 與 DOM API 基礎概念
07-01
Vanilla JS 的優勢與開發者的常見疑慮
06-30
什麼是 Vanilla JavaScript?
06-30
委派導向設計:從父子繼承到平行協作
06-29
OLOO:物件連結物件的設計模式
06-28
原型繼承:`Object.create()` 與跨鏈方法查找
06-28
原型遮蔽(Shadowing)與顯式偽多型
06-27
原型鏈:物件之間的連結機制
06-27
原型系統:連結而非複製
06-27
自動綁定方法的代價:一個不應該存在的 hack
06-26
ES6 `class` 語法:繼承、`super` 與 `this` 綁定的陷阱
06-26
箭頭函式的詞彙 `this`:物件不是 Scope,以及何時該用箭頭函式
06-25
箭頭函式與詞彙 `this`:沒有自己的 `this` 的函式
06-25
預設綁定:`this` 的第四種做法與總覽
06-24
`new` 關鍵字:第三種 `this` 綁定規則
06-24
隱式綁定與明確綁定:`this` 的前兩種規則
06-23
`this` 關鍵字:由呼叫方式決定的動態上下文
06-23
ES6 模組語法:原生模組支援與 Node.js 的相容之路
06-22
模組模式(Module Pattern):用閉包實現封裝
06-22
閉包關閉的是變數,不是值:迴圈閉包的常見陷阱
06-21
閉包(Closure):函式記憶自身範疇的能力
06-21
`let` 不提升?這個說法是錯的
06-20
提升(Hoisting):一個有用但不精確的比喻
06-20
`const`:被高估的宣告關鍵字
06-19
明確的 `let` 區塊:縮短變數的生命週期
06-19
`var` 與 `let` 的語意分工:各自有其適當的位置
06-18
區塊範疇:`let`、`const` 與 `var` 的適當使用場景
06-18
IIFE:立即調用函式表達式
06-17
函式範疇的實際用途:最小暴露原則
06-17
詞彙範疇的視覺化:氣泡模型與編譯期優化
06-16
詞彙範疇:正式定義與動態範疇的對比
06-16
箭頭函式:不是萬能替代品
06-15
為什麼要命名函式表達式:三個不可迴避的理由
06-15
函式宣告 vs 函式表達式:識別字屬於哪個範疇
06-14
巢狀範疇 (Nested Scope):向外查找的完整鏈
06-14
詞彙範疇的邊界案例:遮蔽缺失與自動全域變數
06-13
執行階段:變數查找與目標/來源位置
06-13
編譯階段與範疇管理:彈珠桶子對話模型
06-12
範疇(Scope):JavaScript 的兩階段處理模型
06-12
TypeScript 的運算元型別驗證:被低估的功能
06-11
自訂型別與函式參數的型別標註
06-10
TypeScript 與 Flow 的型別推斷與型別標註
06-10
TypeScript 與 Flow:靜態型別工具的優點與侷限
06-09
相等性練習解析:`findAll` 的實作邏輯
06-09
相等性練習:實作受控制的強制相等搜尋函式
06-08
為 `==` 辯護:一個更強的論點
06-08
`==` 的使用準則:何時用、何時不用
06-07
`==` 與 Boolean 的角落案例:永遠不要用 `== true` 或 `== false`
06-07
`==` 演算法逐步走讀:數字與陣列的比較案例
06-06
`==` 演算法逐步解析:偏好數字、遞迴收斂
06-06
強制相等性:`==` 的實際運作與 `null`/`undefined` 的特殊關係
06-05
`==` 與 `===`:兩者的真正差異
06-05
強制轉型練習解析:`isValidName` 與 `hoursAttended`
06-04
強制轉型練習:實作輸入驗證函式
06-04
隱式轉型即抽象:選擇顯式還是隱式的判斷框架
06-03
強制轉型的哲學:擁抱它,而非迴避它
06-03
強制轉型的角落案例:所有問題的根源
06-02
Boxing:原始值存取屬性背後的隱式轉型
06-02
強制轉型的實際案例:你已經在用它了
06-01
`ToBoolean` 抽象操作:falsy 清單與 truthy 的判斷邏輯
06-01
`ToNumber` 抽象操作:數值轉換的規則與陷阱
05-31
`toString` 抽象操作:值的字串化規則與角落案例
05-31
抽象操作與 ToPrimitive:型別轉換的底層機制
05-30
基本物件:JavaScript 的內建建構函式
05-30
`Object.is()` Polyfill 解題解析
05-29
型別檢測練習:實作 `Object.is()` Polyfill
05-29
負零:JavaScript 中被刻意隱藏的特殊值
05-28
NaN:無效數字與正確的檢測方式
05-28
三種「空」:undefined、undeclared 與 uninitialized
05-27
BigInt:JavaScript 的大整數原始型別
05-27
`typeof` 運算子:辨識值的型別
05-26
JavaScript 型別系統:原始型別的正確定義
05-26
Private Static Fields:類別層級的私有共享資料
05-25
Private Instance Fields:真正的封裝
05-25
Public Instance Fields 的執行流程
05-24
`class` 的進階特性:`static` 方法與 Public Instance Fields
05-24
解法三的問題與 `class` 語法糖:解法四
05-23
`new` 關鍵字的完整執行流程
05-23
解法三:`new` 關鍵字與函式的雙重身份
05-22
方法內的巢狀函式與箭頭函式的 `this` 綁定
05-22
`Object.prototype`:原型鏈的頂端
05-21
原型鏈的運作機制與 `this`
05-21
解法二:用原型鏈共享方法,避免記憶體浪費
05-20
工廠函式:解決手動建立物件的第一種方法
05-20
Object Literal、Dot Notation、Object.create:三種建立物件的方式
05-19
物件導向 JavaScript:OOP 的核心目標與原型鏈基礎
05-19
Promise 錯誤處理、AbortSignal 與非同步 JavaScript 總結
05-18
Microtask Queue:Promise 回呼的優先執行機制
05-17
當 Callback Queue 遇上 Promise:執行順序追蹤
05-17
Promise 的運作機制:物件持久性、記憶體參照
05-16
ES6 Promises 與 fetch
05-16
ES5 Callback 模式的侷限,與 ES6 Promises 的登場
05-15
Event Loop:JavaScript 非同步執行的調度核心
05-15
Callback Queue 與執行規則:非同步回呼如何回到 JavaScript
05-14
Callback Function 與 Web Browser APIs 的運作原理
05-14
Promises、Async 與 Event Loop:為什麼 JavaScript 需要非同步機制
05-13
hint 參數、Symbol 本質與元程式設計
05-13
Symbol 與手動控制 ToPrimitive 強制轉換
05-12
ToPrimitive 強制轉換與 `@@toPrimitive` 隱藏屬性
05-12
Date 物件的隱藏屬性 `[[DateValue]]` 與方括號記法動態存取
05-11
JavaScript 記憶體模型:原始型別、Stack 與 Heap、物件參考比較
05-11
JavaScript 型別強制轉換三條路徑:ToNumber、ToString、ToBoolean
05-10
ToBoolean 強制轉換、寬鬆相等與嚴格相等
05-09
加法運算子的例外:型別強制轉換規則與手動控制
05-08
JavaScript 型別強制轉換:運算子、ToNumber 與 DOM 字串
05-07
Closure 的實際應用:once、memoize、Iterator 與 Module Pattern
05-06
Closure:為什麼每次呼叫外層函式都是全新開始
05-05
Closure 獨立性與變數查找順序:同一函式的多個閉包互不干擾
05-04
JavaScript Closure 的真實樣貌:Scope、COVE 與詞彙作用域
05-03
JavaScript Closure 背包機制:私有狀態如何被保留
05-02
JavaScript Closure 與背包(Backpack)的運作機制
05-01
JavaScript Closure 的核心問題:變數存取由定義位置還是呼叫位置決定?
04-30
JavaScript 函式回傳函式:執行環境 (Execution Context) 與 Call Stack 運作解析
04-29
JavaScript Closure(閉包):原理與核心應用
04-28
JavaScript 陣列變異方法與 ES2023 非變異替代方案(Pure Function、Side Effect)
04-27
箭頭函式(Arrow Function)、匿名函式與 map 方法
04-26
JavaScript 一級函式與高階函式(Higher-Order Function)入門
04-25
以 copyArrayAndManipulate 拆解高階函式 (Higher-Order Function) 的執行原理
04-24
JavaScript 執行上下文與高階函式:從重複程式碼到通用化設計
04-23
JavaScript 的 Higher-Order Functions:從 DRY 到函式作為參數
04-22
Call Stack 是什麼?理解 JavaScript 的呼叫堆疊機制
04-21
JavaScript 執行原理:執行緒、記憶體與執行環境(Execution Context)
04-20
CORS Config 解析:Preflight、Credentials 與 Response Headers
04-17
圖片格式完整比較:JPEG、PNG、WebP、AVIF 的壓縮、透明與色域差異
04-16
CSS Render Layer
02-27
從 HSTS 看網站安全:理解 Strict-Transport-Security Header
02-26
CSS 選擇器:如何只選中第一個 <li> 元素
02-25
理解 Set-Cookie 與 Cookie 的運作機制
02-20
CSS font-display 五種策略(auto/block/swap/fallback/optional)
02-17
XSS/CSRF/Clickjacking/MITM 名詞整理
02-16
HTML rel 屬性:noopener 與 noreferrer 的差異及安全性應用
02-14
理解 JavaScript Promise 方法:all、race、any、allSettled
02-10
理解 JavaScript Generator 函式與 yield 運作原理
01-09
HTML rel 屬性:noopener 與 noreferrer 的差異及安全性應用
01-07
2025
理解 Web Vitals | 提升網站效能與使用者體驗的關鍵指標
12-18
JavaScript WeakMap 與 Map 的差異及實際應用
12-17
CSS 選擇器權重 | Specificity
12-16
JavaScript 事件傳遞機制:Capturing 與 Bubbling 的執行順序
12-15
CSS 動畫的渲染成本(Layout、Paint、Composite)
12-13
JavaScript 垃圾回收機制:理解 Mark and Sweep 演算法與記憶體管理
12-12
HTTP Cache:快取指令與應用
12-11
從輸入網址到頁面載入:PerformanceNavigationTiming
12-10
JavaScript 展開運算子的淺拷貝陷阱:物件參考問題解析
12-09
前端資源預加載:dns-prefetch、preconnect、prefetch、preload
12-08
瀏覽器的呼叫堆疊與事件循環 | Call Stack & Event Loop
12-04
DNS 解析流程 | Resolving Domain Requests
12-04
渲染流程與合成 | Rendering Pipeline & Compositing
12-02
async vs. defer
12-01
bfcache 是什麼?為什麼 unload 會讓頁面失去 bfcache 資格
02-15