diff --git a/0-index-WEB.html b/0-index-WEB.html index 7a6c6747..c47b2f51 100644 --- a/0-index-WEB.html +++ b/0-index-WEB.html @@ -44,6 +44,14 @@

WEB小课堂 表格

分享标题 关联任务 + + 2020-6-30-JS-A组 + 2020.6.30 + + 网站性能优化 + + js-10 + 2019-9-1-A组 2019.9.1 diff --git "a/2020-6-30-A\347\273\204JS10/CDN.jpg" "b/2020-6-30-A\347\273\204JS10/CDN.jpg" new file mode 100644 index 00000000..562b04f3 Binary files /dev/null and "b/2020-6-30-A\347\273\204JS10/CDN.jpg" differ diff --git "a/2020-6-30-A\347\273\204JS10/HTTP\350\257\267\346\261\202.jpg" "b/2020-6-30-A\347\273\204JS10/HTTP\350\257\267\346\261\202.jpg" new file mode 100644 index 00000000..b6230be1 Binary files /dev/null and "b/2020-6-30-A\347\273\204JS10/HTTP\350\257\267\346\261\202.jpg" differ diff --git "a/2020-6-30-A\347\273\204JS10/HTTP\350\257\267\346\261\202\350\277\207\347\250\213.jpg" "b/2020-6-30-A\347\273\204JS10/HTTP\350\257\267\346\261\202\350\277\207\347\250\213.jpg" new file mode 100644 index 00000000..2524a92f Binary files /dev/null and "b/2020-6-30-A\347\273\204JS10/HTTP\350\257\267\346\261\202\350\277\207\347\250\213.jpg" differ diff --git "a/2020-6-30-A\347\273\204JS10/\346\207\222\345\212\240\350\275\275\345\233\276\347\211\207\346\226\271\346\263\225.png" "b/2020-6-30-A\347\273\204JS10/\346\207\222\345\212\240\350\275\275\345\233\276\347\211\207\346\226\271\346\263\225.png" new file mode 100644 index 00000000..008a89c4 Binary files /dev/null and "b/2020-6-30-A\347\273\204JS10/\346\207\222\345\212\240\350\275\275\345\233\276\347\211\207\346\226\271\346\263\225.png" differ diff --git a/20200630-A-JS10.html b/20200630-A-JS10.html new file mode 100644 index 00000000..c0d6493e --- /dev/null +++ b/20200630-A-JS10.html @@ -0,0 +1,606 @@ + + + + + + + 葡萄藤PPT + + + + + + + + + + + + + + + + + + +
+
+
+

如何进行网站性能优化?

+

分享人:广州web学员谢俊凯

+
+
+

目录

+

1.背景介绍

+

2.知识剖析

+

3.常见问题

+

4.解决方案

+

5.编码实战

+

6.扩展思考

+

7.参考文献

+

8.更多讨论

+
+ +
+

1.背景介绍

+
+ +
+ +
+

+ 为什么要优化网站? +
+ 一个快速反应的网站,能够提升用户体验,页面加载得更快、对用户的操作响应得更快速,能够给用户提供更为舒适的体验。 +
一个网站的体验,决定了用户是否愿意去了解网站的功能;而网站的功能,决定了用户是否会一票否决网站的体验。 +
+ 恰当的优化不仅能够改善用户体验且能够节省资源利用。 +
+
+
+

+
+ +
+
+

2.知识剖析

+
+
+

+
网页的生成: +
1.浏览器读取html。浏览器会将HTML转换成一种格式 – 文档对象模型(Document Object Model)简称为 DOM,每一个 HTML 标签都对应着树种的某个节点(DOM节点)。 + +
2.解析CSS。页面上的 CSS 样式被映射到CSS 对象模型(CSS Object Model)。CSS 不阻塞 DOM 的构建,它会阻塞 DOM 的渲染,直到 DOM 和 CSSOM 准备好之前,浏览器什么都不会显示 + +
3.结合DOM和CSSOM,生成一颗渲染树。 + +
4.生成布局(layout),即将所有渲染树的所有节点进行平面合成 + +
5.将布局绘制在屏幕上 +
这是浏览器读取html到渲染的过程。 +

+
+ + + + +
+

+

3.常见问题

+
如何优化? +

+
+
+

4.解决方案

+
+ +
+

+ 1,雪碧图:CSS Sprite(CSS精灵) +
+
雪碧图就是一个很好的优化图片加载的例子,当页面有大量的icon的时候,就可以使用雪碧图。 +
雪碧图的设计理念就是减少页面加载大量图片的请求,只加载一张图片。 +
+

+
+
+
+

+ 2,使用外联的CSS文件和JS文件 +

+
+
+

