執行期依賴
本頁列出 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 或函式作用域即可避免。