# 執行期依賴

本頁列出 NanoMD 載入時自動引入的外部資源、在全域範圍定義的名稱，以及離線或嚴格 CSP 環境需要注意的事。

## 自動插入的資源

bundle 一被執行，`src/data.js` 就在 `<head>` 末端插入下列元素，不需要也無法關閉：

| 資源 | 來源 | 用途 |
|---|---|---|
| Material Symbols Outlined | `fonts.googleapis.com`（另加 `fonts.gstatic.com` preconnect） | 工具列、提示框、匯出視窗圖示 |
| Mermaid 11.4.1 | `cdn.jsdelivr.net/npm/mermaid@11.4.1` | Mermaid 圖表 |
| code-prettify | `cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js` | 程式碼高亮（全域 `PR`） |
| `NanoMD.css` 1.11.6 | `cdn.jsdelivr.net/npm/@pardnchiu/nanomd@1.11.6` | 元件樣式 |

每個資源都附帶 `preload` 或 `preconnect` 的 `<link>`。`document` 觸發 `load` 時會呼叫 `mermaid.initialize({ startOnLoad: false, ... })` 並在 console 印出版權資訊。

## 對渲染的影響

| 情況 | 結果 |
|---|---|
| CDN 無法連線（離線、內網、被 CSP 擋下） | `PR` 從未宣告，預覽器每 50 ms 的檢查都拋出 `ReferenceError` 且計時器不會停止；HTML 仍會渲染，但捲動位置不會還原、程式碼不上色、Mermaid 不轉換 |
| Mermaid 未載入 | `PR` 已載入但 `mermaid` 不存在時，每次渲染結尾拋出一次 `ReferenceError`；`document` 的 `load` 處理也會拋出 |
| 圖示字型未載入 | 工具列顯示圖示名稱文字（如 `format_bold`） |

需要離線使用時，可先在頁面放置 `window.PR`（自行託管的 code-prettify）與 `window.mermaid`，NanoMD 不會檢查來源，只看全域變數是否存在。

## CSP 白名單

| 指令 | 需要允許 |
|---|---|
| `script-src` | `https://cdn.jsdelivr.net` |
| `style-src` | `https://cdn.jsdelivr.net`、`https://fonts.googleapis.com`、`'unsafe-inline'`（建構時插入 `<style>`） |
| `font-src` | `https://fonts.gstatic.com` |
| `connect-src` | `https://vimeo.com`（Vimeo 縮圖） |
| `frame-src` | `https://www.youtube.com`、`https://player.vimeo.com` |
| `img-src` | `https://i.ytimg.com`、Vimeo 縮圖網域、`data:` |

## 全域名稱

以一般 `<script>` 載入 `NanoMD.js` 時，所有頂層宣告都進入全域；以 ESM 匯入 `NanoMD.esm.js` 時頂層宣告留在 module 作用域，但公開類別與 `window` 屬性仍會寫到 `window`：

| 類型 | 例子 |
|---|---|
| 公開類別 | `MDEditor`、`MDViewer`、`MDParser`、`PDMarkdownEditor`、`PDMarkdownViewer` |
| 內部函式 | `createElement`、`transToHTML`、`UUID`、`escapeHTML`、`setLink` 等 |
| 內部常數 | `css`、`deploy`、`cloud`、`isDarkMode`、`elementUUIDMap` 等 |
| `window` 屬性 | `_0`、`$0`、`_0_`、`__0`、`_a` 等由字母表迴圈產生的短名稱 |

以一般 script 載入時，頁面上其他一般 script 若以 `const`／`let`／`class` 在全域宣告同名識別字（例如 `createElement`、`css`），後載入的那一支會拋出 `SyntaxError: Identifier has already been declared`。把自己的程式包進 module 或函式作用域即可避免。