+ 简单的说下css的外联内联和内嵌。 +
从功能上来说,这3个实现的功能是一样的。从权重层级从权重最高的说起, +
1:嵌套样式,也就是在head(html的头部)这是一个最先接触到的写法。 + <style> div{color:red;} </style> +
2:内联"<p + style="color:red;">文字内容<p>"而内联样式也不是没有优点,好处就是减少http请求,提升页面性能,缓解服务器压力。由于浏览器加载完 + CSS 才能渲染页面,因此能防止 CSS + 文件无法读取而造成页面裸奔的现象。 +
3:外联样式,使用link链接到指定地址。因为把样式都写到外部文件,所以会加快html的加载速度,且可以缓存到浏览器,提升重复访问时的html加载速度。 +
而且link的调用是与页面同步加载。 +

+
+
+ +
+
+

+ 3-1,压缩静态资源----压缩图片和视频 +
+ 为什么要压缩? + 图片和视频的上传一般情况下不需要上传大体积的图片,因为大体积图片很消耗资源,一个是加载耗时比较长,同时也增加了存储的开销,当展示的时候也会消耗下载的带宽,影响加载效率。 +
如果不压缩,就像我们使用手机网络在线看一些高清视频,因为手机的网络不稳定或者网页的,加载非常慢,像是视频,看半截卡半截,这就是一个非常难受的体验了。 +
目前比较方便的方法是使用软件进行压缩或者网页进行在线压缩。 +

+
+ + +
+

+
不要在浏览器里面缩放图片,比如一个200 像素x + 200像素的空间里面放入一个400 x + 400的图片,这样做除了加重服务器的负担以外并不会有任何清晰度的提升。 +
若是一些通用icon可以使用图标库,比如ui框架一般都会提供icon库,或者可以使用link链接访问阿里的矢量图标库http://www.iconfont.cn/ +
转换格式为WebP格式,这是谷歌开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间。Facebook、Ebay等知名网站已经开始测试并使用WebP格式。 +
兼容的问题目前只支持Chrome(谷歌)和Opera(欧朋浏览器),暂时没看到有大量使用这个的现象,如果想尝试一下可以使用网址:https://www.upyun.com/webp 去进行体验。 +

+
+
+

+ 3-2,webpake +
webpack的功能:可以看做是模块打包机器,
+ 它做的事情是:分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。 + 同时也能转换、捆绑、打包其他的静态资源,包括css、image、font file、template等。 +
在使用方面,如果只是单独使用webpack的话,也是有相当多的参数需要学习,但是我们在使用js框架编译打包的时候,使用指令可以实现自动打包,而打包过程就是JS框架封装好的webpack。 +

+
+
+
+
+

+ 4,懒加载: +
懒加载的应用在学习路由配置的时候首次接触到的,angular的路由懒加载loadchildren,懒加载的功能是使页面需要用到该文件/模块的时候才进行加载,能够使页面在拥有大量模块的时候(或者图片),不需要一次性加载完成,提升了页面的载入速度。 +
+
+

+
+
+

+
页面加载太慢往往是因为图片资源过多占用太多加载资源导致的,因为大量图片的话,往往页面载入会非常耗时,所以除了缩小图片体积,使用雪碧图,最重要的就是使用图片的懒加载进行优化。 +
图片的懒加载,如果页面比较长,或者图片较多的话,首先使用一个轻量级的图片,占位,监听页面的滚轮,如果滚动到当前图片位置的话,就加载该图片,这是懒加载图片的原理。 +
+

+
+
+
+
+

+ 5,CDN +
+
什么是CDN?CDN的全称是Content Delivery + Network,就是一个内容分发网络。CDN网络的诞生大大地改善了互联网的服务质量. +
(1)节省骨干网带宽,减少带宽需求量; +
(2)提供服务器端加速,解决由于用户访问量大造成的服务器过载问题; +
(3)服务商能使用Web + Cache技术在本地缓存用户访问过的Web页面和对象,实现相同对象的访问无须占用主干的出口带宽,并提高用户访问因特网页面的相应时间的需求; +
(4)能克服网站分布不均的问题,并且能降低网站自身建设和维护成本; +
(5)降低“通信风暴”的影响,提高网络访问的稳定性。 +
+

+
+
+

+
CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。 +
内容服务基于缓存服务器,也称作代理缓存(Surrogate),它位于网络的边缘,距用户仅有"一跳"(Single + Hop)之遥。同时,代理缓存是内容提供商源服务器(通常位于CDN服务提供商的数据中心)的一个透明镜像。这样的架构使得CDN服务提供商能够代表他们客户,即内容供应商,向最终用户提供尽可能好的体验,而这些用户是不能容忍请求响应时间有任何延迟的。 +
+
以上均来自百度。 +
+

+
+
+ +
+
+

