CDN
The files the Video.js CDN serves and the layout rules behind their URLs
Video.js can run straight from <script> tags. Our CDN serves @videojs/html in prebuilt, browser-ready bundles which register custom elements. For many pages, it takes only one script tag:
<script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/html@10.0.0-beta.32/cdn/video.js"></script>
<video-player>
<video-skin>
<video src="video.mp4"></video>
</video-skin>
</video-player>URLs
Every file the CDN serves follows one URL pattern:
https://cdn.jsdelivr.net/npm/@videojs/html@<version>/cdn/<file>Player bundles
Each installation preset ships its bundles at the root of cdn/: one per skin choice, plus a player-only bundle. For the video preset:
| File | Registers |
|---|---|
video.js |
<video-player>, <video-skin>, and the UI elements the skin composes |
video-minimal.js |
<video-player>, <video-minimal-skin>, and the UI elements the minimal skin composes |
video-player.js |
<video-player> alone, for markup without a packaged skin |
The other presets follow the same pattern. Background video is the exception: one bundle, background.js, registers the player, the skin, and the <background-video> media element.
A skin bundle registers every UI element its skin is built from. The CDN publishes no per-component bundles, though. If you’ve ejected the skin and need to add new components, install from npm instead of from the CDN.
Media bundles
The default presets play through the browser’s own <video> and <audio>. Every other media element is its own bundle under media/, loaded beside the player bundle:
<script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/html@10.0.0-beta.32/cdn/video.js"></script>
<script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/html@10.0.0-beta.32/cdn/media/hlsjs-video.js"></script>Each path mirrors its npm subpath. Elements with more than one playback engine keep the extra flavors in a directory named for the element, such as media/mux-video/spf.js. Load one flavor per page: every flavor claims the same tag name, and the first registration wins.
Extension bundles
Each extension is its own bundle under extensions/, loaded beside the player and media bundles:
<script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/html@10.0.0-beta.32/cdn/video.js"></script>
<script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/html@10.0.0-beta.32/cdn/media/mux-video.js"></script>
<script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/html@10.0.0-beta.32/cdn/extensions/mux-data.js"></script>As with media, each path mirrors its npm subpath: extensions/mux-data.js registers the element that @videojs/html/extensions/mux-data does.
Locales
English ships inside the skin bundles. Each other locale is a bundle under locales/ that registers its translations on import. Load it before the player script to avoid a flash of English:
<script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/html@10.0.0-beta.32/cdn/locales/es.js"></script>
<script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/html@10.0.0-beta.32/cdn/video.js"></script>One bundle exists per locale pack, plus bare-language aliases such as pt. For custom strings, see Internationalize the player.
Stylesheets
The skin bundles inline their CSS, so no <link> is required to render. The separate .css files do the jobs a bundle cannot:
global.cssholds the light-DOM rules. Link it in<head>and the player reserves its space before the elements upgrade. The background preset usesbackground.cssinstead.- The skin sheets, such as
video.cssbesidevideo.js, style declaratively rendered skins. shared.cssis the base that hand-written shadow skins build on.
Self-host the player shows both in use.
Development bundles
Every JavaScript entry has a .dev.js sibling, such as video.dev.js, built with development warnings on. Swap the suffix while debugging; swap it back to ship.
Shared chunks
Everything else at the root, like the content-hashed default-*.js files, is a shared chunk the entries import by relative path. Entries share these chunks, so loading several bundles stays cheap. Chunk names change every release: never link a chunk directly, and never copy a lone entry file. To mirror the CDN, copy the whole cdn/ directory and keep its layout; Self-host the player covers it.