跳轉到主要內容
星罗
搜尋
切換語言
返回

媒體播放器

2 分鐘閱讀 在 GitHub 上編輯

媒體播放器

星羅整合 APlayer(音樂播放器)與 DPlayer(影片播放器),支援在 Markdown 與 MDX 中透過兩種方式建立播放器,統一懶載入。

啟用

在 xingluo.config.ts 的 features.players 中按需開啟:

ts
features: { players: { aplayer: true, // 啟用 APlayer 音樂播放器 dplayer: true, // 啟用 DPlayer 影片播放器 }, }

兩者可獨立開關。關閉時:

  • remarkPlayers 外掛不注入(MD 圍欄不解析)
  • 播放器客戶端指令碼不載入
  • 產物無 aplayer / dplayer chunk

兩種使用方式

方式適用場景語法
MD 圍欄普通 .md 與 .mdx```aplayer / ```dplayer + JSON 設定體
MDX 元件僅 .mdximport { APlayer, DPlayer } from "@/components/mdx"

兩種方式最終輸出相同的佔位 div 結構(<div class="xng-aplayer|xng-dplayer" data-config>),由 src/scripts/players.ts 統一懶載入實例化。

APlayer 音樂播放器

MD 圍欄

markdown
```aplayer { "audio": [ { "name": "曲名", "artist": "藝術家", "url": "/audio/song.mp3", "cover": "/images/cover.jpg", "lrc": "[00:00.00] 歌詞第一行" } ], "theme": "#b7daff", "loop": "all", "autoplay": false } ```

MDX 元件

mdx
import { APlayer } from "@/components/mdx"; <APlayer audio={[ { name: "曲名", artist: "藝術家", url: "/audio/song.mp3", cover: "/images/cover.jpg", }, ]} theme="#b7daff" loop="all" />

設定項

欄位類型預設值說明
audioAudio | Audio[]必填音訊物件或列表
themestring#b7daff播放器主題色
loop"all" | "one" | "none"all迴圈模式
order"list" | "random"list播放順序
volumenumber0.7初始音量(0~1)
autoplaybooleanfalse自動播放(受瀏覽器策略限制)
listFoldedbooleanfalse列表折疊
listMaxHeightstring—列表最大高度(CSS 值)
lrcType0 | 1 | 2 | 30歌詞類型:0 不解析 / 1 字串 / 2 URL

audio 物件

欄位說明
name曲目名(預設取 title,再預設 'Audio name')
artist藝術家(預設取 author)
url音訊位址(必填)
cover封面(預設取 pic)
lrc歌詞(字串或 URL,配合 lrcType)
theme單曲主題色
type音訊類型:auto | hls | normal

DPlayer 影片播放器

MD 圍欄

markdown
```dplayer { "video": { "url": "/videos/demo.mp4", "pic": "/images/video-cover.jpg", "type": "auto" }, "theme": "#b7daff", "autoplay": false, "loop": false } ```

MDX 元件

mdx
import { DPlayer } from "@/components/mdx"; <DPlayer video={{ url: "/videos/demo.mp4", pic: "/images/video-cover.jpg" }} theme="#b7daff" subtitle={{ url: "/subtitles.vtt", type: "webvtt" }} />

設定項

欄位類型預設值說明
videoVideo必填影片設定
themestring#b7daff主題色
autoplaybooleanfalse自動播放
loopbooleanfalse迴圈播放
screenshotbooleanfalse截圖功能
hotkeybooleantrue熱鍵
preload"none" | "metadata" | "auto"auto預載入
volumenumber0.7初始音量
playbackSpeednumber[]—播放速度列表
subtitleSubtitle—字幕
danmakuDanmaku—彈幕
livebooleanfalse直播模式
mutexbooleantrue互斥(同頁僅一個播放)

video 物件

欄位說明
url影片位址(必填)
pic封面
thumbnails縮圖位址
type影片類型:auto | hls | flv | dash | normal
quality多清晰度列表 + defaultQuality 索引

subtitle 物件

欄位說明
url字幕位址(必填)
typewebvtt | ass
fontSize字型大小
bottom距底部距離
color顏色

danmaku 物件(彈幕)

欄位說明
id彈幕池唯一 ID(必填)
api彈幕 API 位址(必填)
user使用者標識
maximum最大彈幕數

懶載入機制

播放器透過 IntersectionObserver 懶載入:佔位 div 進入視口前 200px 時才動態 import 播放器模組與樣式並實例化。

  • APlayer:動態 import("aplayer") + import("aplayer/dist/APlayer.min.css")
  • DPlayer:動態 import("dplayer")(樣式內聯於 JS,無需單獨載入 CSS)

模組載入透過共享 Promise 快取,避免重複動態 import。防重複實例化透過 dataset 標記(xng-init、xng-observed)。

View Transitions 適配

播放器指令碼監聽 astro:page-load,每次頁面載入後重新掃描佔位 div。View Transitions 切換頁面後,新頁面的播放器佔位會被重新觀察與懶載入。

效能最佳化

  • 關閉播放器時零打包(remark 外掛不注入、客戶端指令碼不載入)
  • 啟用但頁面無播放器時零執行時(指令碼載入但不實例化)
  • 播放器模組獨立 chunk,僅在使用頁面按需載入
  • CSS 與 JS 分開 import,確保樣式先於實例化就緒

型別宣告

APlayer 與 DPlayer 無官方 TypeScript 型別,星羅在 src/types/aplayer.d.ts 與 src/types/dplayer.d.ts 提供寬鬆模組宣告,options 欄位設為可選以相容 spread 呼叫。MDX 元件的 Props 有完整型別約束。


相關文章

  • 部署

    1 分鐘閱讀

    星羅部署指南,涵蓋靜態託管平台(Netlify/Vercel/GitHub Pages)、Nginx 自託管、Docker 與環境變數。

  • 搜尋

    1 分鐘閱讀

    星羅搜尋功能說明,涵蓋 Flexsearch 全文搜尋整合的索引生成、UI、多語言搜尋與效能最佳化。