# v1 停用說明

v2 只提供 Markdown 解析器 `MDParser`；本頁列出 v1 移除的 API、替代方式、遷移範例與 v1／v2 效能比較。

## 繼續使用 v1

v1 的 `MDEditor`、`MDViewer` 與 `MDParser` 類別已停用，不再開發新功能。需要編輯器的專案固定使用 1.11.6：

```html
<script src="https://cdn.jsdelivr.net/npm/@pardnchiu/nanomd@1.11.6/dist/NanoMD.js"></script>
```

```bash
npm i @pardnchiu/nanomd@1.11.6
```

請寫明確的版本號；`@latest` 或不帶版本號會解析到 v2。

## 已移除的 API

| v1 | 移除於 | v2 替代做法 |
|---|---|---|
| `MDEditor` | 移除於 v2.0.0 | 改用 `<textarea>`、CodeMirror、Monaco 等編輯器，內容交給 `MDParser.Parse()` |
| `MDViewer` | 移除於 v2.0.0 | `container.innerHTML = MDParser.Parse(text).html()` 後呼叫 `MDParser.Refresh(container)` |
| `new MDParser({ standard }).parse(text)` | 移除於 v2.0.0 | `MDParser.Parse(text).html()`；`standard` 選項取消，一律支援完整語法 |
| `PDMarkdownEditor` | 移除於 v2.0.0 | 無公開替代 |
| ESM 匯出 `editor`、`viewer` | 移除於 v2.0.0 | `import { MDParser } from "@pardnchiu/nanomd"` |
| `sync.editor`、`sync.delay`、`sync.scroll` | 移除於 v2.0.0 | 自行監聽輸入並防抖，見下方遷移範例 |
| `emptyContent` | 移除於 v2.0.0 | 由呼叫端決定空內容要渲染什麼 |
| `hashtag.path`、`hashtag.target` | 移除於 v2.0.0 | 無公開替代；`#tag` 輸出為一般文字 |
| `changeMode()`、`style.mode` | 移除於 v2.0.0 | 在 `.nanomd` 容器設定 `data-mode`，見 [樣式主題](/zh/theming) |
| `style.fill` | 移除於 v2.0.0 | 在 `.nanomd` 容器設定 `data-fill="1"` |
| `download()`、`openfile()`、`undo()`、`redo()`、快捷鍵與工具列 | 移除於 v2.0.0 | 隨 `MDEditor` 移除，無公開替代 |

## 檔案與樣式

| v1 | v2 |
|---|---|
| `dist/NanoMD.js` | `dist/parser.js`（全域 `MDParser`） |
| `dist/NanoMD.esm.js` | `dist/parser.esm.js` |
| `dist/NanoMD.css`、`dist/NanoMD-output.css` | `dist/parser.css`，由 `parser.js` 自動從同目錄載入 |
| 容器 class `.pd-md-viewer` | `.nanomd` |
| 載入時自動插入 Material Symbols、Mermaid、code-prettify | 以 `MDParser.Init({ enable })` 按需載入，見 [依賴與 Refresh](/zh/runtime-dependencies) |

## 行為差異

| 項目 | v1.11.6 | v2 |
|---|---|---|
| 文字中的 `$` | 輸出為 `@dollar@` | 原樣輸出；成對的 `$...$` 為行內數學式 |
| YouTube／Vimeo 預覽 | 未設定 `hashtag.path` 時不產生 | 一律附上內嵌播放器 |
| raw HTML | 不清洗 | 移除危險標籤、事件屬性與 `javascript:` 網址 |
| Mermaid 語法錯誤 | 顯示 Mermaid 錯誤圖 | 改顯示為一般程式碼區塊 |
| 執行環境 | 需要瀏覽器 DOM | `Parse()`、`html()` 可在 Node.js、Worker 執行 |

## v1 vs v2

同一份範例文件重複放大後，在 headless Chrome 量測轉成 HTML 的耗時；超過 15 秒記為超時，超時列的倍數以 15 秒計算為下限。

| 文件大小 | v1.11.6 `MDParser().parse()` | v2 `Parse().html()` | 倍數 |
|---|---|---|---|
| 4.4 KB | 2.6 ms | 0.4 ms | 7× |
| 44.3 KB | 29.6 ms | 1.8 ms | 16× |
| 443.4 KB | 1,790 ms | 17.7 ms | 101× |
| 1.08 MB | 11,037 ms | 47.4 ms | 233× |
| 2.16 MB | 超時 | 82.3 ms | 182× 以上 |
| 4.33 MB | 超時 | 156.4 ms | 96× 以上 |

## 遷移範例

v1 的編輯器加檢視器，在 v2 改為任一編輯器加防抖渲染：

```demo
<textarea id="editor" rows="4" style="width:100%"># Hello

Edit me, the preview updates after you stop typing.</textarea>
<div id="viewer" class="nanomd"></div>
<script>
  const editor = document.getElementById("editor");
  const viewer = document.getElementById("viewer");
  let timer;

  function render() {
    viewer.innerHTML = MDParser.Parse(editor.value).html();
    MDParser.Refresh(viewer).catch((err) => console.error(err.message));
  }

  editor.addEventListener("input", () => {
    clearTimeout(timer);
    timer = setTimeout(render, 300);
  });
  render();
  console.log(viewer.querySelector(".md-h1").textContent);
</script>
```
