UnoCSS 掃描失控導致開發崩潰?一次解決 EMFILE 問題指南

作者: Calpa Liu
字數:690
出版:2025 年 4 月 24 日
分類: 前端開發 AstroUnoCSS效能優化Debug 教學
在 Astro 開發中遇到 EMFILE 錯誤?可能是 UnoCSS 掃描範圍設太廣導致。本文記錄完整除錯過程與最佳修正方式,讓你開發環境重回穩定!

在使用 Astro + UnoCSS 建構內容驅動網站時,我遇到了一個非常惱人的錯誤:

Error: EMFILE: too many open files, open 'node_modules/caniuse-lite/data/regions/XX.js'

這個錯誤導致開發伺服器無法啟動,即使提升 ulimit 上限也只能暫時解決。最終我發現,根本原因來自 UnoCSS 掃描過廣的檔案系統路徑設定。以下是完整的除錯過程與解法分享。

問題背景:Astro 開發模式報錯 EMFILE

在執行 npx astro dev 時,錯誤訊息如下:

Error: EMFILE: too many open files, open '.../caniuse-lite/data/regions/NL.js'

同時,CHOKIDAR_DEBUGulimit -n 無法根本解決問題,代表有某個套件開啟過多檔案。

找出元兇:UnoCSS 掃描整個專案目錄

我的原始 uno.config.ts 設定如下:

export default defineConfig<Theme>({
  content: {
    filesystem: ["**/*.{html,js,ts,jsx,tsx,vue,astro,md}"], // 🚨 問題所在
  },
  presets: [presetWind3()],
});

這個設定會讓 UnoCSS 掃描整個專案,包括 node_modules.gitpublic.cache 等目錄。這種廣泛的掃描範圍導致了嚴重的效能問題。

特別是 node_modules 目錄中的 caniuse-lite 套件,它被 Autoprefixer 廣泛使用。當 UnoCSS 試圖掃描這個目錄時,會開啟大量檔案,最終導致系統達到 open() 函數的數量上限,引發 EMFILE 錯誤。

這種設定不僅會大幅降低開發環境的效能,還可能造成系統資源的過度消耗。因此,限制 UnoCSS 的掃描範圍成為解決這個問題的關鍵。

解法:限制 UnoCSS 掃描範圍

將掃描路徑限制在 ./src/ 資料夾內即可解決問題:

import { defineConfig, presetWind3 } from "unocss";
import type { PresetWind3Theme as Theme } from "unocss";

export default defineConfig<Theme>({
  content: {
    filesystem: ["./src/**/*.{html,js,ts,jsx,tsx,vue,astro,md}"], // ✅ 正確作法
  },
  presets: [presetWind3()],
});

建議同時搭配排除項目以確保穩定性:

import { defineConfig, presetWind3 } from "unocss";
import type { PresetWind3Theme as Theme } from "unocss";

export default defineConfig<Theme>({
  content: {
    filesystem: ["./src/**/*.{html,js,ts,jsx,tsx,vue,astro,md}"],
    pipeline: {
      exclude: ["node_modules", ".git", "public", "dist", ".cache"],
    },
  },
  presets: [presetWind3()],
});

總結

這次的 Debug 經驗讓我深刻理解到,效能優化不僅僅依賴硬體資源,更重要的是正確的配置和合理的邊界設定。UnoCSS 的掃描範圍應該限制在 src/ 目錄內,同時搭配 exclude 選項來避免掃描大型資料夾如 node_modules。此外,遇到 EMFILE 錯誤時,應優先檢查 chokidar、UnoCSS、Tailwind 等工具的掃描行為。

對於在 macOS 上頻繁遇到此類問題的開發者,可以考慮永久提升 ulimit -n 的值。然而,最關鍵的是要謹記:永遠不要讓 UnoCSS 掃描整個專案根目錄。通過這些經驗教訓,我希望能幫助其他 Astro + UnoCSS 開發者避免陷入相同的陷阱,從而提高開發效率和項目穩定性。

前端開發 Astro UnoCSS 效能優化 Debug 教學
關於 Calpa

Calpa 擅長使用 TypeScriptReact.jsVue.js 建立 Responsive Website。

他積極參與開源社區,曾在 2019 年的香港開源大會上擔任講者,提供工作經驗和見解。此外,他也在 GitHub 上公開分享個人博客程式碼,已獲得超過 300 顆星星和 60 個分支的支持。

他熱愛學習新技術,並樂意分享經驗。他相信,唯有不斷學習才能跟上快速演變的技術環境。

熱門文章

最新文章

圖片管理中心
管理圖片資源
IP 查詢
快速查詢和定位 IP 地址的地理位置和相關信息
Python 運行器
無需後端、無需登入,只需打開瀏覽器即可運行 Python 代碼(由 Pyodide 提供支持)
封面圖生成器
自動創建適合各種平台的文章封面圖
原作(青山剛昌)產生器
一鍵創建原作(青山剛昌)的封面圖
日本色彩
探索和使用傳統日本色彩
部落格內容洞察儀表板
以視覺化儀表板方式追蹤文章成效、分享熱度與分類分布,協助創作者掌握內容表現。
蒙特卡羅估算 π
使用蒙特卡羅方法演示 π 值的估算過程
LLM
使用 LLM 模型進行聊天
活動圖生成器
一鍵創建活動的封面圖
Wagmi Card
一鍵創建 Wagmi 的封面圖
Facebook Quote
Facebook Quote
Music Macro Language (MML) Studio
用程式語法編寫旋律,用音符構築想像
Blurhash
一鍵創建 Blurhash
文字分類器
使用 MediaPipe TextClassifier 分類文字
前端工程師免費工具資源
前端工程師免費工具資源
後端工程師免費工具資源
後端工程師免費工具資源
全端工程師免費工具資源
全端工程師免費工具資源
Web3 工程師免費工具資源
Web3 工程師免費工具資源
紫微斗數排盤系統|結合 AI 的命盤性格與事業財務分析生成器
紫微斗數排盤工具,輸入生日與時辰,自動生成完整命盤分析提示(Prompt)。結合最專業紫微理論與 AI 助力,助你深入解析性格、事業、財務與人際課題。免費使用,適合命理師及紫微愛好者。
PixAI Prompt 組合器|快速打造可用於 AI 繪圖的語言拼圖
使用 PixAI 卻不會寫 prompt?這個工具幫你一鍵組裝角色、表情、風格語彙,輸出高品質繪圖提示語句(Prompt),可直接貼入 PixAI 使用。適合插畫師、創作者、AI 新手與 VTuber 角色開發者。