You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
varevent=newEvent('build');// Listen for the event.elem.addEventListener('build',function(e){ ... },false);// Dispatch the event.elem.dispatchEvent(event);
// 事件传播到 element 元素后,就不再向下传播了element.addEventListener('click',function(event){event.stopPropagation();},true);// 事件冒泡到 element 元素后,就不再向上冒泡了element.addEventListener('click',function(event){event.stopPropagation();},false);
functionquickSort(sorData=[]){if(!Array.isArray(sorData))throwError(`TypeError: ${sorData} is not Array!`);if(sorData.length<=1)returnsorData;constleft=[],right=[];const_pointVal=sorData[0];for(leti=1,len=sorData.length;i<len;i++){const_currentVal=sorData[i];if(_currentVal<=_pointVal)left.push(_currentVal);elseright.push(_currentVal);}returnquickSort(left).concat(_pointVal,quickSort(right));}
varnew_array=arr.map(functioncallback(currentValue[,index[,array]]){// Return element for new_array }[, thisArg])
💯
Array.prototype._map=function(fn,context){if(typeoffn!=='function')throwError(`TypeError: ${fn} not a function !`);consttemp=[];for(leti=0,len=temp.length;i<len;i++){temp.push(fn.call(context,this[i],i,this));}returntemp;}Object.defineProperty(Array.prototype,'_map',{enumerable: false})
functiondomTreeInterator(node,processFn){if(!node.nodeType)throwError(`TypeError: ${node} is not element node!`);processFn(node);node=node.firstElementChild;while(node){domTreeInterator(node,processFn);node=node.nextSibling;}}
// 表单对象constuserForm={account: '',password: '',}// 验证方法constvalidators={account(value){// account 只允许为中文constre=/^[\u4e00-\u9fa5]+$/;return{valid: re.test(value),error: '"account" is only allowed to be Chinese'}},password(value){// password 的长度应该大于6个字符return{valid: value.length>=6,error: '"password "should more than 6 character'}}}
💯
constgetValidateProxy=(target,validators)=>{returnnewProxy(target,{_validators: validators,set(target,prop,value){if(value===''){console.error(`"${prop}" is not allowed to be empty`);returntarget[prop]=false;}constvalidResult=this._validators[prop](value);if(validResult.valid){returnReflect.set(target,prop,value);}else{console.error(`${validResult.error}`);returntarget[prop]=false;}}})}constuserFormProxy=getValidateProxy(userForm,validators);userFormProxy.account='123';// "account" is only allowed to be ChineseuserFormProxy.password='he';// "password "should more than 6 character
[TOC]
HTML & CSS
浏览器内核
浏览器内核分两部分:渲染引擎(layout engineer 或者 Rendering Engine)和 JS 引擎。由于JS执行引擎越来约独立,内核就倾向于只指渲染引擎。
DOCTYPE及其作用
DOCTYPE用来声明文档类型和DTD(Document type definition,文档类型定义)规范,不是HMLT标签。指明了浏览器应该用哪个版本HTML。
常用标签
section、nav、article、header、footer、main…… @
HMTL语义化
布局
优缺点
Flex
一维布局,一次只能处理一行或一列(相比一较与Grid)。
容器
项目
Grid
网格布局,每个网格都有起止线,每两条线之间都有设定好的距离。
清除浮动
清除浮动
垂直居中
仅居中元素定宽高适用:
居中元素不定宽高适用:
DEMO:link:
盒模型
box-sizing: content-box | border-box
JS获取盒模型的尺寸
边距融合
margin塌陷
overflow: hidden
最佳实践设置在伪类中 BFCBFC
概念
BFC(Block formatting context)"块级格式化上下文"。它是一个独立的渲染区域。文档流分为定位流、浮动流和普通流三种。而普通流就是指BFC中的FC。
FC是formatting context 格式化上下文,它是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用。
常见的FC有BFC、IFC(行级格式化上下文),还有GFC(网格布局格式化上下文)和FFC(自适应格式化上下文)
触发条件
根元素或包含,即HTML元素
float的值不为none
overflow的值不为visible
display的值为
行内块 inline-block
表格单元格 table-cell
表格标题 table-caption
弹性元素 flex
网格元素 grid
position的值为absolute或fixed
布局规则
使用场景
选择器性能分析
🔗
从右到左的选择器匹配方式决定了右边的第一个关键选择器很重要
后代选择器特别是当选择器在标签或通用类别中
提高性能的关键是匹配规则,对于一个给定的元素,需要匹配的规则越少,样式的解析就会越快。避免通用规则,请确保规则不以通用类型选择器作为结束,规则越多,匹配越慢,效率越低
尽量使用子选择器代替后代选择器,后者效率会慢很多
依赖继承属性
用唯一的 Class 名称来定位一个节点往往比组合定位更加快捷
选择器效率排序
CSS规范和最佳实践
DOM事件�
DOM事件级别
DOM0级事件
DOM0级事件处理程序的缺点在于一个处理程序无法同时绑定多个处理函数
DOM2级事件
addEventListener
的第三个参数默认false
,表示在冒泡阶段触发,反之true
则在捕获阶段触发。DOM3级事件
补充事件种类和自定义事件。
自定义事件:
new Event()
new customEvent()
DOM事件模型
原微软只支持冒泡(bubbling),Netscape只支持捕获(capturing),W3C作出让步,统一模型为先捕获后冒泡。
Event对象
Event.preventDefault()
阻止事件的默认行为,
<a>
标签的跳转或表单提交等。Event.stopPropagation()
阻止事件进一步传播,捕获还是冒泡取决于当前事件的触发类型。
stopPropagation方法只会阻止【该元素的当前事件(冒泡或者捕获)】的传播,不会阻止该节点的其他click事件的监听函数。也就是说,不是彻底取消click事件,它还可以正常创建一个新的click事件。
Event.stopImmediatePropagation()
阻止事件传播和元素上的同类型事件——只是阻止了同类型的事件,其他类型的事件依旧照常执行。
Event.currentTarget
Event.target
event.target
指向引起触发事件的元素,而event.currentTarget
则是事件绑定的元素,只有被点击的那个目标元素的event.target
才会等于event.currentTarget
。简单来说:currentTarget始终是监听事件者,而target是事件的真正发出者。文件
<input type="file" multiple>
复制粘贴
JavaScript
原型和原型链
JavaScript是基于原型的编程语言——一切皆对象——每个对象都有一个原型对象,原型区别于类和实例,原型对象是实例对象的“模板”,对象以其原型对象为模板从原型继承属性和方法。任何对象都可以作为另外一个对象的原型对象,以此来共享属性(继承)。
对象属性操作时属性的查找先查找本地属性,没查找到则在其原型中查找,仍未找到就查找原型的原型,直到
Object.prototype
。这种层层查找的关系即为原型链。基于OOP的语言中,子类实例中继承的属性和方法都是复制于父类,而 JavaScript 中是依赖于对象实例和其构造器之间建立的一个链接,通过原型链上溯查找属性和方法。
几条规则
原型链
_proto_
prototype
所有引用类型(数组、对象和函数)的
__proto__
指向它的构造函数的prototype
属性值。当一个对象实例中没有一个属性时会从其构造函数的prototype
(即__proto__
)中查找。instanceof
instanceof运算符用于测试构造函数的prototype原型对象是否出现在被测试对象的原型链(_proto_)中。instanceof判断一个引用类型是什么引用类型,是通过__proto__(隐式原型一层一层往上找,能否找到对应构造函数的prototype)
一些关键字
__proto__
:指向对象原型,非规范定义,可通过Object.getPrototypeOf
获取Prototype:
constructor
this
1.默认绑定
独立函数调用时,
this
指向全局对象,如果使用严格模式,那么全局对象无法使用默认绑定,this
绑定至undefined
并抛错(TypeError: this is undefined)2.隐式绑定
当函数作为引用属性被添加到对象中,隐式绑定规则会把函数调用中的
this
绑定到这个上下文对象3.显示绑定
运用apply call 方法,在调用函数时候绑定this,也就是指定调用的函数的this值
4.new绑定
就是使用new操作符的时候的this绑定。
函数
闭包
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。
继承
Object.create()
ES6 class extends
ES5
实质上就是将子类的原型设置为父类的实例。
ES6和ES5的继承是一模一样的,只是多了
class
和extends
,ES6的子类和父类,子类原型和父类原型,通过__proto__
连接。🔗异步编程
ES6+
作用域
函数 -> 块
class
Class 是ES5原型链继承的语法糖。
证明:class 类的数据类型就是函数,类本身就指向构造函数。事实上,类的所有方法都定义在类的
prototype
属性上面。同ES5不同点:
解构
String、Number、Boolean, null, Undefined
严格模式
严格模式主要有以下限制。
闭包
** 突破作用域链,将函数内部变量可以在外部访问**
数组常用方法
拷贝一个数组
不操作原数组并返回新数组的均可,都为潜拷贝。
slice、concat、Array.from
遍历方法
for 所有循环条件都可选
for...in 可枚举属性(键),环境不同顺序可能不同,原型链上添加的方法默认可枚举。
for...of ES6,任何实现了Iterator接口的数据结构均可,无键名,适合Map。
Array.forEach 数组内置,无法终止循环(
return
只退出回调函数体,break
(continue
)只能用于原生循环中,比如while
、do/while
、for
、for in
和for of
)。ES6扩展
includes: string原型链也有该方法
Array.from: 可接受两个参数。转换源为类数组或iterable接口
模块化
Commonjs
同步加载,Node.js 支持的原生模块化方案。
AMD
AMD,Asynchronous Module Definition,异步模块定义。AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。AMD 推崇依赖前置,这里形似依赖注入。
CMD
CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。 CMD 推崇依赖就近。
ES6 Module
“编译时加载”或者静态加载,即 ES6 可以在编译时就完成模块加载,效率要比 CommonJS 模块的加载方式高。
ES6 module 的复杂在于默认模块的导出和导入,这里需要记住,export default命令的本质是将后面的值,赋给default变量。
对于非默认导出,导入时都使用类似对象“解构”的模式,由于默认default导出其实是导出了一个变量default,所以不能使用“对象解构”。
关于循环依赖,ES6根本不会关心是否发生了"循环加载",只是生成一个指向被加载模块的引用,需要开发者自己保证,真正取值的时候能够取到值。
通信和存储
同源策略
如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。
浏览器的同源策略:link:。
不受同源策略影响的标签有:
前后端通信
Ajax
fetch
Fetch进阶指南:link:
WebSocket
一种基于 TCP 的应用层协议,协议建立始于 HTTP 然后升级协议到 ws (或 wws),可以用于持久的双工通信。
CORS
跨域的“正统”解决办法。
Ajax
Ajax知识体系大梳理:link:
XMLHttpRequest对象工作流程
兼容性
事件触发条件
事件触发顺序
实现一个Ajax请求类
跨域
由同源策略到前端跨域:link:
跨域,你需要知道的全在这里:link:
JSONP
JSON with Padding,使用
script
标签的跨域实现。使用脚本创建<script>元素,发起跨域请求,返回结果形如callback(json)
,callback函数并将序列化的JSON数据取出。只支持GET请求。Hash
postMessage
WebSocket
一种新的协议,不受同源策略影响。
CORS
支持跨域通信的Ajax, 全称是跨域资源共享(Cross-origin resource sharing)。
服务端资源响应头设置:
请求发起时浏览器会自动发送一个 OPTIONS “预检”请求,用来获取服务器支持的请求方式和检查请求来源是否安全。
浏览器存储
cookies
Storage
HTML5新API,以域名为分割单位,有至少5M的数据存储空间。同步存储。
localStorage
类似数据库,持久化存储。由于类似DB的生命周期特性,可在多个标签数据间共享数据。
sessionStorage
当前浏览器标签关闭后生命周期结束,标签之间不能数据共享(由于生命周期是维持在标签期间,所以标签之间的sessionStorage数据禁止共享是符合常规的)。
indexDB
HTTP族
HTTP协议特点
HTTP报文组成
请求方法
GET
POST
PUT
DELETE
HEAD
状态码
1xx:指示信息,表示请求已接收,继续处理
2xx:成功,表示请求已被成功接收
3xx:重定向,要完成请求要进一步操作
4xx:客户端错误,请求语法错误或请求无法实现
5xx:服务器错误,服务器未能给出合法请求结果
持久连接
当使用Keep-Alive模式(HTTP1.1,持久连接、连接重用)时,避免了后继请求时重新建立连接。在HTTP1.1版本支持。
管线化
普通持久连接下,请求消息过程类似:
管线化后:
HTTPS
HTTPS = HTTP + TLS
HTTPS主要解决了中间人攻击MITM(Man In The Middle Attack):
RSA 非对称加密
RSA:三位数学家Rivest、Shamir 和 Adleman
TCP
位码即tcp标志位,有6种标示:
三次握手
四次挥手
可以是任意端发起。
慢启动
慢启动(Slow Start),是传输控制协议(TCP)使用的一种阻塞控制机制。 慢启动也叫做指数增长期。 慢启动是指每次TCP接收窗口收到确认时都会增长。
框架和库
Angular.js
依赖注入DI
推断注入
推断注入下,对于压缩代码后形参(注入依赖名)会改变的问题不用过于担心,有ng-annotate库对其进行处理。
显式注入
函数也即对象,在函数下挂载
MyController.$inject = ['$scope', 'greeter’];
,参数名需要同步顺序。行内注入
行内声明直接传入参数数组,最后一个参数是依赖注入的目标函数,参数名需同步顺序。
Angular.js缺点
脏检测机制
数据发生变化就会触发检测机制,随着项目体量和复杂度的增加,频繁检测会有性能问题
触发检测机制
$timeout
、$interval
)$digest
或$apply
$apply already in progress
$socpe.$apply()
或$scope.$digst()
解决:$scope.$$phase ($digest or $apply)
那些地方需要手动执行:
Angular
angular提供了两种编译方式:
AOT使用tsc编译TS代码,JIT使用ngc。
AOT:
开发器使用JIT, 产品期使用AOT。
特点
Angular-cli
SSR
服务器端渲染,可以使10S加载完成的单页应用1S加载完成。还可以针对每一个人视图去做SEO优化
跨平台
移动端和桌面端兼容。创建跨平台应用,手机应用,提供了可以在移动端和桌面端通用的ui组件。
真·开箱即用
Angular是一套完善的开发框架,区别于“库”。
Vue.js
特点
React
特点
MVVM的认识
MVC
M:model,模型即数据,用来存放应用的数据对象,跟视图和控制器解耦。
V:view,视图,
C : controller,控制器,用于交互层,是视图和数据模型的纽带。
MVVM定义
双向绑定
Data -> view : Object.defineProperty (angularjs 脏检测,angular Object.defineProperty),具体🔗。
View -> Data: Input 事件。
Object.defineProperty
用法
Object.defineProperty与Reflect.defineProperty
A. Object.defineProperty 方法后续会迁移
B. Reflect.defineProperty 返回布尔值
手写对象监测
设计模式
生命周期
源码和实现
浏览器及渲染
浏览器的工作原理:新式网络浏览器幕后揭秘:link:
浏览器渲染过程
render Tree
https://segmentfault.com/a/1190000010298038
RenderLayer 树,满足以下任意一点的就会生成独立一个 RenderLayer。
relative
,absolute
或者transform
)不是所有属性动画消耗的性能都一样,其中消耗最低的是
transform
和opacity
两个属性著作权归作者所有。CSS、JavaScript 解析阻塞
重排Reflow
所有DOM元素都有盒模型,将盒子定位到它该出现的位置即为Reflow。
触发:
重绘Repaint
盒模型对应有盒子的位置、大小、颜色等属性,浏览器按照这些特性渲染盒子的过程即为Repaint。
触发:
浏览器性能的瓶颈之一在于DOM渲染的代价很高,很多优化方案的思路也是从避免重排重绘出发。浏览器的性能分析中,重排(reflow)导致Rendering 事件,重绘(repaint)导致Painting 事件。CSS属性出发重绘和重排的信息信息可参考csstriggers。
提高页面性能优化
浏览器通过队列化批量执行来优化重排过程,但是部分操作会导致强制队列刷新执行——确保得到的是期望的值:
提高网页性能,就是要降低"重排"和"重绘"的频率和成本,尽量少触发重新渲染。
DOM 的多个读操作(或多个写操作)应该放在一起
缓存后续会用到的会触发重排的操作结果,如获取位置等
样式修改通过修改class或csstext属性一次性改变样式
批量修改DOM,避免使用操作真实DOM,通过改变离线DOM(虚拟DOM)加工元素后一次性生效改动
元素脱离文档流——减少重排范围
CSS技巧型
使用虚拟DOM库(react等)
window.requestAnimationFrame
window.requestIdleCallback
Web Worker
JS运行机制
浏览器线程
JS单线机制
浏览器线程机制
Event Loop
js引擎线程会循环从 任务队列 中读取事件并且执行,这种运行机制称作 Event Loop (事件循环)。
任务队列
异步执行任务放入任务队列的时机? https://juejin.im/post/5b06ab416fb9a07a9919413d
错误监控
前端错误分类
即时运行错误的捕获方式
A. try...catch
B. window.onerror
资源加载错误
A. Object.onerror
B. Performance.getEntries()
C. Error事件捕获
上报错误
A. Ajax上报
B. Image对象上报
(new Image()).src='https://test.com/?a=1'
页面性能和缓存
页面性能关注的指标有:白屏时间、首屏时间、整页时间、DNS时间、CPU占用率等。
页面的生命周期
DOMContentLoaded 和脚本
HTML 中的
<script>
脚本文件的执行永远跟UI渲染线程互斥,<script>
脚本在设置了 defer 或 async 属性时,脚本异步的下载(未设置时脚本加载和UI线程也是互斥的),但defer延迟到DOM树创建好再执行,后者异步执行执行,defer强调顺序——DOM树创建好执行,多脚本按照出现顺序执行,async强调异步——下载完即执行,多脚本时与页面出现顺序无关。网络传输性能优化
网络链路:
浏览器在接收到请求后大致流程是:重定向 → 拉取缓存 → DNS解析 → 建立TCP连接 → 发起请求 → 接收响应 → 处理HTML元素 → 加载完成。
浏览器缓存
所有浏览器缓存都是针对非首次访问,所以浏览器缓存策略对首屏加载是没有优化作用的。Safari 对HTML资源强制协商缓存(304)。
强缓存(不进行询问请求,200)
Expires Expires: Thu Jun 28 2018 22:32:05 GMT+0800 (中国标准时间)(时间标准可能不一致)
Cache-Control: Cache-Control: max-age=3600
都存在时
Cache-Control
优先级高。协商缓存(先询问请求,304)
Last-Modified -> If-Modified-Since: Thu Jun 28 2018 22:32:05 GMT+0800 (中国标准时间)
Etag -> If-None-Match (Hash),优先级比Modified高
之所以拉取缓存会出现200、304两种不同的状态码,取决于浏览器是否有向服务器发起验证请求。 只有向服务器发起验证请求并确认缓存未被更新,才会返回304状态码。
资源打包压缩
硬件提升
升级硬件,买好的CDN服务,请好的开发工程师可以很大很高效的提高性能。
资源压缩合并,减少HTTP请求
非核心代码异步加载
A. defer
B. async
利用浏览器缓存 -> 缓存分类 -> 缓存原理
浏览器缓存
强缓存(不进行询问请求)
Expires Expires: Thu Jun 28 2018 22:32:05 GMT+0800 (中国标准时间)(时间标准可能不一致)
Cache-Control: Cache-Control: max-age=3600
都存在时
Cache-Control
优先级高。协商缓存(先询问请求)
Last-Modified If-Modified-Since Last-Modified: Thu Jun 28 2018 22:32:05 GMT+0800 (中国标准时间)
Etag If-None-Match (Hash)
代理服务器缓存
网关缓存 (负载均衡、CDN)
serviceWorker
使用CDN
由于浏览器对同一域名下的请求的个数的限制(Chrome 是6个),一般进一步优化方案是使用多个CDN域名部署资源。
预解析DNS
内存泄露
分析
场景场景
安全
CSRF
概念
概念:跨站请求伪造,cross-site request forgery。
原理
特点
防御
Token验证
Referer验证
隐藏令牌
XSS
概念
概念:跨域脚本攻击,cross-site scripting,页面注入JS脚本。
攻击方式
防御措施
编码
过滤
校正
SQL注入
正则表达式
https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.md
算法
常见算法
算法的衡量标准:时间复杂度、空间复杂度。
排序
常见的排序算法有:冒泡、快速、选择、希尔、归并、堆排序等。
快速
https://segmentfault.com/a/1190000009426421
选择
https://segmentfault.com/a/1190000009366805
希尔
https://segmentfault.com/a/1190000009461832
冒泡
比较
二叉树
二叉查找树(BST)实现
堆栈、队列、链表
递归
递归最常见的两个例子是斐波那契数列和阶乘。
调用栈
递归调用每次函数在未到达终止条件时都会压入调用栈(压栈),如果我们如下调用
factorial(5)
,调用站如下:如果调用参数特别大,调用栈长度会非常大,导致内存占用飙升甚至内存溢出程序奔溃。
尾递归
压栈导致了调用栈不断加深,尾递归通过设置累加参数,实现尾递归调用,空间复杂度O(n) -> O(1)。表现形式就是递归调用时函数最后的执行是函数调用,而不是包含函数调用的表达式。
比如:
阶乘的尾递归:
注意: 1. 尾递归使得递归函数调用更加安全,并非效率的提升。甚至会变慢。
proper tail calls (tail call optimisation)
proper tail calls (tail call optimisation) 即尾递归优化是ES6的提案,但是在浏览器端实现的只有safari,也就是除Safari外的浏览器都未实现尾递归优化。
如下chrome浏览器中尾递归调用:
node.js中通过
--harmony_tailcalls
参数实现尾递归调用。尾调用优化已经被实现但是没有在特性中默认支持的理由目前正在TC39标准委员会中讨论
波兰式和逆波兰式
设计模式
PWA
Web Workers
Web workers 创建的线程是系统级别的,也就是说JavaScript可以创建真的多线程。
WebSocket
概念
WebSocket 是HTML5版本中一种新的协议。websocket 连接建立基于HTTP,初期先发送HTTP,然后升级协议,此时状态码是101(Switching protocols)。
连接建立
Request
Response
在Nginx等代理工具中同样需要升级协议 (http -> web socket):
wws
Websocket使用 ws 或 wss 的统一资源标志符,其中 wss 表示在 TLS 之上的 Websocket(即基于SSL的ws,类似HTTPS),ws的默认端口是80,wws的默认端口是443 。如:
心跳机制 ping/pong
Chrome 或 Nginx 会把持续60s 没有活动的Websocket关闭,同时网络世界具体路线和经过的设备是不确定的,不确定的防火墙、路由、反向代理等工具会自作主张把长时间无消息的socket关闭。
websocket规范定义了心跳机制,一方可以通过发送ping(opcode 0x9)消息给另一方,另一方收到ping后应该尽可能快的返回pong(0xA)。
HTTP2.0
HTTP/2 只支持 HTTPS ,建立连接前先握手,浏览器会发送一个 Client Hello 的包给服务端,这个包里包含了他是否支持 HTTP/2 的信息。
多路复用 (Multiplexing)
多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。
在 HTTP/1.1 协议中 「浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制。超过限制数目的请求会被阻塞」,Chrome 是6个限制。这也是为何一些站点会有多个静态资源 CDN 域名的原因之一。
HTTP2协议把通信的最小基本单位缩小为一个一个帧,并行的在同一个TCP连接上双向交换信息。
二进制分帧(frame)
跟HTTP1.x 相比,HTTP2 不改动 HTTP/1.x 的语义、方法、状态码、URI 以及首部字段,突破 HTTP1.1 的性能限制,改进传输性能,实现低延迟和高吞吐量。关键之一就是在 应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层。
HTTP1.x的首部信息对应封装到 HEADER frame,Request Body 封装到DATA frame。
单一长链接
HTTP/2 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。
HTTP 性能优化的关键并不在于高带宽,而是低延迟。HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接。Websocket协议也是基于此。
总结:
首部压缩(Header Compression)
HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2 应运而生。而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法。
服务端推送(Server Push)
即一个请求和可以对应多个相应。
工程化
Gulp
Gulp是一个基于流(pipe)的自动化构建工具。 除了可以管理和执行任务,还支持监听文件、读写文件。
Webpack
Webpack 是一个打包模块化 JavaScript 的工具,在 Webpack 里一切文件皆模块,通过 Loader 转换文件,通过 Plugin 注入钩子,最后输出由多个模块组合成的文件。Webpack 专注于构建模块化项目。
执行过程:
Entry
:入口,Webpack 执行构建的第一步将从 Entry 开始,可抽象成输入。Module
:模块,在 Webpack 里一切皆模块,一个模块对应着一个文件。Webpack 会从配置的 Entry 开始递归找出所有依赖的模块。Chunk
:代码块,一个 Chunk 由多个模块组合而成,用于代码合并与分割。Loader
:模块转换器,用于把模块原内容按照需求转换成新内容。Plugin
:扩展插件,在 Webpack 构建流程中的特定时机会广播出对应的事件,插件可以监听这些事件的发生,在特定时机做对应的事情。Rollup
Rollup 的亮点在于能针对 ES6 源码进行 Tree Shaking 以去除那些已被定义但没被使用的代码,但webpack也有该功能。
参考:link:
Node.js
Path.resolve() 和 Path.join() 区别
其他
浏览器通知 Notification API
文件读取 FileReader API
文件预览
常规方法是「上传后再预览」,可实现上传前预览的方法有
FileReader
和URL.createObjectURL
。service worker
🔗
题
实现数组MAP
📌
💯
数组扁平(降维)
📌
[1, [2], [3, [4, [5], 5, 6], 7, 8], [9]] => [1, 2, 3, 4, 5, 5, 6, 7, 8, 9]
🔥
💯
mqyqingfeng/Blog#49
累加器 Currying
📌
🔥
💯
判断一个数字是否出现过
遍历DOM
💯
写一个能遍历对象和数组的通用forEach函数
解析URL查询参数
📌 如下:
🔥
方法很多,可以用 URLSearchParams ,其执行结果可直接用在
for...of
中, 可以不使用entries()
💯
实现一个简单的模板引擎
📌 如下:
🔥
replace
如果第一个参数是正则表达式, 并且其为全局匹配模式, 那么第二个参数为函数则每次匹配都会被调用,函数返回值是替换字符串。💯
数字变成逗号分隔格式(千位符)
📌 12345678.98765 => 12,345,678.98765
🔥
所谓单词的边界是指一个能够用来构成单词的字符(数字、字母和下划线即\w)和一个不能用来构成单词的字符(\W)之间的位置。
💯
SameValue 算法
📌 ES6 新API Object.is ,规范参考
🔥
💯
自动填充对象
📌
💯
缓存代理的工厂函数
💯
表单验证代理
📌
💯
数字转换成中文大写
📌 10001 -> 一万零一
判断a字符串是否包含在b字符串中(KPM算法)
📌 实现一个函数,可以判断 a 字符串是否被包含在 b 字符串中,不借助原生API和正则
🔥
💯
简单类型变量的监听
📌
// 有一个全局变量 a,有一个全局函数 b,实现一个方法bindData,执行后,a的任何赋值都会触发b的执行。
指定目录文件读取
📌 实现一个函数,返回指定目录下的所有JavaScript文件列表。
🔥
💯
在一个函数调用之前调用其它方法
📌
💯
实现ng1版本的依赖注入DI
📌
🔥
💯
拷贝
extend
对象相等判断
柯里化
------------
我有一个 100 * 100 的位置,需要放一个未知大小的图片,可以做到居中?
react相关
jQuery 和 react 有什么区别,用 jQuery 设计 MVC 架构会怎么设计?
如何设计一个好的组件?
React组件,发送异步请求应该在什么阶段发送?
vue相关
现在在使用vue1还是2?1到2也是有很多变化,变化是什么,怎么踩啃的?
你是如何理解mvvm框架?vue是怎么实现mvvm的?
vue 有没有遇到数据明明更新却没有触发重绘?
Angular相关
node相关
可视化相关
有一张图片,想要做马赛克处理,可以怎么实现?可能会存在什么问题?
canvas 与 svg 的区别?canvas高清屏问题?
如果让你实现一个简单的,愤怒的小鸟小游戏,你们怎么是实现?要点:斜抛模型,物理模型?
如何检测两个多边形是否有碰撞?
如何去展示20000个人,相互间人际关系的数据?怎么去体现六度空间的理论?
如果再给你一组最近30天的数据,数据的内容是淘宝上的有购买买家数,绘制两个曲线图,我希望两个曲线图能够联动,你会怎么去做?
为什么使用svg 画一条曲线会存在虚化的问题?要怎么解决?
心形线是怎么绘制的? 怎么去实现心形线生成动画?
算法
判断两棵二叉树是否结构相同
其他
你觉得挑战最大的项目是什么?你在这个项目中的角色是什么?解决了什么问题?
你有什么想向我了解的?
The text was updated successfully, but these errors were encountered: