css
- 避免使用
table 布局
- 将动画效果应用到
position 属性为absolute 或fixed 的元素上
javascript
- 避免频繁操作样式,可汇总后统一 一次修改
- 尽量使用
class 进行样式修改
- 减少
dom 的增删次数,可使用 字符串 或者 documentFragment 一次性插入
- 极限优化时,修改样式可将其
display: none 后修改
- 避免多次触发上面提到的那些会触发回流的方法,可以的话尽量用 变量存住
6. 存储
我们经常需要对业务中的一些数据进行存储,通常可以分为 短暂性存储 和 持久性储存。
- 短暂性的时候,我们只需要将数据存在内存中,只在运行时可用
-
持久性存储,可以分为 浏览器端 与 服务器端
-
浏览器:
-
cookie : 通常用于存储用户身份,登录状态等
- http 中自动携带, 体积上限为 4K, 可自行设置过期时间
localStorage / sessionStorage : 长久储存/窗口关闭删除, 体积限制为 4~5M
indexDB
-
服务器:
7. Web Worker
现代浏览器为JavaScript 创造的 多线程环境。可以新建并将部分任务分配到worker 线程并行运行,两个线程可 独立运行,互不干扰,可通过自带的 消息机制 相互通信。
基本用法:
- // 创建 worker
- const worker = new Worker('work.js');
-
- // 向主进程推送消息
- worker.postMessage('Hello World');
-
- // 监听主进程来的消息
- worker.onmessage = function (event) {
- console.log('Received message ' + event.data);
- }
限制:
- 同源限制
- 无法使用
document / window / alert / confirm
- 无法加载本地资源
8. V8垃圾回收机制
垃圾回收: 将内存中不再使用的数据进行清理,释放出内存空间。V8 将内存分成 新生代空间 和 老生代空间。
-
新生代空间: 用于存活较短的对象
-
老生代空间: 用于存活时间较长的对象
9. 内存泄露
- 意外的全局变量: 无法被回收
- 定时器: 未被正确关闭,导致所引用的外部变量无法被释放
- 事件监听: 没有正确销毁 (低版本浏览器可能出现)
- 闭包: 会导致父级中的变量无法被释放
- dom 引用: dom 元素被删除时,内存中的引用未被正确清空
可用 chrome 中的 timeline 进行内存标记,可视化查看内存的变化情况,找出异常点。
服务端与网络
1. http/https 协议
-
1.0 协议缺陷:
- 无法复用链接,完成即断开,重新慢启动和 TCP 3次握手
- head of line blocking: 线头阻塞,导致请求之间互相影响
-
1.1 改进:
- 长连接(默认 keep-alive),复用
- host 字段指定对应的虚拟站点
-
新增功能:
|