Web加载速度优化清单

网页加载速度是衡量一个网页好坏的重要标准,网页遗弃率随网页加载时间的增加而增加。据说近一半的用户希望网页加载时间不超过2s,超过3s一般就放弃该网页。时间就是生命,干等着,谁愿意平白无故地+1s呀,所以今天来整理下具体如何加快网页

HTML

  • 压缩 HTML: HTML代码压缩,将注释、空格和新行从生产文件中删除。

    为什么:

    删除所有不必要的空格、注释和中断行将减少HTML的大小,加快网站的页面加载时间,并显著减少用户的下载时间。

    怎么做:

    大多数框架都有插件用来压缩网页的体积。你可以使用一组可以自动完成工作的NPM模块。

  • 删除不必要的注释: 确保从您的网页中删除注释。

    为什么:

    注释对用户来说是没有用的,应该从生产环境文件中删除。可能需要保留注释的一种情况是:保留远端代码库(keep the origin for a library)。

    怎么做:

    大多数情况下,可以使用HTML minify插件删除注释。

  • 删除不必要的属性:type="text/javascript" or type="text/css" 这样的属性应该被移除。

    <!-- Before HTML5 -->
    <script type="text/javascript">
        // Javascript code
    </script>
    
    <!-- Today -->
    <script>
        // Javascript code
    </script>
    

    为什么

    类型属性不是必需的,因为HTML5把text/css和text/javascript作为默认值。没用的代码应在网站或应用程序中删除,因为它们会使网页体积增大。

    怎么做:

    ⁃ 确保所有link和script标记都没有任何type属性。

  • 在JavaScript引用之前引用CSS标记: 确保在使用JavaScript代码之前加载CSS。

    为什么:

    在引用JavaScript之前引用CSS可以实现更好地并行下载,从而加快浏览器的渲染速度。

    怎么做:

    确保 head 中的 link 和 style 始终位于 script 之前。

  • 最小化iframe的数量: 仅在没有任何其他技术可行性时才使用iframe。尽量避免使用iframe。

  • DNS预取: 一次 DNS 查询时间大概在60-120ms之间或者更长,提前解析网页中可能的网络连接域名

     <link rel="dns-prefetch" href="http://example.com/">
    

CSS

  • 压缩: 所有CSS文件都需要被压缩,从生产文件中删除注释,空格和空行。

    为什么:

    缩小CSS文件后,内容加载速度更快,并且将更少的数据发送到客户端,所以在生产中缩小CSS文件是非常重要,这对用户是有益的,就像任何企业想要降低带宽成本和降低资源。

    怎么做:

    使用工具在构建或部署之前自动压缩文件。

  • Concatenation: CSS文件合并(对于HTTP/2效果不是很大)。

    
    <!-- 不推荐 -->
    <link rel="stylesheet" href="foo.css"/>
    <link rel="stylesheet" href="bar.css"/>
    
    <!-- 推荐 -->
    <link rel="stylesheet" href="foobar.css"/>
    

    为什么:

    如果你还在使用HTTP/1,那么你就需要合并你的文件。不过在使用HTTP/2的情况下不用这样(效果待测试)。

    怎么做:

    在构建或部署之前使用在线工具或者其他插件来合并文件。
    当然,要确保合并文件后项目可以正常运行。

  • 非阻塞: CSS文件需要非阻塞引入,以防止DOM花费更多时间才能渲染完成。

    <link rel="preload" href="global.min.css" as="style" onload="this.rel='stylesheet'">
    <noscript><link rel="stylesheet" href="global.min.css"></noscript>
    

    为什么:

    CSS文件可以阻止页面加载并延迟页面呈现。使用preload实际上可以在浏览器开始显示页面内容之前加载CSS文件。

    怎么做:

    需要添加rel属性并赋值preload,并在<link>元素上添加as=“style”

  • CSS类(class)的长度: class的长度会对HTML和CSS文件产生(轻微)影响。

    为什么:

    甚至性能影响也是有争议的,项目的命名策略会对样式表的可维护性有重大影响。如果使用BEM,在某些情况下可能会写出比所需要的类名更长的字符。重要的是要明智的选择名字和命名空间。

    怎么做:

    可能有些人更关注类名的长度,但是网站按组件进行划分的话可以帮助减少类名的数量和长度。

  • 不用的CSS: 删除未使用的CSS选择器。

    为什么:

    删除未使用的CSS选择器可以减小文件的大小,提高资源的加载速度。

    怎么做:

    ⚠️ 检查要使用的CSS框架是否已包含reset/normalize代码,可能不需要用到reset/normalize文件中的内容。

