2023-06-29
2023-06-15
2023-03-19
2023-06-27
2023-07-05
更新时间:2024-01-28 10:58:02 发布时间:24小时内 作者:文/会员上传 下载docx
2023-06-29
2023-06-15
2023-03-19
2023-06-27
2023-07-05
原子化 CSS 是一种 CSS 的架构方式, 它倾向于小巧且用途单一的 class, 并且会以视觉效果进行命名
CSS原子化是一种写法, 其特点就是一个类名对应一个样式, 从而通过在标签上附加不同的类名来生成对应的效果, 可以有效的减少CSS的相关代码, 例如
坏处
好处
框架: tailwindcss
Tailwind CSS 是一个功能类优先的 CSS 框架, 它集成了诸如 flex
, pt-4
, text-center
和 rotate-90
这样的的类, 它们能直接在脚本标记语言中组合起来, 构建出任何设计.
是不是就是CSS原子类的写法了?当然, tailwindcss
不止于此, 它还有很多强大的功能和配置
PixiJS是一个2D渲染引擎, 很多尤其引擎都采用PixiJS进行渲染
基本流程
创建一个矩形区域, 并指定大小
将Canvas舞台添加到DOM
此时PixiJS会自动判断是使用Canvas还是WebGL渲染, 默认采用的是WebGL, 也可以强制指定使用Canvas模式
向舞台中添加元素
添加一张图片
在PixiJS中图片都被放置在Sprite容器中, 加载一张图片之前要先加载Sprite
Pixi使用纹理缓存来存储和引用Sprite所需要的纹理. 纹理的名称字符串就是图像的地址. 例如使用[“images/”]
存储图片, 然后使用加载, 最后使用
(sprite)
加载图像
可以定义Sprite的属性
记住,为了完成一次成功得XSS攻击,恶意用户必须找到一种方式在应用程序的输出数据中嵌入他们的某些恶意输入。因此,我们需要识别出应用程序中产生输出的代码。这通常不是一件非常简单的任务,特别对那些大型项目而言,并且有些输出可能确实不必要进行编码。这些情况下,下面的表格可以帮助你处理这些大量数据:
用例场景
场景输入
输入可信?
场景输出
输出中包含不可信的输入?
需要编码?
使用编码方法
Yes/no
Yes/no
Yes/no
为了正确使用该表格,我们首先要知道我们的应用是干嘛的。表格中的一些项我们可以立即填写:
注意:如果你不确信输入是否可信,宁可谨慎一点,假设他们是不可信的。不可信的输入包括:
应用程序级别的全局变量
基于我们的示例项目,这里我们对该表格可以这样填写:
用例场景
场景输入
输入可信?
场景输出
输出中包含不可信的输入?
需要编码?
使用编码方法
用户添加书签
用户名、描述、书签
写入文件的书签实体
应用程序“答谢”用户
用户名称
感谢信息页面
这时,当我们客观地填写了该表格,我们就可以很直观地看出,代码中有哪些是完成输出的:
在该步骤中,我们的目标是确定,是否在上一步筛选的输出中是否包含有任何不可信的用户输入。基于输入和输出场景,现在我们的表格看起来就像如下这样:
用例场景
场景输入
输入可信?
场景输出
输出中包含不可信的输入?
需要编码?
使用编码方法
用户添加书签
用户名、描述、书签
写入文件的书签实体
Yes
应用程序“答谢”用户
用户名称
感谢信息页面
yes
注意:如果你不确定输出中是否包含不确定的输入,保险点,假设他们都是不可信的。
基础数据类型:string
, number
, boolean
, null
, undefined
, 只需要在变量后面使用:type
就可以声明类型
其他基础数据类型:
元组: 表示一个已知元素数量和类型的数组, 各元素的类型不必相同.
当访问一个越界的元素, 会使用联合类型替代:
枚举: 可以为一组数值赋予友好的名字
默认情况下, 从0
开始为元素编号. 你也可以手动的指定成员的数值. 例如, 我们将上面的例子改成从 1
开始编号:
或者, 全部都采用手动赋值:
any
: 不指定
void
: 表示没有任何类型. 当一个函数没有返回值时, 你通常会见到其返回值类型是 void
null
和 undefined
: undefined
和null
两者各自有自己的类型分别叫做undefined
和null
. 和 void
相似, 它们的本身的类型用处不是很大:
默认情况下null
和undefined
是所有类型的子类型. 就是说你可以把 null
和undefined
赋值给number
类型的变量.
never
: 类型表示的是那些永不存在的值的类型. 例如: never
类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型; 变量也可能是 never
类型, 当它们被永不为真的类型保护所约束时.
never
类型是任何类型的子类型, 也可以赋值给任何类型; 没有类型是never
的子类型或可以赋值给never
类型(除了never
本身之外). 即使 any
也不可以赋值给never
.
下面是一些返回never
类型的函数:
object
表示非原始类型, 也就是除number
, string
, boolean
, symbol
, null
或undefined
之外的类型.
使用object
类型, 就可以更好的表示像这样的API. 例如:
对象类型:
使用interface
定义一个对象类型
函数类型
JS写法
TS写法: 为每一项加入属性
TS写法: 整体赋类型
TS写法: 通过接口定义
函数重载
使用interface
进行重载
报错了, 原因是TS将匿名函数推断为了一个(any, any)=>any
, 与IGetDate
不匹配, 解决方法是让IGetDate
的范围大于匿名函数, 修改返回类型为any
即可
不预先指定类型
泛型接口
泛型类
泛型别名
泛型约束: 希望泛型被限制在一定范围内(extends
, 表示类型约束)
泛型参数默认类型
类型别名与断言
type
可以定义类型别名
类型断言有两种形式. 其一是“尖括号”语法:
另一个为as
语法:
字符串|数字 字面量(值只能选一个)
我们希望让HTML, CSS, JS分别去控制结构, 表现, 功能. 各司其职并不是让他们物理上分类(写成三个文件), 而是让他们功能上分离(要不然现在组件化开发岂不是完全违反了原则), 例如不要让JS去直接操作CSS样式
举例: 请实现一个静态页面的深夜模式
最基础的版本
有问题: 通过文字判断状态, 使用JS直接操作了一个CSS样式
改一改
定义了该night
样式, 不用通过文字判断状态了. 要是让我写我最多改成()
回头想想: 我们在做什么事情? 我们在做一个纯视觉效果展示, 样式应该是CSS控制的! JS是控制行为的, 我们可以尝试纯CSS+HTML实现
要是之和我这么一说, 我估计要这么写
很自然的, 我把input
与label
放一起了, 然后把在关掉checkbox
的样式, 但是这不符合语义化要求啊!!!, 回头想想, 为啥要专门有个label
标签呢? 为的是让他们永远在一起吗? 当然是可以让这两个标签分开啊
人家还可以把这个checkbox
给删掉, 太他妈牛了. 这才是语义化, 样式与表现各司其职
我们学到了
永远不要相信用户提交的内容, 永远不要将用户提交的内容转化为DOM
其他防御
String转义
SVG扫描(SVG是XML格式的, 可以内置)
尽量禁止用户设置自定义跳转链接
尽量禁止用户自定义样式(可以在样式文件里写url(...)
)
CSP内容安全策略:
CSP通过指定有效域——即浏览器认可的可执行脚本的有效来源——使服务器管理者有能力减少或消除XSS攻击所依赖的载体. 一个CSP兼容的浏览器将会仅执行从白名单域获取到的脚本文件, 忽略所有的其他脚本 (包括内联脚本和HTML的事件处理属性).
发展历程
HTTP/
: 单行协议
支持GET请求, 只能响应HTML文件
HTTP/
: 构建扩展性
增加Header, 增加状态码, 支持多文档类型…
HTTP/
: 标准化协议
链接复用, 缓存, 内容协商
HTTP/2
: 更优异的表现
二进制协议, 压缩header, 服务器推送
HTTP/3
: 草案阶段
报文结构
Http/
start-line:
请求: 方法(POST/GET) HTTP/
响应: HTTP/ 状态码 状态解释
http headers
empty line
body
Http/2
兼容结构
抛弃ASCII编码采用二进制编码
引入帧与流的概念:
帧(frame)
帧: 是 中数据传输的最小单位. 因此帧不仅要细分表达
中的各个部分, 也优化了
表达不好的地方, 同时还增加了
表达不了的方式.
每一帧都包含几个字段: length
, type
, flags
, stream identifier
, frame playload
等等.
其中 type 代表帧的类型, 在 HTTP2 的标准中定义了 10 种类型.
在 中, 它把数据包的两大部分分成了 header frame
和 data frame
, 也就是 头部帧 和 数据体帧.
流(stream)
流: 存在于连接中的一个虚拟通道. 流可以承载双向消息, 每个流都有一个唯一的整数 ID.
长连接中的数据是不按请求响应顺序发送的, 一个完整的请求或响应可能会分成非连续多次发送, 有以下几个特点:
链接都是永久的, 也就是支持多路复用技术, 也就是连接上以后不断开, 支持多次连接
浏览器可以拒绝服务器大量数据推送
服务器可以主动推送
Http请求方法
常见状态码
详见MDN
RESTful API: 一种API设计风格(下面是从中文站上抄来的)
充分的利用 HTTP 协议的各种功能, 是 HTTP 协议的最佳实践
让软件更加清晰, 更简洁, 更有层次, 可维护性更好
请求设计(请求 = 动词 + 宾语)
动词 使用五种 HTTP 方法, 对应 CRUD 操作.
宾语 URL 应该全部使用名词复数, 可以有例外, 比如搜索可以使用更加直观的 search .
过滤信息(Filtering) 如果记录数量很多, API应该提供参数, 过滤返回结果. ?limit=10 指定返回记录的数量 ?offset=10 指定返回记录的开始位置.
API 响应设计
举例: 设计一个动物园
常见请求头
常见响应头
缓存相关知识
强缓存: 只要文件没有过期我就用
协商缓存: 用不用缓存需要与服务器沟通决定
浏览器请求流程
ETag与Last-Modified的作用类似, 但是由于客户端与服务器时间可能不一样, 所以优先使用Etag
Cookie
我们可以利用JS的动态类型的特性通过过程抽象的思想实现一些处理函数的特殊的函数, 这些函数可以方便的控制函数执行的一些局部细节, 我们一般称这些函数为高阶函数
高阶函数:
高阶函数解决的什么问题
常见高阶函数举例:
实现一个once
方法, 被他处理过的函数只能执行一次
实现一个节流函数(冷却某个时间才能再次触发)
实现一个防抖函数(函数会在调用延时执行, 如果在延时时间内出现二次调用则取消前者执行, 重新计时执行后者)
实现一个排队执行函数(可以在任意时间调用函数, 但是不会立即执行, 函数会按顺序执行, 并且固定间隔执行函数, 比如打游戏的时候快速按了100次攻击, 但是角色只会按照固定的速度去攻击)
实现一个迭代方法使得我们可以批量操作可迭代对象的元素
例如我们想为数组中的元素执行某个方法我们可以写(d=>foo(d))
当我们想为一个可迭代对象实现批量执行时就有点麻烦了, 我们可以实现迭代方法函数
常见库
工作流程
建议用封装好的动画库, 实在需要自己实现推荐精灵图, 或者使用lottie格式文件(是一种指令化的格式, 可以在AE中直接导出, 只需要在JS中引入文件即可)
动画优化
JS是单线程的, 我们需要从减少计算的角度进行优化
性能角度
页面渲染的一般步骤为
最占时间的是重排与绘制, 我们希望在requestAnimationFrame
的时候尽量避免这两步, 也就是说我们希望我们使用@keyframe
中的CSS属性尽量不需要这两不就可以实现(例如不要设置display
从none
到其他值(必然会重排), 用translate
代替top/left/right/bottom
, 用scale
代替width/height
, opacity
代替diaplay/visibility
), 具体那些属性的更新不涉及到这两步见: csstriggers
算法角度
内存缓存youhua
离屏绘制(requestAnimationFrame
)
(1)修改服务器访问端口 Apache2的默认访问端口为80,由于端口被占用,需要更改其它访问端口 进入apache2的安装目录 /etc/apache2/,修改文件
(2)删除主页
(3)重启apache服务器即可
(4)访问(ip:端口),在/var/www/html 目录下放置文件就可。
CSS动画
CSS是一种样式表语言, 用来描述HTML或XML(包括SVG, MathML, XHTML), CSS动画有三种实现模式
通过animation相关内容实现精美动画
使用animation相关API配置动画
使用tramsform移动元素(只能用于盒模型)
使用@keyframes name{}
定义动画
举例: 倒啤酒动画,
See the Pen CSS BEER! by KairuiLiu (@kairuiliu) on CodePen.
(:actice
的时候开始运动)
使用animation中的stepAPI简单精灵动画
举例: 跳舞计算器
使用transition实现简单补间动画
SVG动画
SVG是基于XML的矢量图语言, 可以与CSS, JS很好的配合, 有三种实现方法
SMIL(同步多媒体集成语言): 在SVG内部通过特殊标签定义动画(用的不多, 兼容性不好, 兼容库: polyfill)
JS操作SVG:
常用库: ,
使用原生Web Animation实现
举例: 文字溶解
See the Pen SVG文字变形 by KairuiLiu (@kairuiliu) on CodePen.
很容易理解, 我们就是想变化stroke-dashoffset
实现类似蚂蚁线运动的效果, 还有一个小问题, stroke-dashoffset
的最大值是怎么算出来的呢? 使用()
获取path长度(还可以使用()
获取曲线上某个长度对应的坐标点)见MDN与MDN
有了上面这两个东西我们就很好做了, 只需要设置stroke-dashoffset
为0->length即可
CSS动画: 使用CSS操作SVG元素
JS动画
封装一个JS函数, 指定间隔的时候计算播放进度并手动调整animation的播放状态, 方便对元素进行大量动画控制
对比
静态资源方案: 缓存+CDN+文件名hash(防止缓存期内无法更新)
登录方案:
跨域请求: 先发起OPTION
请求询问服务器是否允许跨域请求, 若允许则发起正式请求
跨域解决方案: CORS, 代理服务器, iframe
登录状态保存
session和cookie成一套体系, session依赖于cookie, session和cookie都容易被csrf攻击, 而且session类型的状态保持只能用于浏览器中的, 对于用户的登录和登出, 使用session会更灵活一些. jwt是json数据适用于各种语言, 跨语言请求非常方便, jwt可以存在于各种客户端, 不仅仅是浏览器, 扩展性更强, 对数据进行加密, 数据非常安全.
预加载与预解析: HTML的rel属性与as属性
封装一个简单的动画函数
注意:
关于贝塞尔曲线
解决的问题: 如何在计算机中表示一个曲线
原理:
在线演示: cubic-bezier
如何实现贝塞尔曲线: 常用的就是三次贝塞尔曲线, 我们有锚点P1,P2,P3,P4P_1, P_2, P_3, P_4P1,P2,P3,P4, 其中固定P1=(0,0),P4=(1,1)P_1=(0,0), P_4=(1,1)P1=(0,0),P4=(1,1)在, 变量只有P2,P3P_{2}, P_{3}P2,P3, 曲线公式为 B(t)=P1(1−t3)+3P2t(1−t)2+3P3t2(1−t)+P4t3,t∈[0,1]B(t) = P_1(1-t^3)+3P_2t(1-t)^2+3P_3t^2(1-t)+P_4t^3, t\in [0,1] B(t)=P1(1−t3)+3P2t(1−t)2+3P3t2(1−t)+P4t3,t∈[0,1]
将本文的Word文档下载到电脑
推荐度: