>[danger]问题一:输入 URL 到页面渲染的整个流程
1. DNS解析
2. TCP握手
3. TLS握手
4. 浏览器开始解析文件
5. 构建 DOM 树、构建 CSSOM 树、解析JS
6. 生成 Render 树
7. 调用 GPU 绘制,合成图层,将内容显示在屏幕上了
当来这一过程远远不止这些内容,你如果想了解更加详细的过程,可以阅读这篇[文章](https://link.juejin.im/?target=https%3A%2F%2Fgithub.com%2Falex%2Fwhat-happens-when)。
>[info] DNS解析
DNS 的作用就是通过域名查询到具体的 IP。
因为 IP 存在数字和英文的组合(IPv6),很不利于人类记忆,所以就出现了域名。你可以把域名看成是某个 IP 的别名,DNS 就是去查询这个别名的真正名称是什么。
在 TCP 握手之前就已经进行了 DNS 查询,这个查询是操作系统自己做的。当你在浏览器中想访问`www.google.com`时,会进行一下操作:
1. 操作系统会首先在本地缓存中查询 IP
2. 没有的话会去系统配置的 DNS 服务器中查询
3. 如果这时候还没得话,会直接去 DNS 根服务器查询,这一步查询会找出负责`com`这个一级域名的服务器
4. 然后去该服务器查询`google`这个二级域名
5. 接下来三级域名的查询其实是我们配置的,你可以给`www`这个域名配置一个 IP,然后还可以给别的三级域名配置一个 IP
以上介绍的是 DNS 迭代查询,还有种是递归查询,区别就是前者是由客户端去做请求,后者是由系统配置的 DNS 服务器做请求,得到结果后将数据返回给客户端。
>[info]TCP握手
接下来是 TCP 握手,应用层会下发数据给传输层,这里 TCP 协议会指明两端的端口号,然后下发给网络层。网络层中的 IP 协议会确定 IP 地址,并且指示了数据传输中如何跳转路由器。然后包会再被封装到数据链路层的数据帧结构中,最后就是物理层面的传输了。
在这一部分中,可以详细说下 TCP 的握手情况以及 TCP 的一些特性。
当 TCP 握手结束后就会进行 TLS 握手,然后就开始正式的传输数据。
>[info]TLS握手
数据在进入服务端之前,可能还会先经过负责负载均衡的服务器,它的作用就是将请求合理的分发到多台服务器上,这时假设服务端会响应一个 HTML 文件。
首先浏览器会判断状态码是什么,如果是 200 那就继续解析,如果 400 或 500 的话就会报错,如果 300 的话会进行重定向,这里会有个重定向计数器,避免过多次的重定向,超过次数也会报错。
>[info]浏览器开始解析文件
浏览器开始解析文件,如果是 gzip 格式的话会先解压一下,然后通过文件的编码格式知道该如何去解码文件。
>[info]构建 DOM 树、构建 CSSOM 树、解析JS
文件解码成功后会正式开始渲染流程,先会根据 HTML 构建 DOM 树,有 CSS 的话会去构建 CSSOM 树。如果遇到 script 标签的话,会判断是否存在 async 或者 defer ,前者会并行进行下载并执行 JS,后者会先下载文件,然后等待 HTML 解析完成后顺序执行。
如果以上都没有,就会阻塞住渲染流程直到 JS 执行完毕。遇到文件下载的会去下载文件,这里如果使用 HTTP/2 协议的话会极大的提高多图的下载效率。
>[info]生成 Render 树
CSSOM 树和 DOM 树构建完成后会开始生成 Render 树,这一步就是确定页面元素的布局、样式等等诸多方面的东西
>[info]调用 GPU 绘制,合成图层,将内容显示在屏幕上了
在生成 Render 树的过程中,浏览器就开始调用 GPU 绘制,合成图层,将内容显示在屏幕上了。
这一部分就是渲染原理中讲解到的内容,可以详细的说明下这一过程。并且在下载文件时,也可以说下通过 HTTP/2 协议可以解决队头阻塞的问题。
- 阅读说明
- vue试题(已完成)
- 一、vue-cli依赖的 Node.js 环境安装
- 二、vue-cli 工程技术集合介绍
- 三、vue-cli 工程目录结构介绍
- 四、vue.js 核心知识点高频试题一
- 4.1 对于Vue是一套渐进式框架的理解
- 4.2 请说出vue几种常用的指令
- 4.3 请问 v-if 和 v-show 有什么区别?
- 4.4 vue常用的修饰符
- 4.5 v-on可以监听多个方法吗?
- 4.6 vue中 key 值的作用
- 4.7 vue-cli工程升级vue版本
- 4.8 vue事件中如何使用event对象?
- 4.9 $nextTick的使用
- 4.10 Vue 组件中 data 为什么必须是函数
- 4.11 v-for 与 v-if 的优先级
- 五、vue.js 核心知识点高频试题二
- 5.1 vue中子组件调用父组件的方法
- 5.2 vue中 keep-alive 组件的作用
- 5.3 vue中编写可复用的组件
- 5.4 vue生命周期有关的试题
- 5.5 vue如何监听键盘事件中的按键?
- 5.6 vue更新数组时触发视图更新的方法
- 5.7 vue中对于对象的更改检测
- 5.8 解决非工程化项目初始化页面闪动问题
- 5.9 v-for产生的列表,实现active的切换
- 5.10 v-model语法糖的使用
- 六、vue.js 核心知识点高频试题三
- 6.1 十个常用的自定义过滤器
- 6.2 vue等单页面应用及其优缺点
- 6.3 vue的计算属性
- 6.4 vue提供的几种脚手架模板
- 6.5 vue父组件向子组件通过props传递数据
- 6.6 vue-cli开发环境使用全局常量
- 6.7 vue-cli生产环境使用全局常量
- 6.8 vue弹窗后如何禁止滚动条滚动?
- 6.9 计算属性的缓存和方法调用的区别
- 6.10 vue-cli中自定义指令的使用
- 6.11 父组件异步获取动态数据传递给子组件
- 七、vue-router 路由高频考题
- 7.1 vue-router响应 路由参数 的变化
- 7.2 完整的 vue-router 导航解析流程
- 7.3 vue-router有哪几种导航钩子( 导航守卫 )?
- 7.4 vue-router的几种实例方法以及参数传递
- 7.5 vue-router的动态路由匹配以及使用
- 7.6 vue-router如何定义嵌套路由?
- 7.7 router-link组件及其属性
- 7.8 vue-router实现路由懒加载( 动态加载路由 )
- 7.9 vue-router路由的两种模式
- 八、vuex 状态管理高频试题
- 8.1 什么是vuex?
- 8.2 使用vuex的核心概念
- 8.3 vuex在vue-cli中的应用
- 8.4 如何在组件中去使用vuex的值和方法?
- 8.5 在vuex中使用异步修改
- 九、axios、fetch、ajax等请求高频试题
- 9.1 Promise对象是什么?
- 9.2 axios、fetch与ajax有什么区别?
- 9.3 JS的同源策略和跨域问题
- 9.4 如何解决跨域问题?
- 9.5 vue-cli中使用JSON数据模拟
- 9.6 axios有哪些特点?
- 十、前端 UI 样式高频试题
- 10.1 组件样式属性 scoped 问题及解决方法
- 10.2 vue常用的UI组件库
- 10.3 vue组件适配移动端【经典】
- 10.4 移动端适配常用媒体查询源码
- 10.5 垂直居中对齐
- 10.6 vue-cli中如何使用背景图片?
- 10.7 使用表单禁用时移动端样式问题
- 10.8 多种类型文本超出隐藏问题
- 10.11 vue-cli工程引入全局less变量
- 十一、vue中常用功能实现与详解
- 11.1 vue中如何实现tab切换功能?
- 11.2 利用<keep-alive></keep-alive>标签实现某个组件缓存功能
- 11. 3 vue中实现切换页面时为左滑出效果
- 11.4 vue无痕刷新
- 11.5 多种情景的数组去重
- 11.6 vue保留滚动条位置
- 11.7 vue组件中使用定时器
- 11.8 组件slot使用示例
- 11.9 使用递归组件实现级联选择器
- 11.10 使用递归组件实现树形控件
- 11.11 几种常见的自定义指令详解
- 11.11.1 实现一个表单自动聚焦的自定义指令
- 11.11.2 实现一个可从外部关闭的下拉菜单
- 11.11.3 实现一个实时时间转换指令v-time
- 11.12 两种类型的循环单选选择、取消功能
- 十二、vue各种情况的组件间通信
- 12.1 关于vue组件间通信问题的回答
- 12.2 万金油:vue中央事件总线的使用
- 12.3 props:最基础的父子组件间传递数据
- 12.4 v-model语法糖:子组件向父组件传递数据
- 12.5 .sync 修饰符:进行父子组件间相互传递数据
- 12.6 $attrs属性:父孙组件间传递数据
- 12.7 $on属性:子组件调用父组件方法
- 12.8 $listeners属性:孙组件调用父组件的方法
- 12.9 $refs属性:
- 12.10 $parent属性:
- 12.11 $children属性:
- 十三、混合开发:vue工程与app交互
- 十四、vue开发命令的执行过程【拓展】
- 十五、vue-cli工程打包后.js文件详解
- 15.1 vue打包命令是什么?
- 15.2 vue打包后会生成哪些文件?
- 15.3 配置 vue 打包生成文件的路径
- 15.4 vue如何优化首屏加载速度?
- 十六、MVVM设计模式高频试题
- 16.1 MVC、MVP与MVVM模式
- 16.2 MVC、MVP与MVVM的区别
- 16.3 常见的实现MVVM几种方式
- 16.4 Object.defineProperty()方法
- 十七、实现一个自己的MVVM
- 17.1 准备知识
- 17.1.1 ES6中类和定义
- 17.1.2 JS中的文档碎片
- 17.1.3 解构赋值
- 17.1.4 Array.from与Array.reduce
- 17.1.5 递归的使用
- 17.1.6 Obj.keys()与Obj.defineProperty
- 17.1.7 发布-订阅模式
- 17.2 效果示例
- 17.3 思路分析
- 17.4 项目地址
- 十八、vue-cli中的配置详解
- 18.1 webpack的特点
- 十九、源码剖析
- 19.1 剖析 Vue 内部运行机制
- 19.1.1 Vue.js 全局运行机制
- 19.1.2 响应式系统的基本原理
- 19.1.3 响应式系统的依赖收集追踪原理
- 19.1.4 实现 Virtual DOM 下的一个 VNode 节点
- 19.1.5 template 模板是怎样通过 Compile 编译的
- 19.1.6 数据状态更新时的差异 diff 及 patch 机制
- 19.1.7 批量异步更新策略及 nextTick 原理
- 19.1.8 proxy代理过程
- 19.2 剖析 vue-router 内部运行机制
- 19.2.1 重要函数思维图解
- 19.3 剖析 vuex 内部运行机制
- 19.3.1 准备知识
- 1. Vue.mixin
- 2. Vue.use
- 19.3.2 插件安装
- 19.3.3 Store
- 19.3.4 使用源码
- 19.4 剖析 axios 内部运行机制
- 二十、发布一个 npm 资源包
- 二十一、vue的服务器端渲染
- 二十二:资料分享
- html试题(整理中)
- 1. 请写出 HTML5 的doctype
- 2. 请你谈谈你对web标准以及w3c的理解与认识。
- 3. HTML5有哪些新特性?
- 4. 移动端meta标签
- 5. HTML5标签的语义化
- Css试题(整理中)
- 1. css盒子模型
- 一、选择器
- 2. css常用的选择器有哪些?
- 3. CSS3新增伪类有那些?
- 二、结构和层叠
- 4. css优先级计算规则
- 三、值和单位
- 5. em、ex、px与rem
- 四、字体
- 6. 使用自定义字体
- 五、文本属性
- 7. 多行省略
- 8. CSS有哪些继承属性
- 六、基本视觉格式化
- 9. 去掉inline-block元素间隙
- 6.2 垂直居中布局
- 6.3 box-sizing属性
- 6.4 CSS中visibility属性的collapse属性值
- 6.5 display:none与visibility:hidden的区别?
- 七、内外边距和边框
- 八、颜色和背景
- 8.1 rgba和opacity的透明有何不同?
- 九、浮动和定位
- 9.1 居中对齐
- 9.2 position的值
- 9.3 如何清除浮动
- 十、过渡与动画
- 十一、less与sass
- 11.1 less和sass的特点和区别
- 十二、弹性盒布局
- 12.1 请解释一下CSS3的flexbox(弹性盒布局模型),以及适用场景?
- 13. 用纯CSS创建一个三角形
- 14. 对BFC规范(块级格式化上下文:block formatting context)的理解
- 十五、 移动端布局
- 15.1 媒体查询
- 15.2 圣杯布局
- 15.3 双飞翼布局
- 15.4 实现中间自适应宽度,左右两栏固定宽度布局
- 16. CSS优化与性能提高
- 17. 浏览器解析CSS选择器
- 18. css实现全屏滚动
- 十九、响应式设计
- 20. 怎么让浏览器支持小于12px 的文字?
- 21. 图片格式的选择
- 22. link和@import的区别
- 23. 重排和重绘
- 24. css3有哪些新特效?
- 25. 用css创建一个三角形
- JavaScript语言核心试题(已完成)
- 1. 原始类型有哪几种?null 是对象嘛?
- 2. 对象(Object)类型
- 3. typeof vs instanceof
- 4. 类型转换
- 5. this
- 6. == vs ===
- 7. 闭包
- 8. 深浅拷贝
- 9. 原型
- 10. JS 异步编程及常考面试题
- 10.1 并发(concurrency)和并行(parallelism)区别
- 10.2 回调函数(Callback)
- 10.3 Generator
- 10.4 Promise
- 10.5 async 及 await
- 10.6 常用定时器函数
- 11. Event Loop(事件循环)
- 11.1 进程与线程
- 11.2 执行栈
- 11.3 浏览器中的 Event Loop
- 11.4 Node 中的 Event Loop
- 12. new
- 13. instanceof 的原理
- 14. 0.1 + 0.2 != 0.3
- 一、词法结构
- 1.1 ajax请求webservice接口及Unicode转义
- 1.2 javascript中的保留字
- 二、类型、值和变量
- 2.1 javascript中的数据类型有哪些?
- 2.2 Javascript中所支持的数字函数
- 2.3 二进制浮点数和四舍五入错误
- 2.4 日期计算函数
- 2.5 字符串常用的方法
- 2.6 布尔值的转化
- 2.7 null和undefined
- 2.8 比较两个数组
- 2.9 JavaScript类型转换
- 2.10 变量声明
- 2.11 变量作用域
- 2.11.1 变量作用域优先级
- 2.11.2 函数作用域和声明提前
- 2.11.3 作用域链
- 三、表达式和运算符
- 3.1 JavaScript运算符
- 3.2 运算符优先级
- 3.3 == 和 ===
- 3.4 in运算符
- 3.5 instanceof运算符
- 3.6 eval()
- 3.7 三元运算符
- 3.8 typeof运算符
- 3.9 delete运算符
- 四、语句
- 4.1 枚举对象的属性和属性值
- 4.2 跳转语句
- 4.2.1 break与contiinue
- 4.2.2 return语句
- 4.2.3 throw语句
- 4.2.4 try/catch/finally语句
- 4.3 with、debugger和use strict
- 4.4 for循环
- 五、对象
- 5.1 对象基础
- 5.2 对象直接量与new创建对象
- 5.3 原型与原型链
- 5.4 Object.create()
- 5.5 属性的查询和设置
- 5.6 删除属性
- 5.7 检测属性
- 5.8 枚举属性
- 5.9 属性getter和setter
- 5.9.1 存取器属性实例一
- 5.9.2 存取器属性实例二
- 5.9.3 存取器属性实例三
- 5.10 属性的特性
- 5.10.1 如何实现属性特性的查询和设置操作
- 5.10.2 修改不允许创建后修改的属性
- 5.10.3 复制属性的特性
- 5.11 对象的三个属性
- 5.11.1 原型属性
- 5.11.2 类属性
- 5.11.3 可扩展性
- 5.12 序列化对象
- 5.13 对象方法
- 六、数组
- 6.1 JS数组基础
- 6.2 创建数组
- 6.3 数组元素的读和写
- 6.4 稀疏数组
- 6.5 数组长度
- 6.6 数组元素的添加和删除
- 6.7 数组遍历
- 6.8 多维数组
- 6.9 数组方法
- 6.10 数组类型
- 6.11 类数组对象
- 6.12 作为数组的字符串
- 七、函数
- 7.1 函数定义
- 7.2 函数调用
- 7.2.1 函数调用
- 7.2.2 方法调用
- 7.2.3 构造函数调用
- 7.2.4 间接调用
- 7.3 函数的实参和形参
- 7.3.1 可选形参
- 7.3.2 可变长的实参列表:实参对象
- 7.3.3 将对象的属性用做实参
- 7.3.4 实参类型
- 7.4 作为值的函数
- 7.5 作为命名空间的函数
- 7.6 闭包
- 7.7 函数的属性、方法和构造函数
- 7.7.1 length属性
- 7.7.2 prototype 属性
- 7.7.3 call()方法和apply()方法
- 7.7.4 bind()方法
- 7.7.5 toString()方法
- 7.7.6 Function()构造函数
- 7.7.7 可调用的对象
- 7.8 函数式编程
- 7.8.1 使用函数处理数组
- 7.8.2 高阶函数
- 7.8.3 不完全函数
- 7.8.4 记忆
- 八、类和模板
- 8.1 类和原型
- 8.2 类和构造函数
- 8.2.1 构造函数和类的标识
- 8.2.2 constructor 属性
- 8.3 JS中Java式的类继承
- 8.4 类的扩充
- 8.5 类和类型
- 8.5.1 instanceof 运算符
- 8.5.2 constructor属性
- 8.5.3 构造函数的名称
- 8.5.4 鸭式辩型
- 8.6 JS中的面向对象
- 8.6.1 集合类
- 8.6.2 枚举类型
- 8.6.3 标准转换方法
- 8.6.4 比较方法
- 8.6.5 方法借用
- 8.6.6 私有状态
- 8.6.7 构造函数的重载和工厂方法
- 8.7 子类
- 8.7.1 定义子类
- 8.7.2 构造函数和方法链
- 8.7.3 组合 VS 子类
- 8.7.4 类的层次结构和抽象类
- 8.8 ES5中的类
- 8.8.1 让属性不可枚举
- 8.8.2 定义不可变的类
- 8.8.3 封装对象状态
- 8.8.4 防止类的扩展
- 8.8.5 子类和ES5
- 8.8.6 属性描述符
- 8.9 模块
- 8.9.1 用做命名空间的对象
- 8.9.2 作为私有命名空间的函数
- 九、正则表达式
- 9.1 正则表达式的定义
- 9.1.1 直接量字符
- 9.1.2 字符类
- 9.1.3 重复
- 9.1.4 选择、分组和引用
- 9.1.5 指定匹配位置
- 9.1.6 修饰符
- 9.2 用于模式匹配的String方法
- 9.3 RegExp对象
- 9.3.1 RegExp的属性
- 9.3.2 RegExp的方法
- 十、JavaScript的子集和扩展
- 10.1 JS的子集
- 10.1.1 精华
- 10.1.2 子集的安全性
- 10.2 常量和局部变量
- 10.3 解构赋值
- 10.4 迭代
- 10.4.1 for/each循环
- 10.4.2 迭代器
- 10.4.3 生成器
- 10.4.4 数组推导
- 10.4.5 生成器表达式
- 10.5 函数简写
- 10.6 多catch从句
- 客户端JavaScript试题(整理中)
- 一、web浏览器中的JavaScript
- 1.1 URL中的JavaScript
- 1.2 同步、异步和延迟的脚本
- 1.3 JS程序执行的时间线
- 1.4 同源策略
- 二、window对象
- 2.1 计时器
- 2.2 解析URL
- 2.3 Nabigator对象
- 2.4 window对象方法
- 三、脚本化文档 DOM
- 3.1 文档对象模型
- 3.2 选择文档元素的方法
- 3.3 文档遍历函数
- 3.4 数据集采集
- 3.5 元素的内容
- 3.6 创建、插入和删除节点
- 3.7 文档和元素的几何形状和滚动
- 3.7.1 文档坐标和视口坐标
- 3.7.2 查询元素的几何尺寸
- 3.7.3 滚动
- 3.8 其他文档特性
- 四、事件处理
- 五、脚本化HTTP
- 5.1 ajax
- 5.2 XMLHttpRequest对象
- 5.2.1 指定请求
- 5.2.2 取得响应
- 5.2.3 编码请求主体
- 5.2.4 HTTP进度事件
- 5.2.5 中止请求和超时
- 5.2.6 跨域HTTP请求
- 5.3 借助<script>发送HTTP请求:JSONP
- 5.4 基于服务器端推送事件端Comet技术
- 六、客户端存储
- 6.1 客户端存储的几种形式
- 6.2 localStorage和sessionStorage
- 6.3 cookie
- 6.4 应用程序存储和离线web应用
- 七、多媒体和图形编程
- 7.1 脚本化图片
- 7.2 脚本化音频和视频
- 7.3 SVG:可伸缩的矢量图行
- 7.4 Canvas
- 八、HTML5 API
- 8.1 地理位置
- 8.2 历史记录管理
- 8.3 跨域消息传递
- 8.4 Web Worker
- 8.5 类型化数组和ArrayBuffer
- 8.6 Blob
- 8.7 文件系统API
- 8.8 客户端数据库
- 8.9 webSocket协议
- JavaScript重点概念试题(整理中)
- 一、类型和语法
- 二、作用域和闭包
- 三、this和对象原型
- 四、异步和性能
- JavaScript真题(整理中)
- Jquery试题(整理中)
- ECMAScript试题(整理中)
- 1. var、let 及 const 区别
- 2. 原型继承和 Class 继承
- 3. 模块化
- 4. Proxy
- 5. map, filter, reduce
- 一、块级作用域绑定
- 1.1 var声明和变量提升(Hosting)机制
- 1.2 块级声明:let声明
- 1.3 块级声明:禁止重声明
- 1.4 块级声明:const声明
- 1.5 块级声明:临时死区
- 1.6 循环中的块级作用域及立即调用函数表达式解决方案
- 1.7 循环中的let
- 1.8 循环中的const
- 1.9 全局块作用域绑定
- 二、字符串
- 2.1 UTF-16码位
- 2.2 新增方法 codePointAt()
- 2.3 新增方法 fromCodePoint()
- 2.4 新增方法 normalize()
- 2.5 新增解析字符串方法 includes()
- 2.6 新增解析字符串方法 startsWith()
- 2.7 新增解析字符串方法 endsWith()
- 2.8 新增方法 repeat()
- 2.9 模板字面量
- 2.9.1 什么是模板字面量
- 2.9.2 基础语法
- 2.9.3 多行字符串
- 2.9.4 字符串占位符
- 2.9.5 标签模板
- 三、函数
- 3.1 函数形参的默认值
- 3.1.1 ES5中模拟默认参数
- 3.1.2 ES6中的默认参数值
- 3.1.3 ES5中的 arguments 对象
- 3.1.4 默认参数值对 arguments 对象的影响
- 3.1.5 默认参数表达式
- 3.1.6 默认参数的临时死区
- 3.2 处理无名参数
- 3.2.1 ES5中的无命名参数
- 3.2.2 不定参数
- 3.3 增强的 FUNCTION 构造函数
- 3.4 展开运算符
- 3.5 name属性
- 3.5.1 什么是name属性
- 3.5.2 name属性的特殊情况
- 3.6 明确函数的多重用途
- 3.6.1 什么是函数的多重用途
- 3.6.2 在ES5中判断函数被调用的方法
- 3.6.3 元属性 new.target
- 3.7 块级函数
- 3.7.1 ES6中的块级函数
- 3.7.2 块级函数的使用场景
- 3.7.3 非严格模式下的块级函数
- 3.8 箭头函数
- 3.8.1 箭头函数与传统 JS 函数的不同
- 3.8.2 箭头函数的语法
- 3.8.3 创建立即执行函数表达式
- 3.8.4 箭头函数没有 this 绑定
- 3.8.5 箭头函数和数组
- 3.8.6 箭头函数没有 arguments 绑定
- 3.8.7 箭头函数的辨识方法
- 3.9 尾调用优化
- 3.9.1 什么是尾调用
- 3.9.2 ES6中尾调用的优化
- 3.9.3 如何利用尾调用的优化
- 四、对象
- 4.1 对象的类别
- 4.2 对象字面量语法扩展
- 4.2.1 属性初始值的简写
- 4.2.2 对象方法的简写
- 4.2.3 可计算属性名
- 4.3 新增方法
- 4.3.1 Object.is()
- 4.3.2 Object.assign()
- 4.4 重复的对象字面量属性
- 4.5 自有属性枚举顺序
- 4.6 增强对象原型
- 4.6.1 改变对象的原型
- 4.6.2 简化原型访问的Super引用
- 4.7 正式的方法定义
- 五、解构:使数据访问更便捷
- 5.1 对象解构
- 5.1.1 解构赋值
- 5.1.2 默认值
- 5.1.3 为非同名局部变量赋值
- 5.1.4 嵌套对象解构
- 5.2 数组解构
- 5.2.1 解构赋值
- 5.2.2 默认值
- 5.2.3 嵌套数组解构
- 5.2.4 不定元素
- 5.3 混合解构
- 5.4 解构参数
- 5.4.1 必须传值的解构参数
- 5.4.2 解构参数的默认值
- 六、Symbol 和 Symbol 属性
- 6.1 什么是 Symbol
- 6.2 创建 Symbol
- 6.3 Symbol的使用方法
- 6.4 Symbol共享体系
- 6.5 Symbol与类型强制转换
- 6.6 Symbol属性检索
- 6.6 通过well-known Symbol暴露内部操作
- 6.6.1 Symbol.hasInstance方法
- 6.6.2 Symbol.isConcatSpreadable属性
- 6.6.3 Symbol.match、Symbol.replace、Symbol.search和Symbol.split属性
- 6.6.4 Symbol.toPrimitive方法
- 6.6.5 Symbol.toStringTag属性
- 6.6.6 Symbol.unscopables属性
- 七、Set 集合 与 Map 集合
- 7.1 ES5中的 Set 集合与 Map 集合
- 7.2 ES6中的 Set 集合
- 7.2.1 创建 Set 集合并添加元素
- 7.2.2 移除元素
- 7.2.3 Set集合的 forEach()方法
- 7.2.4 将 Set 集合转换为数组
- 7.2.5 Weak Set集合
- 7.3 ES6中的 Map 集合
- 7.3.1 ES6中的 Map 集合
- 7.3.2 Map 集合支持的方法
- 7.3.3 Map 集合的初始化方法
- 7.3.4 Map 集合的 forEach 方法
- 7.3.5 Weak Map 集合
- Http协议试题(已完成)
- 说明
- 重点:输入 URL 到页面渲染的整个流程
- 一、网络基础
- 1.1 TCP/IP协议族
- 1.1.1 什么是TCP/IP协议族
- 1.1.2 TCP/IP协议族按层次划分了哪几次?
- 1.1.3 HTTP请求时,TCP/IP通信传输流
- 1.2 网络层:IP协议
- 1.3 传输层:TCP协议、UDP协议
- 1.3.1 TCP协议位于哪一层
- 1.3.2 TCP头部有哪些重要字段?
- 1.3.3 TCP协议的三次握手
- 1.3.4 为什么 TCP 建立连接需要三次握手?
- 1.3.5 UDP 与 TCP 的区别是什么?
- 1.3.6 ARQ协议
- 1.3.7 滑动窗口协议
- 1.3.8 拥塞处理
- 1.4 应用层:DNS服务
- 1.5 URL和URI
- 1.5.1 URI
- 1.5.2 绝对URI的格式
- 1.6 RFC
- 二、Http协议
- 2.1 HTTP请求报文组成
- 2.2 HTTP协议的状态
- 2.3 告知服务器意图的HTTP方法
- 2.4 TCP的持久连接
- 2.5 使用Cookie的状态管理
- 三、HTTP报文内的HTTP信息
- 3.1 HTTP报文类型和结构
- 四、HTTP状态码
- 五、与HTTP协作的 Web 服务器
- 5.1 通信数据转发程序:代理
- 5.2 通信数据转发程序:网关
- 5.3 通信数据转发程序:隧道
- 六、HTTP首部
- 6.1 HTTP首部字段类型
- 6.2 通用首部字段
- 6.3 请求首部字段
- 6.4 响应首部字段
- 6.5 实体首部字段
- 6.6 非HTTP/1.1 首部字段
- 6.7 为Cookie服务的首部字段
- 6.8 其他首部字段
- 七、HTTPS
- 7.1 HTTP的缺点
- 7.2 HTTP与HTTPS
- 7.3 HTTPS的加密方式
- 7.4 HTTPS的通信步骤
- 7.5 HTTPS的缺点
- 八、基于HTTP的功能追加协议
- 8.1 SPDY协议
- 8.2 webSocket协议
- 8.3 HTTP/2.0
- Webpack(已完成)
- 1. 减少 Webpack 打包时间
- 2. 减少 Webpack 打包后的文件体积
- 一、Webpack基础介绍
- 1.1 模块化
- 1.2 构建的作用及常见功能
- 1.3 常见的构建工具及其优缺点
- 1.4 webpack
- 1.5 Loader
- 1.6 Plugin
- 1.7 DevServer
- 1.8 webpack的核心概念
- 二、Webpack配置
- 2.1 Entry
- 2.2 Output
- 2.2.1 filename配置
- 2.2.2 chunkFilename配置
- 2.2.3 path配置
- 2.2.4 publicPath配置
- 2.2.5 crossOriginLoading配置
- 2.2.6 libraryTarget 和 library配置
- 2.2.7 var (默认)配置
- 2.2.8 commonjs配置
- 2.2.9 commonjs2配置
- 2.2.10 this配置
- 2.2.11 window配置
- 2.2.12 global配置
- 2.2.13 libraryExport配置
- 2.3 Module
- 2.3.1 Loader配置
- 2.3.2 noParse配置
- 2.3.3 parser配置
- 2.4 Resolve
- 2.4.1 alias配置
- 2.4.2 mainFields配置
- 2.4.3 extensions配置
- 2.4.4 modules配置
- 2.4.5 descriptionFiles配置
- 2.4.6 enforceExtension配置
- 2.4.7 enforceModuleExtension配置
- 2.5 Plugin
- 2.6 DevServer
- 2.6.1 hot配置
- 2.6.2 inline配置
- 2.6.3 historyApiFallback配置
- 2.6.4 contentBase配置
- 2.6.5 headers配置
- 2.6.6 host配置
- 2.6.7 port配置
- 2.6.8 allowedHosts配置
- 2.6.9 disableHostCheck配置
- 2.6.10 https配置
- 2.6.11 clientLogLevel配置
- 2.6.12 compress配置
- 2.6.13 open配置
- 2.7 其他配置
- 2.7.1 Target配置
- 2.7.2 Devtool配置
- 2.7.3 Watch 和 WatchOptions
- 2.7.4 Externals配置
- 2.7.5 ResolveLoader配置
- 2.8 如何整体配置结构
- 2.9 判断如何配置 Webpack
- 三、Webpack实战
- 3.1 如何接入ES6
- 3.2 如何接入SCSS
- 3.3 React的使用
- 3.4 Vue的使用
- 3.5 使用 Angular2 框架
- 3.6 为单页应用生成 HTML
- 3.7 离线应用
- 3.7.1 使用 Service Workers 实现离线缓存
- 3.7.2 接入 Webpack
- 3.8 检查代码
- 四、Webpack优化
- 4.1 缩小文件搜索范围
- 4.1.1 优化 loader 配置
- 4.1.2 优化 resolve.modules 配置
- 4.1.3 优化 resolve.mainFields 配置
- 4.1.4 优化 resolve.alias 配置
- 4.1.5 优化 resolve.extensions 配置
- 4.1.6 优化 module.noParse 配置
- 4.2 构建动态链接库
- 4.2.1 接入 Webpack
- 4.2.2 如何实现构建动态链接库
- 4.3 如何把任务分解给多个子进程去并发的执行
- 4.4 多进程压缩代码
- 4.5 使用自动刷新
- 4.6 热模块替换
- 4.6.1 优化模块热替换
- 4.7 区分环境
- 4.7.1 实现原理
- 4.8 CDN加速
- 4.8.1 用 Webpack 实现 CDN 的接入
- 4.9 Tree Shaking优化
- 4.9.1 接入 Tree Shaking
- 4.10 提取公共代码
- 4.10.1 如何通过 Webpack 提取公共代码
- 4.11 按需加载
- 4.11.1 用 Webpack 实现按需加载
- 4.11.2 实例强化(按需加载与 ReactRouter)
- 4.12 优化代码在运行时的效率
- 4.12.1 接入 Webpack
- 4.13 开启 Scope Hoisting
- 4.13.1 接入webpack
- 4.14 输出分析
- 五 . Webpack原理
- 5.1 流程概括
- 5.2 流程细节
- 前端监控
- 1. 页面埋点
- 2. 性能监控
- 3. 异常监控
- 浏览器( 整理中 )
- 1. 为什么会有cookie?
- 2. 浏览器内核
- 3. cookies,sessionStorage和localStorage的区别