优化--前端(全占课,未完成作业:);CDN; Http/2的设置(未完成)
关键渲染路径:Google 文档
JavaScript 加载最佳化
让html和javascript同时渲染:
设置<script>的async或者defer属性(boolean属性)(这是新html标准的用法,适应ie>9)
<script src="demo_async.js" async></script>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload', :async => true %>
async和defer区别:
✅defer是在html和js都渲染后,再执行js. 如果 JavaScript 里面有依赖 DOM 的话,适合用这个方式。
async是加载js后立即执行。
Inline 型式的 JavaScript 问题
无论是底部或 async/defer 做法,JavaScript 执行的顺序都需要注意不然会出错。之前在百宝箱教程中都假设 JavaScript 是放在 head,因此放在 HTML 内的 JavaScript 会出错。例如在 app/views/events/_form.html.erb 中,我们在 HTML 写了:
<script>
$("#event_category_id").select2( { theme: "bootstrap"} );
</script>
这段代码无论是把 JavaSript 改放在下方,或是用 async/defer,会因为找不到 jQuery 的 而出错,因为它的执行顺序跑在 jQuery 加载之前了 :(
那要怎么调整呢?
JavaScript 放底部的调整方式:
解决方式是我们在 javascript_include_tag 下再多加一行 yield :handwrite_javascript。(多一个区块)

然后再将原先写的 JavaScript 代码,用 content_for 把原先的网页包起来。那么这一段 JavaScript 就会在javascript_include_tag 以下执行了。

defer 的调整方式:推荐
不过如果使用了 'turbolinks:load'应该就无需使用DOMContentLoaded了。
将原本写的 JavaScript 代码,延后到 DOMContentLoaded 事件后才触发:
例如百宝箱的 app/views/admin/events/_form.html.erb 本来有一段使用 select2 的代码:
app/views/admin/events/_form.html.er
<script>
+ window.addEventListener('DOMContentLoaded', function() {
$("#event_category_id").select2( { theme: "bootstrap"} );
+ })
</script>
async 的调整方式:
HTML 中不能有 inline 形式的 JavaScript 了,因为我们不知道那些 async 的 JavaScript 到底什么时候会被加载,因此所有代码都必须放在打包后的 application.js 中。
请将把 layout 的 <body> 改成 <body id="<%= "#{controller_name}-#{action_name}"%>">,这样就可以在全局载入的 application.js 中指定只有这一页才执行的js code,例如:
$(document).ready(function(){
if ( $("#events-edit").length > 0 ) {
$("#event_category_id").select2( { theme: "bootstrap"} );
}
})
CSS 加载最佳化
拆出一些关键的 CSS 包成一个档案,这个档案比较小,因此可以加速首次渲染页面的时间。然后将其他没这个重要的 CSS 包在另一个档案,透过异步加载的方式。详细可以参考这篇的做法 Optimize CSS delivery in Rails app https://icook.engineering/optimize-css-delivery-in-rails-app-16a7727cc984
作业:(未完成)
- 请阅读 Google 的效能指南以及PageSpeed Insights 的评分标准,有中文翻译,但内容比本教程深,看懂多少是多少
- 请安装 Chrome 外挂 Lighthouse
- 侦测任一个你的网站,最好是已经部署的网站(Heroku、Linode 或是阿里云等),在本机的话需要是 production 模式。请截图一张目前的 Performance 的分数报告
- 请套用任何你学到的前端效能优化方式
- 请分享你做了什么改进,以及截图一张最新的效能分数
CDN(content-delivery-network)
CDN 就是专门用来提供静态档案的服务器( CSS/JavaScript和图片等),用户从距离最近的 CDN 服务器下载静态档案,如果 CDN 上面没有需要的档案,那么 CDN 会从我们的服务器上下载一份回去缓存起来。
如何再Rails上使用cdn
修改 config/enviorments/production.rb
config.action_controller.asset_host = "https://cdn.jd.com" <-cdn的网址。
一个更快的加速技巧:
如果使用的是 HTTP 1.1 通讯协定,一次对一个域名开2个连接,所以:
修改 config/environments/production.rb :
config.action_controller.asset_host = "http://cdn%d.jd.com"
然后起多个域名,但是都连到同一台主机上,也就是输出网址改成:
- cdn0.jd.com/images/demo.jpg
- cdn1.jd.com/assets/admin.css
- cdn2.jd.com/assets/admin.js
- cdn3.jd.com/assets/fonts/font-awesome.ttf
下载速度就快了。
申请服务:
中国境内 CDN 服务(网站需要备案才能申请使用)
国外 CDN (随时申请随时使用,但是中国境内没有 CDN 节点)
优化--前端(全占课,未完成作业:);CDN; Http/2的设置(未完成)的更多相关文章
- 萌新接触前端的第二课——CSS
前端知识——CSS CSS(英文全称:Cascading Style Sheets) 中文名层叠样式表,是一种用来表现HTML或XML等文件样式的计算机语言.CSS不仅可以静态地修饰网页,还可以配合各 ...
- 2017-2018-1 20155228 《信息安全系统设计基础》第六周学习总结&课下作业
20155228 2017-2018-1 <信息安全系统设计基础>第六周学习总结&课下作业 教材学习内容总结 异常及其种类 异常可以分为四类:中断(interrupt) ,陷阱(t ...
- 20165302 ch02 课下作业
20165302 ch02 课下作业 作业内容 补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点) 完成教材 p97 2.96 2.97,要有完备的测试 发一篇相关内容的博客, ...
- 20155212 ch02 课下作业
20155212 ch02 课下作业 T1 题目 参考附图代码,编写一个程序 "week0601学号.c",判断一下你的电脑是大端还是小端 相关知识 小端法:最低有效字节在最前面 ...
- 20155231 cho2 课下作业
20155231 cho2 课下作业 2 调用附图代码,编写一个程序 "week0602学号.c",用show_int(), show_float()打印一下你的4位学号,参考教材 ...
- 2017-2018-1 20155327 《信息安全系统设计基础》课堂测试&课下作业
2017-2018-1 20155327 <信息安全系统设计基础>课堂测试&课下作业 学习使用stat(1),并用C语言实现 提交学习stat(1)的截图 man -k ,grep ...
- 20155338 ch02 ch03课下作业
20155338 ch02 ch03课下作业 要求: 1.补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点) 课上测试-3-ch02 1.编写一个程序 "week060 ...
- 2018-2019-1 20165330 《信息安全系统设计基础》第六周课上测试ch02&课下作业
课上测试 测试-3-ch02 任务详情 编写一个程序 "week0203学号.c",运行下面代码: 1 short int v = -学号后四位 2 unsigned short ...
- 配置 FIS 来适配 go revel 框架以优化前端缓存策略
对于前端工程师来说,浏览器缓存优化是个永远的话题.前几天看了知乎上的一个问答:<大公司里怎样开发和部署前端代码?>,深以为然,所以决心使用 FIS 来优化自身的前端文件. 我们的项目使用了 ...
随机推荐
- 【php】---mysql语法增、删、改、查---【巷子】
1.mysql基本语法 001.增 语法: insert into 表名 (列1,列2,列3) values(值1,值2,值3) 批量插入:插入insert-插入多行 语 ...
- Oracle等待事件之db file sequential read/ db file parallel read
1.产生原因 db file sequential read这个是非常常见的I/O 相关的等待事件.表示发生了与索引扫描相关的等待.意味着I/O 出现了问题,通常表示I/O竞争或者I/O 需求太多. ...
- 为什么 要弄清楚 mysql int(5) int(11) bigint 自建mysql主键id python random 科学计数法
场景: 有1.2亿条问答数据,相同问题的不同答案为不同条的数据,且该表数据逐日递增: 第三方需求(不合理): 将问题.答案数据分别放入问题表.答案表: 问题表的主键为整数,在答案表中,每行数据有相应的 ...
- Andrew Ng机器学习公开课笔记 -- Generalized Linear Models
网易公开课,第4课 notes,http://cs229.stanford.edu/notes/cs229-notes1.pdf 前面介绍一个线性回归问题,符合高斯分布 一个分类问题,logstic回 ...
- 设计模式之——Chain of Responsibility
Chain of Responsibility模式又叫做责任链模式,是将多个对象组成一条职责链,然后按照职责链上的顺序一个一个的找出是谁来负责处理. 这个模式很简单,下面就是一个实例程序,有六个处理器 ...
- nginx:服务器集群
一.Nginx的事件处理机制 对于一个基本的web服务器来说,事件通常有三种类型,网络事件.信号.定时器. 首先看一个请求的基本过程:建立连接---接收数据---发送数据 . 再次看系统底层的操作 : ...
- Git学习-->关于Jenkins编译时候,如何获取Git分支的当前分支名?
一.背景 因为代码都迁移到了Gitlab,所以Jenkins编译的时候我们都需要将之前的SVN信息换成现在的Git信息.最近编译一个Lib库的时候,因为团队规定上传Release版本的AAR到Mave ...
- Mirror--程序访问镜像数据库的超时机制
程序在访问有镜像的数据库和无镜像的数据库时,采用的链接超时时间算法不一样,因此会导致在在有镜像的数据库上设置了15 S的超时时间,而实际的超时时间仅为3.6 S,从而导致有镜像的数据库更容易超时. 在 ...
- Laravel 5.* 中路由绑定 Controller 包含子目录写法
https://blog.csdn.net/maxsky/article/details/54017981 [可以使用命令在项目根目录一键创建 php artisan make:controller ...
- thinkphp5使用PHPMailler发送邮件
http://www.dawnfly.cn/article-1-350.html 想要了解thinkphp3.2版本发送邮件的,请点击此链接:http://www.dawnfly.cn/article ...