+
个人理解的CDN: +
租用网络运营商在各个地方架设的缓存服务器,相当于缩短了请求的路径,就近原则获取数据,缩短了数据的请求距离,也分割了大量用户访问的话造成的通信风暴影响,经由各地的服务器进行处理过后发送到主干服务器。 +
在我看来有点像使用梯子翻墙,我们裸连不使用梯子访问git反应速度很慢,因为git的服务器在国外,虽然没被墙,但是请求数据到获取回应,返回数据什么的因为跨太平洋请求,数据传输延时,所以会很卡。 +
此时我们使用梯子访问,我们通过运营商服务器,变成外国用户访问,所以访问速度会很快(相对国内)。 +
+

+
+ +
+
+
+

+ 6,能缓存就缓存,能缓存多久就缓存多久 +
缓存的意义就在于减少请求,更多地使用本地的资源,给用户更好的体验的同时,也减轻服务器压力。而缓存又分为强缓存和协商缓存,协商缓存就是每次读取缓存的时候像服务器发送一次请求,是否要读取缓存,强缓存顾名思义,就是强制读取缓存。 +
两者的区别就是是否需要向服务器验证本地缓存是否还有效。 +
可能导致的问题:服务端资源更新后,客户端更新滞后 +
两种缓存都是通过修改请求头的参数进行设定。 +

+
+
+

+ + + +

+
+ +
+ + + + +
+

5.编码实战

+ +
+
+ + + +
+

6.扩展思考

+
+
+ + +
+ +
+

7.参考文献

+
+
+
+ 博客 +
+
+ 简书 +
+
+
+

8.更多讨论

+
+
+

+
+

+

+

+

+

+
+
+

+

+

+

+

+

+
+
+

鸣谢

+

感谢大家观看

+

+ By + 谢俊凯 +

+
+
+
+ + + + + + + diff --git a/20200718-A-JS10.html b/20200718-A-JS10.html new file mode 100644 index 00000000..c65f8d15 --- /dev/null +++ b/20200718-A-JS10.html @@ -0,0 +1,494 @@ + + + + + + + + 葡萄藤PPT + + + + + + + + + + + + + + + + + + +
+
+
+

+ JS哪些操作会造成内存泄漏?

+

分享人:深圳web学员谢俊凯

+
+
+

目录

+

1.背景介绍

+

2.知识剖析

+

3.常见问题

+

4.解决方案

+

5.编码实战

+

6.扩展思考

+

7.参考文献

+

8.更多讨论

+
+ +
+

1.背景介绍

+
+ +
+ +
+

+ 什么是内存泄漏? + +
程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存. +
对于持续运行的服务进程(daemon),必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。 +
不再用到的内存,没有及时释放,就叫做内存泄漏 +
+
+
+

+
+ +
+
+

2.知识剖析

+
+

+
不管什么程序语言,内存生命周期基本是一致的: +
1:分配你所需要的内存 +
2:使用分配到的内存(读、写) +
3:不需要时将其释放\归还 +
所有语言第二部分都是明确的。第一和第三部分在底层语言中是明确的,但在像JavaScript这些高级语言中,大部分都是隐含的。 +
为了不让程序员费心分配内存,JavaScript 在定义变量时就完成了内存分配。 +
像C语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。 +

+
+
+

+
JS的回收机制 +
JavaScript垃圾回收的机制:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收系统会按照固定的时间间隔,周期性的执行。(类似节流函数) + 到底哪个变量是没有用的?所以垃圾收集器必须跟踪到底哪个变量没用,对于不再有用的变量打上标记,以备将来收回其内存。用于标记的无用变量的策略可能因实现而有所区别,通常情况下有两种实现方式:标记清除和引用计数。 +

+
+ +
+

+
引用计数 +
引用计数的含义是跟踪记录每个值被引用的次数。 + 当声明了一个变量并将一个引用类型值(function object array)赋给该变量时,则这个值的引用次数就是1。 + 如果同一个值又被赋给另一个变量,则该值的引用次数加1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减1。当这个值的引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾回收器下次再运行时,它就会释放那些引用次数为0的值所占用的内存。 +

+
+
+

+
例子: +
function test(){ +
var a={};// 声明变量为引用类型 a的引用次数为0 +
var b=a;//a的引用次数加1,为1 +
var c=a;//a的引用次数加1,为2 +
var b={};//b引用被覆盖,a的引用次数减1,为1 +
} +

+
+
+

+
引用计数有个缺陷,无法处理循环引用的事例,如下 +
function f(){ +
var o = {}; +
var o2 = {}; +
o.a = o2; // o 引用 o2 +
o2.a = o; // o2 引用 o +
return "azerty";} +
f(); +
在上面的例子中,两个对象被创建,并互相引用,形成了一个循环。 + 它们被调用之后会离开函数作用域,所以它们已经没有用了,可以被回收了。 + 然而,引用计数算法考虑到它们互相都有至少一次引用,所以它们不会被回收。造成了内存泄漏。 +

