- 原视频教程链接:https://www.imooc.com/video/21619
- 源码地址:https://github.com/Elylicery/Front-end-Demo/tree/master/%5Bts%5DTypeScript%E5%B0%81%E8%A3%85%E6%92%AD%E6%94%BE%E5%99%A8%E7%BB%84%E4%BB%B6
ts的一些优点
为什么使用webpack工具?
npm init -y
cnpm i -D webpack webpack-cli
//-D局部安装,-g表示这个计算机中的所有webpack都是一个版本
新建文件 webpack.config.js
const path = require('path');
module.exports = {
entry:"./src/main.js",
output:{
path:path.resolve(__dirname,'dist'),
filename:"main.js"
},
mode:"development"
}
因为webpack是局部安装,所以不能直接用命令行,要配置自己的命令
npm run build
然后安装其他插件,如下
支持css:style-loader,css-loader
支持html:html-webpack-plugin
其他:clean-webpack-plugin(清理dist之前被误操作的文件)
热更新:webpack-dev-server
支持字体图标:iconfont 下载file-loader
支持ts:
安装ts-lader和typescript
webpack.config.js修改入口文件:entry:"./src/main.ts",
为了让import a from './a'
表示引入的是a.ts而不是a.js(webpack默认),在webpack.config.js中添加
resolve:{
"extensions":['.ts','.js','.json']//省略后缀名,注意顺序
},
需求分析
弹层组件包括:popup.ts、popup.css
播放器组件包括:video.ts video.css
结构搭建
可以给li添加自定义属性data-url和data-title
<li data-url="https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/812358b69886e576c66a01f1f00affe9.mp4" data-title="小米10 青春版 发布会">li>
通过dataset.url和dataset.title
就可以获取
let listItem = document.querySelectorAll('#list li');
for(let i=0;i<listItem.length;i++){
listItem[i].addEventListener('click',function(){
let url = this.dataset.url;
let title = this.dataset.title;
console.log("对应视频信息",url,title);
})
}
组件的创建和配置
定义接口需要哪些方法,哪些属性。方便多人协作
//组件配置接口
interface Ipopup{
width?:string;//?表示可选
height?:string;
title?:string;
pos?:string;
mask?:boolean;//遮罩层
content?:()=>void;
}
//组件接口
interface IComponent{
tempContainer:HTMLElement;
init:()=>void;
template:()=>void;
handle:()=>void;
}
function popup(options:Ipopup){
return new Popup(options);
}
class Popup implements IComponent{
tempContainer;
constructor(private settings:Ipopup){
this.settings = Object.assign({
width:'100%',
height:'100%',
title:'',
pos:'center',
mask:true,
content:function(){
}
},this.settings);
this.init();
}
//初始化
init(){
this.template();
}
//创建模板
template(){
this.tempContainer = document.createElement('div');
this.tempContainer.innerHTML = `
hello template
`;
document.body.appendChild(this.tempContainer);
}
//事件操作
handle(){
}
}
export default popup;
使用组件时
popup({
});
// import './popup.css'
直接import是全局引入css操作,容易造成同名冲突。
如何模块化引入css?
首先webpack.config.js
中
module:{
rules:[
//全局样式
{
test:/\.css$/,
use:['style-loader','css-loader'],
exclude:[
path.resolve(__dirname,'src/components')//排除掉的文件
]
},
//局部样式模块化
{
test:/\.css$/,
use:['style-loader',{
loader:'css-loader',
options:{
modules: {
localIdentName: "[path][name]__[local]--[hash:base64:5]",//生成class语义化
},
}
}],
include:[
path.resolve(__dirname,'src/components')//模块化的css
]
},
]
},
引入时用require引入
let styles = require('./popup.css')//局部模块化引入
//使用
this.tempContainer.innerHTML = `
${
styles.default.popup}
">hello template
`;
document.body.appendChild(this.tempContainer);
观察得知webpack自动为其生成唯一名称的class
类型:HTMLVideoElement
属性:
duration
currentTime
volume
buffered.end(0)
方法:
play()
pause()
requestFullscreen()
两个配置文件:webpack.config.dev.js和webpack.config.prod.js
webpack.config.prod.js的不同
mini-css-extract-plugin
插件options:{ outputpath:'iconfont'}
之后就可以直接部署到服务器上等