Junwen's home
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)

Syun0216

多读书多种树
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)
  • 白帽子讲web安全

    • HTML5安全
    • PHP安全
    • WebServer配置安全
    • Web框架安全
    • 互联网业务安全
    • 加密算法和随机数
    • 安全的开发流程
    • 安全运营
    • 应用层拒绝服攻击
    • 文件上传漏洞
    • 注入攻击
    • 点击劫持
    • 认证与会话管理
    • 访问控制
    • 跨站点请求伪造(CSRF)
    • 跨站脚本攻击
  • 深入react技术栈

    • chapter1
  • 高性能建站
    • 冴羽系列文章链接
    • books
    junwen
    2020-03-27

    高性能网站建设指南

    # 规则1 减少HTTP请求

    性能黄金法则:只有10%~20%的最好中用户响应时间花在接受所请求的HTML文档上。剩下的80%~90%时间花在为HTML文档所引用的所有组件(图片、脚本、样式表、Flash) 等。

    1. 图片地图 (Image Maps)
      img定义图形、map定义图像地图、area定义图像地图中可点击区域

    # css优化

    1. css sprites
    2. 内联图片
    3. 合并脚本和样式表

    # 规则2 使用内容分发网络 (cdn)

    # 规则3 添加Expires头

    今天的web页面都包含了大量的组件,并且其数量在不断增长。页面的初访者会进行很多HTTP请求,单通过一个长久的Expiresto头,可以使这些组件被缓存

    # Max-Age 和 mode_expires

    HTTP1.1引入了Cache-Control头来客服Expires头的限制,因为Expires头使用一个特定的时间,它要求服务器和客户端的始终严格同步。另外,过期的日期需要经常检查,并且一旦未来这一天到来了,还要在服务器配置中提供一个新的日期。


    '

    # 规则4 压缩组件

    Accept-Encoding头来表示对压缩的支持。 e.g:Accept-Encoding: gzip, deflate

    使用代理服务器缓存 Vary:Accept-Encoding,User-Agent

    google禁止代理缓存:Cache-Control: private


    # 规则5 将样式表放在顶部

    样式表放在html的底部会导致白屏,演示地址:http://stevesouders.com/hpws/css-bottom.php 这样逐步呈现被禁止了。是一种不好的用户体验。

    为了避免白屏,请将样式表放到文档顶部的HEAD中,这样做页面是逐步呈现的,演示地址:

    http://stevesouders.com/hpws/css-top.php
    LINK标签替代@import还能带来性能上的收益,@import规则有可能会导致白屏现象

    使用@import规则会导致组件下载时的无序性,尽管他是放在文档顶部的HEAD中,样式表依然是最后下载的。结果就产生了白屏

    # 无样式内容的闪烁的原因大致为:

    1. 使用import方法导入样式表
    2. 将样式表放在页面底部
    3. 有几个样式表,放在html结构的不同位置

    解决方法: 使用link标签将样式表放在文档head中


    # 规则6 将脚本放在底部

    在使用样式表时,页面的逐步呈现会被阻塞,知道所有的样式表下载完成。这就是最好将样式表放在文档的HEAD中的原因,这样就能首先下载他们而不会阻止页面呈现。使用脚本时,对于所有位于脚本一下的内容,逐步呈现都被阻塞了。将脚本放在页面越靠下的地方,以为着越多的内容能够逐步地呈现。
    并行下载: HTTP1.1建议浏览器从每个主机名并行地下载两个组件。


    # 规则7 避免css表达式

    例如:

    background-color: expression((new Date()).getHours()%2 ? ‘#fff’:’#ccc')
    
    1

    # 规则8 使用外部javascript 和 css

    使用外部javascript和css文件,浏览器就能缓存他们,HTML文档的大小减少,而且不会增加HTTP请求的数量

    如果你可以找到一个平衡点,实现较高的重用度,则讲javascript和css部署到外部文件的论据更加强势一些。如果冲拥堵很低,还是内联更有意义一些

    一个两全其美的方法就是 加载后下载,在这些页面中,javascript和css被加载到页面中两次。妖气能够工作,必须处理双重定义。例如脚本,可以定义但不能执行任何函数,将组建放到一个不可见的iframe中是一个更好的方式。

    动态内联 使用后台语言添加


    # 规则9 减少DNS查找

    DNS是URL和他们的实际宿主服务器之间的一个间接层。DNS讲主机名映射到IP地址上

    # DNS 缓存和TTL

    在用户请求了一个主机名之后,DNS信息会留在操作系统的DNS缓存中(windows上的DNS Client服务) TTL值表明记录可以被缓存多久 DnsCacheTimeout KeepAliveTimeout ServerInfoTimeout

    当客户端的DNS缓存为空时,DNS查找的数量与web页面中唯一主机名的数量相等。减少唯一主机名的数量就可以减少DNS查找数量.这方面的优秀示例是Google,它的页面只需要一次DNS查找。

    通过使用keep-alive和较少的域名来减少DNS查找


    # 规则10 精简JavaScript

    1. 混淆
      它也会一出注释和空白,同时他也会改写代码。作为改写的一部分,函数的变量的名字将被转换为更短的字符串,这时的代码更加精炼,也更难阅读。

    2. 节省
      JSMin Dojo Compressor


    # 规则11 避免重定向

    # 规则12 删除重复脚本

    # 规则13 配置ETag

    1. 原始服务器通通过Last-modified响应头来返回组件的最新修改日期
      下一次请求中,浏览器会使用If-Modified-Since头将最新修改日期传回原始服务器进行比较。如果匹配,则会返回一个304相应,而不会传送字节数据。

    2. 实体标签
      Etag提供另外一种方式,用于检测浏览器缓存中的组件与原始服务器上的组件是否匹配。Etag世艺个唯一标识了一个组件的特定版本的字符串。唯一格式约束是该字符串必须使用引号引起来。例如: ETag: “10c24bc-4ab-457c1c1f”。此后如果浏览器必须验证一个组件,它会使用If-None-Match头将ETag传回原始服务器。如果ETag是匹配的,就会返回304状态码。

    3. ETag带来的问题
      通常使用组件的某些属性来构造它,这些属性对于特定的,寄宿了网站的服务器来说是唯一的。当浏览器从一台服务器上获取了原始组件,之后,又向另外一台不同的服务器发起条件get请求时,ETag是不会匹配的。 最后的结果是,对于完全相同的组件,从一台服务器到另一台,Apache和IIS都产生的ETag是不会匹配的。如果ETag不匹配,用户就不会按照ETag设计计划那样接受到更小更快的304响应;相反,他们接收到普通的200响应以及组件的所有数据。 ETag还降低了代理缓存的效率。代理后面用户缓存的ETag经常喝代理缓存的ETag不匹配,这导致不必要的请求被发送到服务器。 If-None_Match比If-Modified-Since具有更高的优先级

    # 规则14 使Ajax可缓存

    在Github上编辑此页 (opens new window)
    #性能
    上次更新: 3/22/2021, 3:47:15 AM
    chapter1
    冴羽系列文章链接

    ← chapter1 冴羽系列文章链接→

    最近更新
    01
    如何打造全链路项目生命周期的统一交付平台
    04-10
    02
    如何建立前端标准化研发流程
    04-10
    03
    如何从0到1一步步成体系地搭建CI
    04-10
    更多文章>
    Theme by Vdoing | Copyright © 2019-2021 Syun
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式