webpack 与 video.js 一同使用的一些坑
Posted SegmentFault
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webpack 与 video.js 一同使用的一些坑相关的知识,希望对你有一定的参考价值。
video.js 是一个优秀的视频播放器库,不过官网的示例中,是作为全局变量videojs
引入的。如果我们的项目使用 ES6 风格的模块,用 webpack 来做打包的话,就需要做一些额外的工作。本文介绍我在使用的时候遇到的一些“坑”。
基本使用方法
直接从 npm 安装 video.js,然后就可以在代码中使用 video.js 了。
npm install video.js --save
import videojs from 'video.js';
videojs(document.getElementById('foo'));
引入默认皮肤样式
但是这样使用并没有引入 video.js 的皮肤样式文件,播放器是没有界面的。
所以还需要引入 CSS 文件:
import 'video.js/dist/video-js.css';
另外需要注意的是,因为 CSS 中使用了图标字体,还需要用 webpack 的file-loader
处理字体文件。在 webpack 配置文件中添加这样的 loader 配置:
{
test: /\.(ttf|eot|svg|woff(2))(\?[a-z0-9]+)?$/,
loader: 'file',
}
引入 Flash 播放器的 SWF 文件
对于一些 html5 播放器播放不了的格式,video.js 回调用 Flash 播放器去播放器,这样就需要引入一个 SWF 文件。方法还是用file-loader
。在之前的配置中加上swf
扩展名:
{
test: /\.(swf|ttf|eot|svg|woff(2))(\?[a-z0-9]+)?$/,
loader: 'file',
}
然后在代码中配置 SWF 文件的路径:
import SWF_PATH from 'video.js/dist/video-js.swf';
videojs.options.flash.swf = SWF_PATH;
引入vtt.js
如果使用 Flash 播放器,video.js 还会异步请求一个vtt.js
文件。这个是用来处理 WebVTT 文件的。
这个 JS 文件的路径的配置方法跟上面的 SWF 文件的配置方法是类似的。但是,webpack 默认会对 JS 文件打包,而我们需要的是通过file-loader
来引入这个 JS 文件,从而获得其形对路径,所以要在 import 语句中指定具体的 loader:
import VTTJS_PATH from 'file!videojs-vtt.js/dist/vtt.min.js';
videojs.options['vtt.js'] = VTTJS_PATH;
引入其他语言翻译
video.js 包含了很多种语言的本地化,但是没有包含在库中,需要我们自己加载:
import 'video.js/dist/lang/zh-CN';
这样加载的问题是,本地化 JS 代码中使用了videojs
这个全局变量,但是 webpack 并没有将其暴露,所以运行会报错。
解决这个问题有两种方法,在webpack的文档有所提及。
第一种方法是使用imports-loader
,在import一个JS的时候,注入一个全局变量:
import 'imports?videojs=video.js!video.js/dist/lang/zh-CN'
这样的语句,就是告诉 webpack,将videojs
这个全局变量指向video.js
这个模块。这样就不会报错。
第二种方法是使用ProvidePlugin
,直接把全局变量暴露出来。
在 webpack 的配置文件中,增加这样的 plugin 配置:
new webpack.ProvidePlugin({
videojs: 'video.js',
}),
这样就表示把video.js
模块暴露为全局变量videojs
。
使用插件
video.js 有很多插件,他们一般也会使用videojs
这个全局变量。因此如果直接引入也会报错。解决方法跟上一部分“引入其他语言翻译”的方法一样,在此不赘述。
-EOF-
【活动推荐】SegmentFault 开发者大会 2016 - 杭州站即将开始,感兴趣的小伙伴赶紧报名参会!
以上是关于webpack 与 video.js 一同使用的一些坑的主要内容,如果未能解决你的问题,请参考以下文章