ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

dash.js 模块化集成指南:基于 Webpack 的 Babel 与 TypeScript 消费方案

dash.js 模块化集成指南:基于 Webpack 的 Babel 与 TypeScript 消费方案 音视频前端【免费下载链接】dash.jsA reference client implementation for the playback of MPEG DASH via Javascript and compliant browsers.项目地址https://gitcode.com/gh_mirrors/da/dash.js点击查看免费下载本文以 dash.js 官方仓库samples/modules目录下的模块样例为核心系统讲解如何在不同的模块加载器Webpack Babel、Webpack TypeScript以及 UMD/CommonJS 模式中正确引入并初始化 dash.js 播放器。读者将掌握每个样例的完整构建配置、入口代码与运行方式并理解 dash.js 包导出结构exports字段、ESM/UMD 构建产物与index.d.ts声明文件背后的实现原理从而在自己的工程化项目中正确接入 dash.js。模块样例概览四种消费形态[samples/modules](https://link.gitcode.com/i/32c309406023e0073b986266667df08a)目录下包含四个相互独立的样例工程它们展示了 dash.js 在不同模块加载器下的四种消费方式目录技术栈核心特点webpack/Webpack Babel Loader ES2015 Preset直接在构建时消费 dash.js 源码/ESM 产物typescript/Webpack ts-loader使用 TypeScript 编写入口替代 Babel 方案typescript-smooth/TypeScript ESM 导入额外导入 MSSSmooth StreamingESM 构建产物typescript-smooth-umd-cjs/TypeScript UMD/CommonJS以require()方式加载 UMD 构建产物每个目录都是一个独立、可运行的 package自带package.json、webpack.config.js、入口源码与index.html页面模板。构建命令统一为npm run build详见各目录package.json的scripts.build字段产物输出到dist目录。说明样例 READMEsamples/modules/README.md中描述构建结果会放置在out/out.js而当前仓库各样例的 webpack 配置实际将产物输出到各目录下的dist目录如dist/out.js、dist/bundle.js。以实际配置为准。本地依赖的引入方式四个样例的package.json均通过文件依赖方式引入 dash.jsdependencies: { dashjs: file:../../.. }file:../../..指向仓库根目录即 dash.js 项目本身因此在执行npm install时会把当前仓库的 dash.js 作为本地包安装到node_modules下构建时使用的即是当前仓库的源码与产物无需发布到 npm registry。方案一Webpack Babel Loader对应样例目录samples/modules/webpack。该方案适合使用 Babel 做 ES2015 语法转译、直接以 ES Module 风格导入 dash.js 的工程。构建配置package.json的构建脚本直接调用本地安装的 webpack 二进制scripts: { build: ./node_modules/webpack/bin/webpack.js }webpack.config.js完整文件的核心配置const HtmlWebpackPlugin require(html-webpack-plugin); const path require(path); module.exports { entry: ./src/entry.js, output: { path: path.resolve(__dirname, dist), filename: out.js }, module: { rules: [ { test: /\.(js)$/, exclude: /node_modules/, use: [ { loader: babel-loader, options: { presets: [babel/env] } } ] } ] }, plugins: [ new HtmlWebpackPlugin({ inject: true, filename: index.html, template: index.html }) ] };要点解读入口为src/entry.js输出文件名为out.js输出目录为distBabel 规则只处理.js文件且排除node_modulespreset 使用babel/env对应 README 中提到的 ES2015 Preset 演进形态HtmlWebpackPlugin以index.html为模板、自动注入打包产物保证最终生成的页面可直接打开播放。入口代码src/entry.js 展示了最小可用的播放器初始化流程import * as dashjs from dashjs; let url https://dash.akamaized.net/envivio/Envivio-dash2/manifest.mpd; let player dashjs.MediaPlayer().create(); player.updateSettings({ debug: { logLevel: 5 } }) player.initialize(document.querySelector(#myMainVideoPlayer), url, true); document.querySelector(#version).innerHTML Version player.getVersion();这段代码覆盖了四个关键 APIdashjs.MediaPlayer().create()创建播放器实例。底层由 MediaPlayerFactory 实现它会校验video元素、查找application/dashxml类型的source并返回一个已初始化的 MediaPlayer 实例updateSettings({ debug: { logLevel: 5 } })以增量方式更新播放器设置。注意该 API 是部分更新语义——updateSettings只会修改传入的属性未指定的属性保持不变见 MediaPlayer.js 中 updateSettings 的文档注释如需恢复默认值可调用resetSettings()initialize(videoElement, url, autoPlay)绑定video元素、加载 MPD 清单并开始播放第三个参数true表示自动播放getVersion()返回当前 dash.js 版本字符串可用于页面调试信息展示。其中logLevel: 5对应LOG_LEVEL_DEBUG。dash.js 的日志级别定义在 src/core/Debug.js默认级别为LOG_LEVEL_WARNING3定义于 src/core/Settings.js常量数值说明dashjs.Debug.LOG_LEVEL_NONE0关闭所有日志dashjs.Debug.LOG_LEVEL_FATAL1仅致命错误dashjs.Debug.LOG_LEVEL_ERROR2错误dashjs.Debug.LOG_LEVEL_WARNING3警告默认值dashjs.Debug.LOG_LEVEL_INFO4常规信息dashjs.Debug.LOG_LEVEL_DEBUG5调试级详细日志配套的 index.html 提供了640x360的video idmyMainVideoPlayer controls元素与#version显示区域与入口代码一一对应。方案二Webpack TypeScript对应样例目录samples/modules/typescript。该方案与方案一逻辑相同但用 TypeScript ts-loader 取代 Babel适合已有 TypeScript 工程基础的团队。构建与编译器配置package.json的构建脚本为scripts: { build: webpack --config webpack.config.js }webpack.config.js 中关键的模块规则改为 ts-loadermodule: { rules: [ { test: /\.tsx?$/, use: ts-loader, exclude: /node_modules/, }, ], }, resolve: { extensions: [.tsx, .ts, .js], }, output: { filename: bundle.js, path: path.resolve(__dirname, dist), },tsconfig.json 采用module: ESNext、target: es5并开启了allowJs、esModuleInterop、allowSyntheticDefaultImports与noImplicitAny其中esModuleInterop与allowSyntheticDefaultImports对正确导入 dash.js 这类同时提供命名导出与默认导出的库至关重要。入口代码src/index.ts 与 Babel 方案的差异很小import * as dashjs from dashjs; let url https://dash.akamaized.net/envivio/Envivio-dash2/manifest.mpd; let player dashjs.MediaPlayer().create(); // ts-ignore player.initialize(document.querySelector(#myMainVideoPlayer), url, true); let version player.getVersion(); document.getElementById(version-output).innerText Version ${version};这里import * as dashjs from dashjs之所以能在 TypeScript 中通过类型检查得益于仓库根目录的声明文件 index.d.ts——其开头即声明export as namespace dashjs;对外暴露了完整的 MediaPlayer 类型体系。方案三与方案四TypeScript Smooth Streaming 的两种导入形态Smooth StreamingMSS是 dash.js 除 DASH 外支持的另一种流媒体格式MPEG-DASH 之外样例使用 PlayReady 平滑流清单 URL 演示。这两个样例演示了同一功能下 ESM 与 UMD/CJS 两种消费方式的差别。ESM 形态typescript-smoothsrc/index.ts 的关键在于额外显式导入 MSS 的 ESM 构建产物import * as dashjs from dashjs; import ../node_modules/dashjs/dist/modern/esm/dash.mss.min.js; let url https://playready.directtaps.net/smoothstreaming/SSWSS720H264/SuperSpeedway_720.ism/Manifest; let player dashjs.MediaPlayer().create(); // ts-ignore player.initialize(document.querySelector(#myMainVideoPlayer), url, true);由于 MSS 支持代码被打包在独立的dash.mss.min.js构建中需要在入口处先于播放器初始化将其导入dash.js 才能识别并解析 Smooth Streaming 清单。其tsconfig.json与 typescript 样例相同module: ESNext。UMD/CommonJS 形态typescript-smooth-umd-cjssrc/index.ts 改用require()加载 UMD 构建并通过全局对象dashjs访问播放器require(../node_modules/dashjs/dist/legacy/umd/dash.all.min.js); require(../node_modules/dashjs/dist/legacy/umd/dash.mss.min.js); if (dashjs dashjs.MediaPlayer) { let url https://playready.directtaps.net/smoothstreaming/SSWSS720H264/SuperSpeedway_720.ism/Manifest; let player dashjs.MediaPlayer().create(); // ts-ignore player.initialize(document.querySelector(#myMainVideoPlayer), url, true); } else { console.error(dashjs.MediaPlayer is undefined); }该样例在访问全局dashjs前做了存在性检查规避 UMD 全局对象未定义的问题其 tsconfig.json 将module设为commonjs并通过include显式纳入./node_modules/dashjs/index.d.ts与入口文件使 TypeScript 能识别dashjs全局命名空间对应声明文件中的export as namespace dashjs。四个样例的页面模板index.html结构基本一致video idmyMainVideoPlayer controls加上一个版本信息输出元素#version或#version-output源码可分别查看 webpack/index.html、typescript/index.html。源码级原理dash.js 如何被模块加载器解析要理解上述四种方案为何可行需要看仓库根目录 package.json 中的exports字段——它定义了包在不同模块系统下的解析入口exports: { .: { types: ./index.d.ts, import: ./dist/modern/esm/dash.all.min.js, browser: ./dist/modern/umd/dash.all.min.js, script: ./dist/modern/umd/dash.all.min.js, require: ./dist/modern/umd/dash.all.min.js, default: ./dist/modern/esm/dash.all.min.js }, ./mss: { types: ./index.d.ts, import: ./dist/modern/esm/dash.mss.min.js, browser: ./dist/modern/umd/dash.mss.min.js, script: ./dist/modern/umd/dash.mss.min.js, require: ./dist/modern/umd/dash.mss.min.js, default: ./dist/modern/esm/dash.mss.min.js } }由此可以总结出几条可直接复用的结论ESM 风格导入如import * as dashjs from dashjs会命中import条件解析到dist/modern/esm/dash.all.min.jsCommonJS/require 风格会命中require条件解析到dist/modern/umd/dash.all.min.js——这也是 UMD/CJS 样例中dashjs.MediaPlayer作为全局变量可用的原因UMD 产物会同时挂载到window.dashjsMSS 能力必须通过dash.mss.min.js单独引入即 ESM 样例中显式import、UMD 样例中显式require的那一行所有路径均指向types条件./index.d.ts保证 TypeScript 用户获得完整类型提示。此外package.json声明type: module且engines.node要求 20意味着构建这些样例即运行 webpack 等工具链需要 Node.js 20 或更高版本而dashjs包自身面向浏览器运行时构建产物则区分 modernESM/UMD与 legacy 两套。版本兼容性提醒样例 READMEsamples/modules/README.md明确指出dash.js v2.6.3 及以下版本存在模块/类导出方式与声明文件.d.ts方面的问题导致这些样例在旧版本上无法直接工作。如果你正在维护基于 webpack 的老项目并受限于 2.6.3 及以下版本需要查阅 dash.js 官方 FAQ 中关于旧版本 webpack 集成的内容当前仓库版本 5.2.2已不存在该问题可直接按上文方案集成。运行步骤小结进入目标样例目录例如samples/modules/typescript执行npm install安装 webpack、ts-loader/babel-loader 等依赖并安装本地 dash.jsfile:../../..执行npm run build生成dist目录下的打包产物含 HtmlWebpackPlugin 生成的index.html在浏览器中打开生成页面即可看到 dash.js 播放器加载 MPD/Smooth Streaming 清单并播放。如需验证功能是否完整可将样例入口中的 URL 替换为你自己的 DASH 清单地址并通过player.getVersion()输出确认播放器版本与调试信息。赞分享音视频前端【免费下载链接】dash.jsA reference client implementation for the playback of MPEG DASH via Javascript and compliant browsers.项目地址https://gitcode.com/gh_mirrors/da/dash.js点击查看免费下载相关推荐终极指南babel-loader 与 Webpack 5 的深度集成方案终极指南babel loader 与 Webpack 5 的深度集成方案 babel loader 作为 Webpack 生态中不可或缺的转译工具为现代 J前端构建开发工具用GTweak源码学习单文件打包Costura.Fody集成实战指南用GTweak源码学习单文件打包Costura.Fody集成实战指南 GTweak 是一款轻量便携的 Windows 系统优化工具它把主程序和全部依赖库打进桌面应用Jest与Webpack集成模块化测试的完整解决方案Jest与Webpack集成模块化测试的完整解决方案 在现代前端开发中 Jest与Webpack集成 已经成为构建高质量应用的关键环节。通过这种集成方案开测试质量保障代码覆盖率开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进