博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JS面试】 第十二章 运行环境
阅读量:5273 次
发布时间:2019-06-14

本文共 2982 字,大约阅读时间需要 9 分钟。

  1. 从输入url到得到html的详细过程
  2. window.load和DOMContentLoaded的区别

页面加载过程


  • 浏览器就可以通过访问链接来得到页面的内容
  • 通过绘制和渲染,显示出页面的最终的样子

加载资源的形式

  • 输入url或跳转页面加载html
  • 加载html的静态资源<script src="jquery.js"></script>

加载一个资源的过程

  1. 浏览器根据DNS服务器得到域名的IP地址
  2. 向这个IP的机器发送http请求
  3. 服务器收到处理并返回http请求
  4. 浏览器得到返回内容

浏览器渲染页面的过程

  1. 根据HTML结构生成DOM Tree
  2. 根据CSS生成CSSOM
  3. 将DOM和CSSOM整合形成Render Tree(渲染树)
  4. 根据Render Tree开始渲染和展示
  5. 遇到<script>时,会执行并阻塞渲染
    因为JS会改变DOM结构及内容,所以两者不能同时进行
  • 将CSS放于head中,加载完CSS后浏览器直接知道规则,在渲染body中的元素时,已将CSS考虑进去渲染
  • 将CSS放于body尾部,元素先按照默认加载,然后再根据CSS进行改变,性能较差
  • 将script放于body尾部,可以拿到所有DOM标签和结构,不会阻塞body上面的元素的渲染,性能较优
  • <p><img src="XXX" /></p>img DOM元素会顺序生成,但图片src异步加载

性能优化


原则

  • 多使用内存、缓存或者其他方法
  • 减少CPU计算、减少网络请求、减少IO操作(前端不考虑)

从哪里入手

加载页面和静态资源

静态资源的压缩合并(打包合并+代码压缩)

  • 手动合并效率低、会出错,一般用构建工具合并
  • 3个文件需要发3个请求,每个请求都会耗费很多时间
  • 1个文件只需发送1个请求
// 打包合并后

静态资源缓存

  • 通过链接名称控制缓存,<script src=“abc_1.js”></script>
  • 只有内容改变的时候,链接名称才会改变,<script src="abc_2.js"></script>

使用CDN

  • 不同地域的资源优化
  • 让资源加载更快

使用SSR后端渲染

  • 现在VUe React提出了这样的概念
  • 其实jsp php asp都属于后端渲染
  • 数据直接输出到HTML中

页面渲染

CSS放前面,js放后面

懒加载

  • 图片懒加载、下拉加载更多
  • 给src赋值一个很小的图
  • 真正的图片放在一个data后面
  • 用的时候再把data属性赋值到src中
  • 加快页面渲染速度

减少DOM操作

  • 缓存DOM查询,减少DOM查询,对DOM查询做缓存
// 未缓存DOM查询var i;for (i = 0; i < document.getElementsByTagName('p').length; i++) {
// TODO}// 缓存了DOM查询var pList = document.getElementsByTagName('p');var i;for (i = 0; i < pList.length; i++) {
// TODO}
  • 合并DOM插入,减少DOM操作,多个操作尽量合并在一起执行
var listNode = document.getElementById('list');// 创建1个片段var frag = document.createDocumentFragment();var x, li;for (x = 0; x < 10; x++) {
li = document.createElement('li'); li.innerHTML = "List item" + x; // 插入片段 frag.appendChild(li);}// 最后将片段直接插入正文listNode.appendChild(frag);

事件节流

  • 合并频繁操作
  • 很快的连着的操作,快速打字先不触发
var textaarea = document.getElementById('text');var timeoutId;textaarea.addEventListener('keyup', function () {
if (timeoutId) {
clearTimeout(timeoutId); } timeoutId = setTimeout(function () {
// 触发change事件 console.log("用户停止打字,开始触发事件") }, 100);})

尽早执行操作

window.addEventListener('load', function () {
// 页面全部加载完之后才会执行,包括图片、视频等})document.addEventListener('DOMContentLoaded', function () {
// DOM渲染完即可执行,此时图片、视频还可能没有加载完 // jQuery、zepto均使用此方法})

安全性


XSS跨站请求攻击

  • 在新浪博客写一篇文章,同时偷偷插入一段<script>
  • 攻击代码中,获取cookie,发送到自己的服务器
  • 发布博客,有人查看博客内容
  • 会把查看者的cookie发送到攻击者的服务器

预防

  • 前端替换关键字,例如替换<&lt;>&gt;(配合)
  • 后端替换(建议)

XSRF跨站请求伪造

  • 你已登录一个购物网站,正在浏览器商品
  • 该网站付费接口是 ,但是没有任何验证
  • 然后你收到一封邮件,隐藏着<img src=xxx>
  • 你查看邮件的时候,就已经悄悄的付费购买了

预防

  • 增加验证流程,如输入指纹、密码、短信验证码等

面试技巧


简历

  • 简洁明了,重点突出项目经历和解决方案
  • 把个人博客放在简历中,并且定期维护更新博客
  • 把个人的开源项目放在简历中,并维护开源项目
  • 简历千万不要造假,要保持能力和经历上的真实性

过程中

  • 如何看待加班?加班就像借钱,救急不救穷
  • 千万不可挑战面试官,不要反铐面试官
  • 学会给面试官惊喜,但不要太多
  • 遇到不会回答的问题,说出你知道的就可以
  • 谈谈你的缺点:说说你最近正在学什么就可以了

可能对React不是很了解,最近正在学React,大约1个月后就能做出1个React的网站

题目解答


  1. 从输入url到得到html的详细过程
  • 浏览器根据DNS服务器得到域名的IP地址
  • 向这个IP的机器发送http请求
  • 服务器收到处理并返回http请求
  • 浏览器得到返回内容
  1. window.load和DOMContentLoaded的区别
window.addEventListener('load', function () {
// 页面全部加载完之后才会执行,包括图片、视频等})document.addEventListener('DOMContentLoaded', function () {
// DOM渲染完即可执行,此时图片、视频还可能没有加载完 // jQuery、zepto均使用此方法})

转载于:https://www.cnblogs.com/kxbk100/p/10583628.html

你可能感兴趣的文章
latex tree
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>
【USACO】 奶牛会展
查看>>
继承和多态
查看>>
Dijkstra+计算几何 POJ 2502 Subway
查看>>
修复IE不能执行JS的方法
查看>>
程序员究竟该如何提高效率zt
查看>>
希尔排序法(缩小增量法)
查看>>
PHP编程基础学习(一)——数据类型
查看>>
MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询
查看>>
NPOI处理Word文本中上下角标
查看>>
Android笔记 Handler
查看>>
如何阅读大型前端开源项目的源码(转)
查看>>
java.util.Arrays类详解
查看>>
idea搭建tocmat
查看>>
NYOJ-626-intersection set(二分查找)
查看>>
项目管理之路(1):初步踏入项目管理
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
echarts饼图显示百分比
查看>>