video playerëĨž ëŠĻë íėīė§ėė ëĄëí íėë ėëĪ. videoę° ėë íėīė§ė ëĪėīę°ė ëë§ ëĄëëëëĄ íęļ° ėíī video player ėë°ėĪíŽëĶ―íļ íėžė íīëđ íėž ėėë§ íŽíĻėėžėĪ ęēėīëĪ. ėīëĨž ėíī ëŠ ę°ė§ ęģžė ė ęą°ėģėž íëĪ.
íėŽ entry pointë íëëŋėīëĪ. videoPlayer.js íėžė ë§ë í ėĪëļė íļëĨž ėīėĐíī ėķę°íëĪ.
output ëí íėŽë ëŽīėĄ°ęąī main.js íėžė ėėąëëŊëĄ ėīęēë webpackėė ė§ėíë ë°Đėė ėīėĐíī ėė íëĪ.
// webpack.config.json
const path = require("path");
module.exports = {
entry: {
main: "src/client/js/main.js",
videoPlayer: "src/client/js/videoPlayer.js", // ėķę° â
},
output: {
filename: "js/[name].js", // ėė â
path: path.resolve(__dirname, "assets"),
}
};
watch íėīė§ė ëĪėīę°ė ë video playerę° ëĄëë ė ėëëĄ watch.pug íėžėī videoPlayer.jsëĨž ę°ė ļėėž íëĪ. ėĶ, watch.pug íėžė script íę·ļëĨž ëĢėīėž íëĪ.
ėīëĨž ėíī base.pug íėžė block scriptsëĨž ėķę°í í, watch.pug íėžėė scriptëĨž ėķę°í ė ėëĪ.
//- base.pug
block scripts
//- watch.pug
block scripts
script(src="/static/js/videoPlayer.js")
ðĄ ėīë ęļ°ėĄīė base.pugė ėë script(src="/static/js/main.js")ëĨž ėė íīë ėëŽë ë°ėíė§ ėëëĪ.
main.js íėžė client íīë ėė styles.scss íėžė import íë íėžëĄėĻ main.js íėž ėė ė―ëę° ėĪíëëė§ íėļíęļ° ėí ëŠĐė ėžëĄ console.log()ė íĻęŧ base.pug íėžėė ę°ė ļėë íėžėīëĪ.
ë°ëžė, ėīëĨž base.pug íėžėė ėė íëëžë (client íīë ėė styles.scss íėžė import íë) main.js íėžë§ ėĄīėŽíëĪëĐī, webpackė ėīëĨž íėļíęģ clientė ėĄīėŽíë ëģíëĪė assetsė ë°ęŋėĪ ęēėīëĪ.
ė ëĶŽíėëĐī,
output ėĪíŽëĶ―íļë cssëĨž ę°ė ļėĪė§ ėęģ , input ėĪíŽëĶ―íļë§ėī cssëĨž ę°ė ļėĪëĐ°, ėīë webpackėžëĄ ęĩŽëķëëĪ.
MDN - HTMLMediaElement ė°ļęģ
HTMLVideoElementë HTMLMediaElementëĨž ėėíëĪ. ë°ëžė, video íę·ļë HTMLMediaElementė ėėąęģž ëĐėëëĨž ėŽėĐí ė ėëĪ.
watch.pug íėžėė video playerëĨž ë§ë ëĪ.
//- watch.pug
block content
video(src="/" + video.fileUrl, width="800", controls)
div
button#playBtn Play
button#muteBtn Mute
span#time 00:00/00:00
input(type="range", step="0.1", min="0", max="1")#volume
ę° ėėëĪė videoPlayer.js íėžëĄ ę°ė ļėĻëĪ.
// videoPlayer.js
const video = document.querySelector("video");
const playBtn = document.getElementById("plyBtn");
const muteBtn = document.getElementById("muteBtn");
const time = document.getElementById("time");
const volumeRange = document.getElementById("volume");
ëģžëĨĻ barę° ëŊļëĶŽ ėėąíīëė input ėĪė ę° ëëŽļė ėíë ëëĄ ëģīėīė§ ėė forms.scssëĨž ėė íëĪ.
// forms.scss
input:not(input[type="range"]) { ... }
video.pausedë boolean ę°ė return íëĪ.
ėīëĨž ėīėĐíī videoę° ėŽė ėĪėļė§ íėļí ė ėëĪ.
ėŽė ėŽëķė ë°ëž button ėė textë ë°ęūļëëĄ íëĪ.
// videoPlayer.js
const handlePlayBtnClick = (e) => {
if (video.paused) {
video.play();
} else {
video.pause();
}
playBtn.innerText = video.paused ? "Play" : "Pause";
};
playBtn.addEventListener("click", handlePlayBtnClick);
video.mutedë boolean ę°ė return íëĪ.
video.pasuedė ëŽëĶŽ ė―ęģ ė°ë ęēėī ëŠĻë ę°ëĨíëĪ.
ėĶ, ėėęą° ėíėļė§ íėļí ėë ėęģ , ėėęą° ėíëĄ ë§ëĪ ėë ėëĪ.
ėėęą° ėŽëķė ë°ëž button ėė textë ë°ęūļëëĄ íëĪ.
// videoPlayer.js
const handleMute = () => {
if (video.muted) {
video.muted = false;
} else {
video.muted = true;
}
muteBtn.innerText = video.muted ? "Unmute" : "Mute";
};
muteBtn.addEventListener("click", handleMute);
ėĪė ëģžëĨĻęģž ëģžëĨĻ ë°ëĨž ė°ëíīėž íëĪ.
ðĄ ëģžëĨĻ ë°ė íŽėļí°ëĨž ėė§ėž ëë§ëĪ ëģžëĨĻė íŽęļ°ę° ëģíëëĄ
ėėęą° ëēížė ëëĨīëĐī ëģžëĨĻ ë°ė íŽėļí°ę° ë§Ļ ėžėŠ―ėžëĄ ėĪëëĄ ë§ëĪėīėž íëĪ.
ėĶ, video.volumeė ę°ęģž input[type="range"]ė valueëĨž ė°ęē°íīėž íëĪ.
ėīëĨž ėíī input ėīëēĪíļ
ëĨž ėīėĐí ė ėëĪ.
volumeRange inputė input ėīëēĪíļëĨž ëąëĄíĻė ë°ëž inputė value ę°ėī ëģí ëë§ëĪ handleVolumeChange ėīëēĪíļ íļëĪëŽ íĻėę° ėĪíëëĪ.
// videoPlayer.js
const handleVolumeChange = (event) => {
const { target: { value } } = event;
video.volume = value;
};
volumeRange.addEventListener("input", handleVolumeChange);
ėīė ëģžëĨĻ ë°ė íŽėļí°ëĨž ėĒė°ëĄ ėė§ėž ëë§ëĪ videoė ėĪė ëģžëĨĻėī ëģíë ęēė íėļí ė ėëĪ.
ðĄ ėėęą° ėíėž ë, ëģžëĨĻ ë° ėė§ėīëĐī, ę·ļė ë§ėķ° ëģžëĨĻ íŽęļ°ę° ëģíëëĄ
ę·ļëŽë, ėėęą° ëēížė ëĻžė ëëŽ ėėęą° ėíėž ëë ëģžëĨĻ ë°ëĨž ėė§ėŽë ę·ļëëĄ ėėęą° ėíėīëĪ.
volumeRangeė value ę°ęģž video.volumeė ę°ėī ëŠĻë ëģíęļī íė§ë§, video.mutedę° true ę°ė ę°ė§ęļ° ëëŽļė ęģė ėėęą° ėíę° ė ė§ëë ęēėīëĪ.
ë°ëžė, handleVolumeChange íĻė ėėė video.mutedę° true ę°ėļ ęē―ė°
ëĨž ėķę°ëĄ ëĪëĪėĪėž íëĪ.
const handleVolumeChange = (event) = {
const { target: { value } } = evenvt;
if (video.muted) {
video.muted = false;
muteBtn.innerText: "Mute";
}
video.volume = value;
};
ėīė ėėęą° ėíėļ ęē―ė°ėë ëģžëĨĻ ë°ëĨž ėė§ėīëĐī ėíë ëëĄ ëģžëĨĻėī ėĄ°ė ëë ęēė íėļí ė ėëĪ.
ðĄ ėėęą° ėíėž ë, ėėęą° ëēíž ëĪė íëē ëëĨīëĐī, ėëĶŽę° ëėėĪëëĄ
ę·ļëŽë, ėėęą° ėíėė ėėęą° ëēížė ëĪė ëëŽ ëģžëĨĻė ëėėĪęē ë§ëĪėīë, ëģžëĨĻ ë°ë ėėęą° ėīė ė ėíëĄ ëėėĪė§ ėęģ ę·ļëëĄ ë§Ļ ėžėŠ―ė ëĻė ėëĪ.
video.volumeė ęļ°ėĩíęģ ė
ë°ėīíļ
íėŽ ėėęą° ėŽëķė ë°ëž inputė value ę°ėī ëŽëžė§ëëĄ íëĪ.
// videoPlayer.js
const volumeValue = 0.3;
video.volume = volumeValue;
const handleMute = () => {
if (video.muted) {
video.muted = false;
} else {
video.muted = true;
}
muteBtn.innerText = video.muted ? "Mute" : "Unmute";
volumeRange.value = video.muted ? 0 : volumeValue; // ėėęą° ėí íīė ëëĐī ėīė ëģžëĨĻėī ëĪė ëėėī
};
const handleVolumeChange = (event) => {
const { target: { value } } = event;
if (video.muted) {
video.muted = false;
muteBtn.innerText = "Mute";
}
volumeValue = value;
video.volume = volumeValue;
};