前端性能优化经历的四个阶段
- 第一阶段:库、框架的选型
- 第二阶段:简单的构建化(js/css 的压缩和合并)
- 第三阶段:js / css 模块化开发
- js模块化方案:AMD、CMD、CommonJs、ES6Module ;
- CSS模块化开发基本都是在less、sass、stylus等预处理器的import/mixin特性支持下实现的
- 第四阶段:组件化开发和资源管理
参考文章:https://link.zhihu.com/?target=https%3A//github.com/fouber/blog/issues/10
https://segmentfault.com/a/1190000014983263
https://www.cnblogs.com/iwzyuan/p/8695568.html 隐式类型转换规则
https://segmentfault.com/a/1190000014983263 隐式转换原理
阮一峰 javascript/
https://wangdoc.com/javascript/
promise
- 是什么
- 是“”承诺未来执行对象“的一种异步函数”
- 3中状态:pendind未完成, fullfill已完成, reject失败
- 为什么
- 解决 ajax 异步地狱回调怎么用
- 实现用同步写异步代码
- 支持多个并发请求
- 怎么用 new Promise(function (resolve, reject) {})
- 串联 .then () .then()
- 并联 .all([p1,p2])
- race([p1,p2]) 比较谁快用谁
canvas
- 是什么
- 是一块幕布,可以画图,写文字,动画,绘制图表,缩放,滤镜
- 为什么
- 解决 不借助 flash 插件
- 怎么用
- 绘制2D,getContext(‘2d’)支不支持画布功能,返回 CanvasRenderingContext2D 对象
- 绘制 2D,getContext(‘webgl’)
jQuery
- 是什么
- 是 封装 js 的一个库
- 1.xx版本兼容 IE6、7、8;2.xx移除了对 IE老版本的兼容
- 为什么
- 消除浏览器的差异,不用针对不同的浏览器谢冗长的代码
- 简洁
- 轻松实现动画,css操作
- 怎么用
编写 jQuery 插件的原则
- $.fn上绑定函数
- return this 支持链式调用
- 设置默认值 $.extends({ }, $.fn.hightlight.defaults, options) $.fn.hightlight.defaults
- 用户调用设置默认值
underscore
- 是什么
- 是一个第三方开源库,加绒低版本的IE浏览器,统一实现 map 、filter 函数
- 为什么
- 为支持 IE6-8 js 函数式编程
- 怎么用
- collections(为集合类对象提供接口,不包括 Map、Set)
- _.map :遍历 / _.filter:过滤,参数可以是数组或对象
- _.every:集合是否满足条件 / _.some :只有有一个满足条件 ,返回 true / false
- _.max:最大值 / min :最小值
- _.groupBy(数组,方法) 按照返回设置的元素将数组或对象进行归类
- _.shuffle:按照洗牌算法打乱数组 / _.sample :随机选择一个或多个元素
- Arrays (伪数组提供方法)
- _.first:获取第一个元素 / _.last:获取最后一个元素
- _.faltten():将多维数组变成一位数组
- _.zip():将多个数组按照索引所应对应起来,组成一个新的数组 / unzip:反之
- _.object():将多个数组按索引对应起来,变成一个对象
- _.range(number):循环出一个数组序列
- _.uniq():对数组去重
- functions
- _.bind:代替 call(),将 js 原对象方法绑定上
- _.partical:创造偏函数,固定原函数的参数
- _.memoize:缓存,比如计算阶层
- _.once:调用一次
- _.delay:延迟执行函数,与 setTimeOut 相同
- object'
- _.key(属性名):返回对应value 的值,不包含原型链继承的属性和自身 / allkeys():获取所有的属性,包含原型链继承的属性
- _.values():返回自身但不包含原型链的继承属性
- _.mapObject(obj,function(value, key)):循环遍历
- _.invert():将 key 和value 互换
- _.extend / extendOwn:把多个对象的 key,value 合并到一个 对象并返回,extendOwn会忽略原型链继承下来的属性
- _.clone():浅拷贝
- _.isEqule():深度比较
- _.chaining() 链式调用
- collections(为集合类对象提供接口,不包括 Map、Set)
Node.js
- 是什么
- 是可以用 js 编写在后端运行的一种程序
- 为什么
- 不用未开发后端单独学习一门新语言,学习门槛较低,可以全栈开发
- js 可以运用谷歌的 v8 引擎,执行效率高,性能稳定
- 服务团队也在不断壮大
- 怎么用
- 模块 moule.exports
- commonJs 规范 require
- 模块
- global ,类似于 window
- process 代表 node.js 的进程
- 基本模块(内置模块)
- fs 读写文件
- fs.readFile(文件名,数据,方法):异步读取文件,读取二进制流没有data,,返回的是 Buffer 对象
- fs.readFileSync(文件名,'utf-8'):同步读取文件
- fs.writeFile(文件名,数据,方法):异步写数据
- fs.writeFileSync(文件名,数据):同步写数据
- fs.stat():文件或目录的详细信息
- stat.isFile()
- stat.isDirectory()
- stat.size()
- stat.birthtime()
- stat.mtime()
- stream 数据流
- fs.createReadStream(文件名,‘uft-8’):读取流
- 流文件.pipe(流文件):两个文件数据合并
- http
- .createServer(function(request, response) { })创建 http 服务
- request.method / request.url
- response.writeHead(200, {'Content-Type':'text-html'}'}) / response.end()
- 文件服务器 url / path
- ,parse(‘路径’)将字符串解析为 url 对象
- path.resolve('.') 解析当前的目录
- 组合拼接路径 parh.join(当前目录,‘’,页面名称)
- .createServer(function(request, response) { })创建 http 服务
- crypto 提供通用的加密和哈希算法
- MD5 / SHA1
- Hmac 哈希算法
- AES 对称加密算法
- RSA 非对称加密算法
- Diffle-Hellman 密钥交换协议
- 数字证书
- fs 读写文件
css 布局
css 布局的几种方式 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。 https://www.cnblogs.com/Renyi-Fan/p/12173366.html
- CSS 定位详解 http://www.ruanyifeng.com/blog/2019/11/css-position.html
- Flex 布局教程:语法篇 http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html https://www.runoob.com/w3cnote/flex-grammar.html
- 设置float会有一个高度塌陷问题,如何解决? https://www.cnblogs.com/Renyi-Fan/p/12173366.html
深拷贝 && 浅拷贝
- 浅拷贝 copy()
- 是新增加一个指针指向了被复制对象的内存地址,新对象改变,旧对象也改变
- 旧对象里有值,没有引用,改变新对象的值,旧对象不会被修改,新旧对象完全分离开
- 旧对象里有值,有引用,旧对象改变,新对象改变,有引用
- 用法
- 遍历
- slice()
- concat()
- 扩展运算符 ...
- create.assign(target,source)
//实现浅拷贝的思路
//1.对基础类型做一个基本的拷贝
//2.对引用类型开辟一个新的存储,并且拷贝一层对象属性
const dhslloeClone = (target) => {
if (typeof target === 'object' && target != null) {
const cloneTarget = Array.isArray(target)> [] : {};
for (let prop in target) {
if (target.hasOwnProperty(prop)) {
cloneTarget[prop] = target[prop]
}
}
return cloneTarget
} else {
return target
}
}
- 深拷贝 deepcopy()
- 是新增了一个指针并且新增了一个内存,新旧对象互相分离
- 旧对象里没有引用,新旧对象完全分离开
- 旧对象里有值,有引用,新旧对象完全分离开
- 用法
- 乞丐版:JAON.parse(JSON.strignify())将一个对象的北荣转化为字符串,然后再生成一个新的对象
- 局限
- date引用类型会变成字符串(可以直接生成一个新的实例返回)
- 无法拷贝不可枚举的属性
- 无法拷贝对象的原型链(用Object.getOWnPropertyDescriptors()获取对象所有的属性,结合Object.create()创建一个新对象,并继承传入元独享的原型链)
- 无法拷贝对象的循环引用(用WeakMap)
- 对象有函数,undefined,symbol,经过序列化之后键值会消失(针对 symbol,可以用 Reflect.ownkeys())
- 对象中有NaN,infinity,以及-infinity,序列化会变成 null
- 局限
- 存在大量深拷贝需求,用 immutable 库
- 乞丐版:JAON.parse(JSON.strignify())将一个对象的北荣转化为字符串,然后再生成一个新的对象
- 参开文章
函数防抖和函数节流 (长影运用:验证用户输入、resize、 scroll)
参考文章:https://www.jianshu.com/p/b7b698db8352
函数防抖
- 是什么
- 是解决被频繁调动事件方法,多出无用的操作,只管用户最后一次的动作再调用方法
- 怎么用
-
//例子一 function fun () { console.log('resize') } function throttle(method, context) { clearTimeOut(method.timer) method.timer = setTimeOut(function () { method.call(window) }, 500) } throttle(fun, window) //例子二 //防抖函数 执行最后一次提交的事件(搜索框输入、按钮提交) function debounce (fun, wait) { let timeout; return function () { const context = this; const args = arguments; clearTimeout(timeout); timeout = setTimeout(function () { func.apply(context, args) }, wait) } }
-
函数节流
- 是什么
- 在特定的时间内只执行一次
- 为什么
- 解决用户滚动事件掉帧,cpiu 使用率增加,用户体验产
- 怎么用
-
// 示例1 var canRun = true; document.getElementById("throttle").onscroll = function(){ if(!canRun){ return } canRun = false setTimeout(function () { canRun = true }, 500) } // 示例2 //节流函数 在规定的时间内只执行一次 (拖拽、缩放) function debounce (func ,wait) { let timeout; return function () { const context = this; const args = arguments; if (!timeout) { timeout = setTimeout(function() { timeout = null; func.apply(context, args) }, wait) } } }
-
图片懒加载
实现思路
- 给每个图片设置一个自定义属性 data-src 存放真实的图片地址,src 可设置为 缓存小图片
- 添加滚轮事件, 判断哪些图片要加载(scrollTop 滚动区域高度 + innerHeight 可视区域高度 > offsetTop 图片距离顶部的高度) 触发加载事件
- 将 src 地址 替换真实地址
css3 新特性 https://m.html.cn/qa/css3/13608.html
- 选择器
- 文本
- 边框
- 背景
- 动画、旋转
- 渐变
- 多列布局
- flex 布局
- 媒体查询
- 过度
浏览器的内核
现在国内常见的浏览器有:IE、Firefox、QQ浏览器、Safari、Opera、Google Chrome、百度浏览器、搜狗浏览器、猎豹浏览器、360浏览器、UC浏览器、遨游浏览器、世界之窗浏览器等。
但目前最为主流浏览器有五大款,分别是IE、Firefox、Google Chrome、Safari、Opera。
作为前端开发,熟悉四大内核是非常有必要的。四大内核的解析不同使网页渲染效果更具多样化,下面总结一下各常用浏览器所使用的内核。
- IE浏览器内核:Trident内核,也是俗称的IE内核;
- Chrome浏览器内核:统称为Chromium内核或Chrome内核,以前是Webkit内核,现在是Blink内核;
- Firefox浏览器内核:Gecko内核,俗称Firefox内核;
- Safari浏览器内核:Webkit内核;
- Opera浏览器内核:最初是自己的Presto内核,后来是Webkit,现在是Blink内核;
- 360浏览器、猎豹浏览器内核:IE+Chrome双内核;
- 搜狗、遨游、QQ浏览器内核:Trident(兼容模式)+Webkit(高速模式);
- 百度浏览器、世界之窗内核:IE内核;
- 2345浏览器内核:以前是IE内核,现在也是IE+Chrome双内核;
参考网址:
5大主流浏览器的差异:https://blog.csdn.net/qq_36379597/article/details/101382234
五大主流浏览器及四大内核:https://zhuanlan.zhihu.com/p/99777087?utm_source=wechat_session
DNS解析原理(输入地址后,发生了什么)
向DNS发出请求,找本地 DNS 服务器缓存,如果有,返回结果;
如果没有,就去根服务器查找,如果有,返回结果;
如果没有,就去域服务器查找,找到之后,把结果(域名解析服务器的地址)给本地 DNS 服务器,不是直接返回结果,这是为了给本地 DNS 服务器做缓存使用。 最后,本地 DNS 服务器向域名解析服务器发请求,最后返回这个 IP地址
javaScript 执行机制(EventLoop)
https://juejin.cn/post/6844903512845860872
继承的六种方式