+
+
+

+
标记清除 +
这个算法把“对象是否不再需要”简化定义为“对象是否可以获得” +
js中最常用的垃圾回收方式就是标记清除。当变量进入环境时,例如,在函数中声明一个变量,就将这个变量标记为“进入环境”。 + 从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。 + 而当变量离开环境时,则将其标记为“离开环境”。 + function test() { +
var a=10;//被标记,进入环境 +
var b=20;//被标记,进入环境 + } +
test();//执行完毕之后a、b又被标记离开环境,被回收 +

+
+
+
+

+

3.常见问题

+
①哪些操作会造成内存泄露? +
②怎么找出内存泄漏? +

③怎么处理内存泄漏? +
+
+

4.解决方案

+ + +
+

+ ①,意外的全局变量引起的内存泄露(全局变量只有关闭/刷新浏览器才会被释放或回收) +
function leak(){ +
leak="xxx";//没声明导致leak成为一个全局变量,不会被回收 +
} +

console.log(leak) // xxx +
+
+

+ ②意外的this创建了全局变量 +
function foo() { +
this.variable = "潜在的全局变量"; +
} +
// 当在全局作用域中调用foo函数,此时this指向的是全局对象(window),而不是'undefined' +
foo(); +

+
+
+

+
解决方法: +
在JavaScript文件中添加'use strict',开启严格模式,可以有效地避免上述问题 +
function foo() { +
"use strict" // 在foo函数作用域内开启严格模式 +
bar = "未声明的全局变量"; +
// 报错:因为bar还没有被声明 +
} +

+
+
+

+ 如果需要在一个函数中使用全局变量,可以像如下代码所示,在window上明确声明: +
function foo() { +
window.bar = "这是一个全局变量"; +
} +
关于全局变量,优化可以在使用完之后,给全局变量赋值为null,进行内存回收,也是一个优化方法。 +

+
+
+

+
常见内存泄漏问题: +
console.log:向web开发控制台打印一条消息,常用来在开发时调试分析。有时在开发时,需要打印一些对象信息,但发布时却忘记去掉console.log语句,这可能造成内存泄露。 +
在传递给console.log的对象是不能被垃圾回收 ♻️,因为在代码运行之后需要在开发工具能查看对象信息。所以最好不要在生产环境中console.log任何对象。 +
用完了在整合项目的时候记得注释掉或者删除。 +

+
+
+

+ ②,闭包引起的内存泄露 +
闭包就是能够读取其他函数内部变量的函数,相当于函数内部函数调用父级变量,闭包通常用来引出函数内变量,而这种行为会导致闭包一直占用内存,为了优化,或者说避免内存泄漏,在退出函数前需要删除用不到的局部变量 +
function assignHandler ( ) { +
var element = document .getElementById( "someElement" ); +
element.onclick = function ( ) { +
alert(element.id); +
}; + +
匿名函数调用函数外的element,导致element至少有一次引用,不会被清除,造成内存泄漏。 + +

+
+
+

+ 解决办法: +
function Handler ( ) { +
var element = document .getElementById( "someElement" ); +
var id = element.id // 变量相当于记录了element.id +
element.onclick = function ( ) { +
alert(id); // 此时 +
} +
element = null //回收, +
}; +

+
+
+

+ dom泄漏 +
为了减少DOM访问次数,一般情况下,当需要多次访问同一个DOM方法或属性时,会将DOM引用缓存到一个局部变量中。 +
但如果在执行某些删除、更新操作后,可能会忘记释放掉代码中对应的DOM引用,这样会造成DOM内存泄露。 +
同样把局部变量 = null进行释放。 +
+

+
+
+

+ timer未clear造成的泄漏 +
如果在不需要setInterval()时,没有通过clearInterval()方法移除,那么setInterval()会不停地调用函数, + 直到调用clearInterval()或窗口关闭。如果链式setTimeout()调用模式没有给出终止逻辑, + 也会一直运行下去。因此再不需要重复定时器时,确保对定时器进行清除,避免占用系统资源。 + +

+
+ +
+
+

5.编码实战

+
查看内存泄漏与调试方法,console.log是否被回收。 +
+
+ +
+

6.扩展思考

+
+
+ + +
+ +
+

7.参考文献

+
+
+
+ 博客 +
+
+ 简书,知乎 +
+
+
+

8.更多讨论

+
+
+

+
+

+

+

+

+

+
+
+

+

+

+

+

+

+
+
+

鸣谢

+

感谢大家观看

+

+ By + 谢俊凯 +

+
+
+
+ + + + + + + + \ No newline at end of file