JavaScript

  • JS 压缩: 所有JavaScript文件都要被压缩,生产环境中删除注释、空格和空行(在HTTP/2仍然有效果)。

    为什么:

    删除所有不必要的空格、注释和空行将减少JavaScript文件的大小,并加快网站的页面加载时间,提升用户体验。

    怎么做:

    建议使用下面的工具在构建或部署之前自动缩小文件。

  • 非阻塞JavaScript: 使用defer属性或使用async来异步加载JavaScript文件。

    <!-- Defer Attribute -->
    <script defer src="foo.js">
    
    <!-- Async Attribute -->
    <script async src="foo.js">
    

    为什么:

    JavaScript阻止HTML文档的正常解析,因此当解析器到达script标记时(特别是在<head>内),它会停止解析并且执行脚本。如果您的脚本位于页面顶部,则强烈建议添加asyncdefer,但如果在</body>标记之前加载,没有太大影响。但是,使用这些属性来避免性能问题是一种很好的做法。

    怎么做:

    添加async(如果脚本不依赖于其他脚本)或defer(如果脚本依赖或依赖于异步脚本)作为script脚本标记的属性。
    如果有小脚本,可以在异步脚本上方使用内联脚本。

  • 使用 tree shaking 技术减少 js 大小: 通过构建工具分析 JavaScript 代码并移除生产环境中用不到的 js 模块或方法

  • 使用 code splitting 分包加载 js: 通过分包加载,减少首次加载所需时间

    怎么做:

    Vendor splitting 根据库文件拆分模块,例如 React 或 lodash 单独打包成一个文件
    Entry point splitting 根据入口拆分模块,例如通过多页应用入口或者单页应用路由进行拆分
    Dynamic splitting 根据动态加载拆分模块,使用动态加载语法 import() ,实现模块按需加载

图片资源

  • 使用矢量图像 VS 栅格/位图: 可以的话,推荐使用矢量图像而不是位图图像。

    为什么:

    矢量图像(SVG)往往比图像小,具有响应性和完美缩放功能。而且这些图像可以通过CSS进行动画和修改操作。

服务部署

  • 页面大小 < 1500 KB: (理想情况 < 500 KB) 尽可能减少页面和资源的大小。

    为什么:

    理想情况下,应该尝试让页面大小<500 KB,但Web页面大小中位数大约为1500 KB(即使在移动设备上)。根据你的目标用户、连接速度、设备,尽可能减少页面大小以尽可能获得最佳用户体验非常重要。

    怎么做:

    前端性能清单中的所有规则将帮助你尽可能地减少资源和代码。

  • 最小化HTTP请求: 始终确保所请求的每个文件对网站或应用程序至关重要,尽可能减少http请求。

  • 使用CDN提供静态文件: 使用CDN可以更快地在全球范围内获取到你的静态文件。

  • 正确设置HTTP缓存标头: 合理设置HTTP缓存标头来减少http请求次数。

  • 启用GZIP压缩

  • 分域存放资源: 由于浏览器同一域名并行下载数有限,利用多域名主机存放静态资源,增加并行下载数,缩短资源加载时间

  • 减少页面重定向

以上清单仅为节选,来源 https://github.com/w3cay/Front-End-Performance-Checklist

原文链接: Web加载速度优化清单-安望云海

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容