Http
· 前端工程师开发界面
· 需要调用后端的接口,提交/获取 数据 --- http 协议
· 要求事先掌握好 ajax
http 状态码
状态码分类
· 1xx 服务器收到请求
· 2xx 请求成功,如200
· 3xx 重定向,如302
· 4xx 客户端错误,如404
· 5xx 服务端错误, 如500
常见状态码
· 200 成功
· 301 永久重定向(配合location,浏览器自动处理)
· 302 临时重定向(配合location, 浏览器自动处理)
· 304资源未被修改
· 404资源没找到
· 403 没有权限
· 500 服务器错误
· 504 网关超时
关于协议和规范
· 就是一个约定
· 要求大家都跟着执行
· 不要违反规范,例如 IE 浏览器
Restful API
传统的methods
· get 获取服务器的数据
· post 向服务器提交数据
· 简单的网页功能,就这两个操作
现在的methods
· get获取数据
· post提交数据
· patch/put 修改数据
· delete 删除数据
Restful API
· 一种新的API设计方法(早已推广使用)
· 传统API设计:把每个API当作一个功能
· Restful API 设计:把每个url当作一个唯一的资源
如何设计成一个资源?
尽量不用url参数
· 传统API设计:/api/list?pageIndex=2
· restful Api设计: /api/list/2
用method表示操作类型
http常见的 header 有哪些?
常见的 Request Headers
· Accept 浏览器可接收的数据格式
· Accept-Encoding 浏览器可接收的压缩算法,如 gzip
· Accept-Language 浏览器可接收的语言,如 zh-CN
· Connection: keep-alive 一次 TCP 连接重复使用
· cookie
· Host
· User-Agent(简称 UA),浏览器信息
· Content-type发送数据的格式,如 application/json
常见的 Response Headers
· Content-type 返回数据的格式,如 application/json
· Content-Length 返回数据的大小,多少字节
· Content-Encoding 返回数据的压缩算法,如 gzip
· Set-Cookie
自定义headers
缓存相关的 headers
· Catch-Control Expires
· Last-Modified If-Modified-Since
· Etag If-None-Match
http 缓存机制 (重要)
关于缓存的介绍
主要加速了网络请求速度
http 缓存策略(强制缓存 + 协商缓存)
强制缓存
Catch-Control
· 在 response headers 中
· 控制强制缓存的逻辑
· 例如 Catch-Control: max-age = 315890300(单位是秒)
catch-control 的值:
· max-age : 最大缓存时间
· no-catch: 不需要浏览器缓存
· no-store: 既不需要浏览器缓存,也不需要服务器做缓存
· private
· public
关于Expire
· 同在response headers 中
· 同为控制缓存过期
· 已被 Catch-Control 替代
协商缓存(也叫对比缓存)
· 服务端缓存策略(服务端来判断是否要被浏览器缓存)
· 服务端判断客户端资源,是否和服务端资源一样
· 一致则返回304,否则返回 200 和最新的资源
资源标识
· 在response headers中,有两种
· Last-Modified 资源的最后修改时间
· Etag 资源的唯一标识(一个字符串,类似于人类指纹)
Last-Modified
Etag
两者对比:
· 会优先使用 Etag
· Last-Modified 只能精确到秒级
· 如果资源被重复生成,而内容不变,则 Etag 更精确
刷新操作方式,对缓存的影响
不同的刷新方式,不同的缓存策略
· 正常操作: 强制缓存有效,协商缓存有效
· 手动刷新: 强制缓存失效,协商缓存有效
· 强制刷新:强制缓存失效,协商缓存失效
面试题
1、http 常见的状态码有哪些?
2、http 常见的 header 有哪些?
3、什么是 restful API ?
4、 描述一下http 的缓存机制?(重要)
开发环境
git
· 常用的代码版本管理工具
·大型项目需要多人协助开发,必须熟用 git
· 如果不会用git,则不会通过面试
· MacOS 自带git, window需要安装
· git 服务端常见的有github、coding.net 等
常见的命令:
· git status // 当前操作了哪些文件
· git diff // 详细的展示修改的内容
· git diff 具体的文件名 // 查看具体的文件
· git add . // 添加所有修改的文件
· git commit -m 'xxx' // 提交文件
· git log // 查看提交记录
· git show xxx // 查看提交的内容
· git checkout xxx // 撤销某个文件上次修改
· git push origin master // 把代码提交到服务器
· git pull origan master // 拉去线上的代码
· git checkout -b xx // 创建一个分支
· git branch
· git checkout -b xxx
· git checkout xxx
· git fetch // 把当前的所有分支拉下来
· git merge xxx
chrome 调试工具
· 面试一般不做考察
· 前端必备知识
抓包
· 移动端 h5 页,查看网络请求,需要用工具抓包
· windows 一般用 fiddle
· MacOS 一般用charles
· 手机和电脑连同一个局域网
· 将手机代理到电脑上
· 手机浏览网页,即可抓包
webpack babel
· ES6 模块化,浏览器暂不支持
· ES6语法,浏览器并不完全支持
· 压缩代码,整合代码,以让网页加载更快
Linux 命令
· 公司的线上机器一般都是linux
· 测试机也需要保持一致,用linux
· 测试机或者线上机器出了问题,本地又不能修复,需要去排查
运行环境(重)
· 运行环境即浏览器(server端有nodejs)
· 下载网页代码,渲染出页面,期间会执行若干JS代码
· 要保证代码在浏览器中:稳定且高效
网页加载过程
加载资源的形式
· html 代码
· 媒体文件,如图片,视频
· javascript、 css
加载资源的过程
· DNS 解析: 域名 =》 IP地址
· 浏览器根据ip地址向服务器发起http请求
· 服务器处理http请求,并返回给浏览器
渲染页面的过程
渲染过程
· 根据html代码生成DOM Tree
· 根据css代码生成 cssom
· 将 dom tree 和 cssom 整合成 render tree
· 根据render tree 渲染页面
· 遇到script 则暂停渲染,优先加载并执行 JS代码,完成并继续
· 直到把 render tree渲染完成
window.onload 和 DOMContentLoaded
性能优化
· 是一个综合性问题,没有标准答案,但要求尽量全面
· 某些细节问题,可能要求单独提问: 手写防抖、节流
· 只关注核心点,针对面试
多使用内存、缓存或其他方法; 减少cpu计算量,减少网络加载耗时; (适用于所有编程的性能优化 --- 空间换时间)
从何入手
加载更快
· 减少资源体积:压缩代码
· 减少访问次数: 合并代码,SSR 服务端渲染,缓存
· 使用更快的网络: CDN
渲染更快
· CSS 放在 header , JS 放在body 最下面
· 尽早开始执行 JS, 用 DOMContentLoaded 触发
· 懒加载,(图片懒加载,上滑加载更多)
· 对 DOM 查询进行缓存
· 频繁 DOM 操作,合并到一起插入 DOM 结构
· 节流 throttle 防抖 debounce
防抖
· 监听一个输入框,文字变化后触发 change 事件
· 直接用 keyup事件,则会频繁触发 change 事件
· 防抖: 用户输入结束或者暂停时,才会触发 change 事件
手写防抖实例:
<body>
<input type="text" id="input1"/>
<script>
// 防抖函数
function debounce(fn, delay = 300) {
let timer = null // timer在闭包中的
return function () {
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() => {
fn.apply(this, arguments);
timer = null;
}, delay)
}
}
let name = document.getElementById("input1")
name.addEventListener('keyup', debounce(function () {
console.log(name.value)
}, 500))
</script>
</body>
节流
· 拖拽一个元素的时候,要随时拿到该元素的位置信息
· 直接用drag事件,则会频繁触发,很容易导致卡顿
· 节流: 无论拖拽速度有多快,都会每隔100ms(自定义)触发一次
节流实例
<body>
<div id="box">
可拖拽
</div>
<script>
function throttle(fn, delay = 100) {
let timer = null
return function () {
if (timer) {
return
}
timer = setTimeout(() => {
//
fn.apply(this, arguments)
timer = null
}, delay)
}
}
let drag = document.getElementById('box')
drag.addEventListener('drag', throttle(function (e) {
console.log(e.offsetX, e.offsetY)
}, 100))
</script>
</body>