创作者 :丹丹@招聘FE 58招聘技术团队
序
浏览器缓存只是为了提升页面再次被访问的速度,而对于提升首次访问的响应能力,通常是采用CDN进行加速。CDN在前端优化过程中起着关键性的作用,理解CDN的工作原理对前端开发人员提升网站性能有着很大的帮助,本文从CDN工作原理、CDN缓存相关、前端优化三个角度对CDN常见问题进行基础介绍。
CDN工作原理
CDN是什么?
CDN(Content delivery networks,内容分发网络),其目的是通过在源服务器和用户之间增加一层新的网络架构,将网站的内容分发到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。我们的日常生活中,无论是在网站上看新闻,网上购物,观看视频,还是聊天,都和CDN息息相关。
使用CDN好处?
提升网页加载速度
处理高流量负载
无需成本完成本地化覆盖
减少带宽消耗
在多台服务器间均衡负载
使你的网站免于DDoS(拒绝服务)的攻击
……
CDN是如何工作的?
为了使用户和网站源服务器之间的“距离”最短,CDN需要在不同的地理位置(PoPs,接入点)存储网站内容的缓存。一般来说,每个PoP都包含多个缓存服务器,它们的主要作用是使用户访问到最近的缓存服务器,以此减少信息的往返时间,达到减少响应时间的目的。缓存服务器负责存储和分发缓存文件,主要功能是提升网站相应速度和减少带宽消耗。这些缓存文件会被存储在固态硬盘或者RAM中。
CDN缓存相关
CDN缓存?
用户在浏览网站的时候,浏览器在硬盘上保存网站中的图片或者其他文件的副本,用户再次访问该网站的时候,浏览器就不用再下载全部的文件,减少了HTTP请求数量。与服务器在硬盘上存储缓存文件类似,CDN将网站的内容移动到更为强大的代理服务器上,通过动态域名解析,用户的请求被分配到离自己最快的服务器,CDN服务器直接返回缓存文件或通过专线代理原站的内容,进而提升内容分发的速度。此时,浏览器和服务器的交互可以用下图表示:
CDN缓存内容的更新?
客户端浏览器先检查是否有本地缓存是否过期,如果过期,则向CDN边缘节点发起请求,CDN边缘节点会检测用户请求数据的缓存是否过期,如果没有过期,则直接响应用户请求,此时一个完成http请求结束;如果数据已经过期,那么CDN还需要向源站发出回源请求(back to the source request),来拉取最新的数据。
CDN缓存静态资源,常用的有:图片、视频、音乐、css、js文件等。
CDN缓存内容的有效期?
1. 原站apache吐出的静态文件:由apache的expire和header模块控制
主要两项:last-modified,cache-control:max-age
apache缺省配置,所有静态文件在cdn只缓存3600s(需要我们按需求调整被加速服务器的apache设置),3600s后CDN失效,用户访问时会重新请求原站,如果没有变化,缓存失效周期自动延长10%。
2. 原站jsp或php吐出的动态内容(url形式必须是静态的)
由程序控制last-modified,cache-control:max-age public ,apache的设置将不起作用,CDN根据这两项判断是否需要到原站更新内容。
CDN和应用的结合策略?
1. 变化不频繁的页面,在原站生成静态页面,原站apache上定义过期时间,例如1天。原站上静态文件更新后,可以等待CDN过期。或者主动通知CDN更新(随着CDN节点越来越多,代价会非常高)。
2. 变化频繁的页面,不生成静态页面,由jsp或php定义过期时间,例如5s或60s。CDN过期后,如果有用户访问就从原站上抓取。
优点:相关页面内容更新后,不需要主动通知100个原站都来抓取,有效降低原站的压力。
如果页面内容没有变化,返回last-modified不变,这样原站会直接返回304给CDN,CDN也会返回304给用户。减少网络传输和速度。
3. 特殊静态资源,或者频繁访问、频繁更新的页面,通过apache no-cache告诉IE不缓存,html中就不需要使用pinglun.js?123456这样的代码形式,然后用max-age告诉CDN缓存1s,这样避免每次用户请求都转到原站。
CDN缓存策略?
开发人员采用HTTP缓存头来标记可缓存的内容以及设置缓存过期时间,采用缓存策略来确保内容的新鲜度。如“Cache-Control: max-age=600”表示该文件在用户浏览器缓存的副本将在10分钟后过期,Fiddler可以方便地查看缓存的header。浏览器缓存相关内容在此不做介绍。
CDN有两种方式可以检测浏览器中缓存和源服务器上文件是否匹配:比较最新修改日期Last-Modified和比较ETag。
如果每个文件都进行标记,会导致效率非常低下。如果发现缓存头指令不再适合,开发人员可以对缓存头进行重写。现有的很多智能缓存控制算法都可以通过机器学习,识别动态生成对象的缓存。
前端优化
HTTP请求数?
我们都知道减少HTTP请求可以提升网站的响应能力,虽然CDN本身不能减少请求的数量,但是CDN可以通过预池连接(pre-pooling connection)来减少关闭和重新打开TCP连接引起的时间延迟。
缓存控制?
很多CDN都提供缓存控制选项,允许我们根据文件类型或者位置对单个文件甚至整个文件组设置缓存规则。CDN通过机器学习可以缓存动态内容,这就减轻了几乎所有的缓存管理任务。
Gzip和Minify?
CDN在前端优化的过程中起着关键性作用,经常被用来简化很多耗时的优化任务。例如CDN会提供自动压缩文件功能,避免了手动压缩。
图片优化?
CDN往往是图片缓存的首选项,并且需要购买才能使用这项服务。很多先进的CDN在原来无损压缩的概念上提出一种渐进渲染的方法,先加载像素化版本的图片,随后用一系列更“清晰”的版本代替该图片,直到实际的图片做好了加载的准备。渐进渲染可以在不牺牲图片质量的条件下缩短加载时间。
总结
本文对CDN的工作原理和CDN缓存进行了基础介绍,了解CDN缓存和浏览器缓存将对前端工作人员的优化之路提供很大的帮助,更多前端优化的技术将在后续陆续为大家呈现。
若有理解不对的地方欢迎大家批评指正。
源:教育部学校规划建设发展中心“未来学校研究与实验计划”未来学校创新成果
清华大学建筑设计研究院 黄献明
一、概述(一)内部 “内部”通常指的是以建筑围护结构或校园围墙等物理性边界为限定标志的,校园建筑或校园范围以内的部分。
(二)外部 “外部”则是相对建筑或校园的“内部”而言,通常是指在建筑的室外、建筑与建筑、校园与城市其他空间限定要素之间的空间。
一般意义上的“外部”并非指“内部”以外的全部的空间,它具有一定的范围。日本建筑师芦原义信认为建筑的“外部”是:从自然当中有框框所划定的空间,与无限伸展的自然是不同的。“外部”是由人创造的、有目的的室外环境,是比自然更有意义的空间。由于被一定的边界所包围,“外部”空间建立起从边界向内的向心秩序,在该边界中创造出满足人的意图和功能的积极空间。相对的,自然是无限延伸的离心空间,可以把它认为是消极空间。
图1 外部空间从限定自然开始[1]
在建筑或校园形成的同时,“外部”空间也就形成了,“内部”与“外部”之间相互影响、相辅相成。
图2 自然空间与外部空间的区别[2]
(三)连接 “连接”空间具有如下特征[3]:
1) 结构性:“连接”空间应使得其所联系的对象形成一个整体;
2) 中介性:作为连接体,“连接”空间是其所联系对象的相交部分;
3) 模糊性:由于“连接”空间的出现,使得其所联系对象的边界变得不确定。
未来学校外部与内部的连接将分为三个层次,第一个层次应是物理空间上的连接,即连接着校园内外、教学建筑内外的各种过渡性空间,如校门空间、连廊空间、屋顶空间等;第二层次是人文社会上的连接,即学校与社会之间的开放、合作与资源共享;第三个层次是虚拟的连接,即基于互联网的线上学习与交流。
由于信息技术的发展、泛在学习的趋势以及全民终生教育的需求,中小学校“外部”与“内部”的物理界限正在被弱化乃至消解,有关“外部和内部的连接”的讨论,“虚拟连接”的比重将获得提升。由于“虚拟连接”在其他条目中已有专项研究,且对学校总体的物理空间影响不大,故本条目研究主要集中在前两个层次的内外连接上。
图3 从物理空间连接到虚拟空间连接
二、指导原则(一)自然共生——尊重生态原则尊重自然生态环境,是校园及其建筑在处理外部与内部连接时,需要首要遵循的基本原则。通过“连接”将校园及其建筑与外部更大范围的自然生态环境融为一体,综合考虑涉及的资源、能源、健康、舒适、生物多样性等多维度问题,促进实现环境友好型校园的建设目标。
图4 校园及其建筑内外部空间连接的生态性表现
(二)促进交流——人文优先原则从参与的角度,未来学校的内外连接涉及到学生、教职工、家长、社区居民、过路群众等多个群体,应坚持以人为本,兼顾各群体的生理需求与心理需求,创造为人服务的人性化场所。
从教育的角度,未来学校重点关注培养学生的核心能力包括:创新、批判、沟通、合作[4],其中沟通无论是对于整合碎片化的学习信息(未来教育的主要责任将从学习信息的传递变为指导碎片化学习信息的整合),还是促进多群体合作、激发犀利的批判还是实现多样的创新,都是必不可少的活动和积能,因而作为校园内外的“连接”、建筑内外的“连接”、教学等空间内外的“连接”,都将是以是否有助于促进而非隔绝沟通与交流,作为评价其成功与否的关键性指标。
图5 促进交流的内外“连接”空间
三、实施重点(一)校园内外的连接 1.格局——开放性校园
虽然目前在校园对社区开放方面,学校可能因担心管理维护成本上升、校园安全失控等问题,而仅在学生离校——放学后或假日,将校园局部(如体育场)开放给社区居民使用。但从更为长远的未来视角看,校园将在社区开放方面走得更远,正如Meckenzie早在1989年的《规划教育设施》(Planning Educational Facilities)一书中指出的:
校园的规划应使其成为多功能的教育场所...成为社区的核心角色,礼堂/剧场、艺术中心、音乐实验室、美术教室,应成为校园生命活力的要素,让社区的每一个人都使用它,从而实现学校多面向服务社会的目标。
由于开放性校园理念的实施,带来包括校园出入口数量与位置、教育设施的规模与选址、校园的交通组织与管理等层面,出现更多新颖、灵活的校园外部与内部连接方式,从而带动未来空间格局的转变。
2.节点与界面——校园入口空间、围墙
由于信息技术的飞跃以及社区融合的需求,未来学校的边界将最终走向消解,因而作为目前校园外部与内部连接关键节点与界面的“校园入口空间”与“围墙”,也将经历功能复合化、边界模糊化,乃至最终形式“礼仪化”的演变过程。
图6 校园入口空间组织模式[5]
(一)建筑内外的连接 1.气候缓冲空间
建筑室内外交接的空间除了单一的围护结构界面外,还可以通过构建实际功能空间(如教室、实验室、办公室等)与室外环境之间的过渡性空间,隔绝室外不利环境要素(如风、温度、噪声等)对主要功能空间的影响,从而达到提高建筑品质的目的。典型气候缓冲空间的设计手段包括:
(1)功能性围合体:通过遮阳、绿化等手段,使得建筑室内外交接的部分不再是简单的围护结构界面,而通过更为功能化的设计,得以在采光、通风方面,发挥更为“主动”的作用,从而增加了建筑与室外联系界面的内涵。为学生提供理想的学习活动场所。
(2)架空层:在如华南这样的气候多雨潮湿地区,常在底部架空,一方面缓和室内外绝对的界限,有机地将自然融入建筑中,同时架空层有利于通风去湿。
局部开敞或全开敞的空间形式,具有开放、流通的特征,可以作为学生游戏活动、学习交流、交通联系的场所。
图7 气候缓冲空间
2.非正式学习空间
建筑及其周边环境形成积极的互动关系,是每个成功校园的共同特征,建筑不仅发挥界定和围合开放空间的作用,同时应该尽可能融入其中。建筑边缘在形成群体聚集模式、促进社会交往等方面发挥重要作用。为此,与外部空间进行直接接触的建筑首层需要特别注意营造宜人尺度,利用合理的功能和空间布局,吸引人们参与其中。
在可能的情况下,沿着建筑的周边设置这样的活跃“边缘”,并将建筑室内向这些“边缘”开放。应尽可能将这些“边缘”通过校园步道联为整体,从而形成一个完整的附着于步行系统的半开放空间系统。在“边缘”空间中设置大堂、邮政、咖啡、小卖、学生信息等功能,将有助于形成社区意识和激发创意交流。
图8 建筑“边缘”的利用
四、案例[6]——北大附中朝阳未来学校, 25916m2,2017 (一)办学理念北大附中朝阳未来学校,是一所面向未来,由北大附中直接管理的四年制公办普通中学。学校基于北大附中多年教育改革经验,采用4+x培养模式,以学生为中心,从才学、心智、体育、审美和个性上,为每一位学生提供学习与生活成长培养方案,引导学生积极探索兴趣与发展路径,一方面为进入国内外一流大学做好充分准备,同时通过混合式学习、项目制合作等历练,培养学生的自主性、批判性思维和公民素养,使学生适应未来社会多元化、个性化的发展需求。
(二)教学模式【1+3新学制】
面向城六区一般校完成初二年级学业的学生进行招生,录取的学生可直接由初三升入高中,连续完成初三及高中共四年学习。这样可以节省学生中考应试的时间,更好地过渡到高中学习中,并有充足的时间进行学生个人兴趣的探索和素质的综合发展。
【书院制】
在书院指导教师的引导下,学生自主管理书院的事务,以书院为集体参加学校舞蹈节和戏剧节等大型活动。
【导师制】
每个学生都有专属的导师,关爱、引导和陪伴每一个学生的成长。
【小班制】
大部分课程采用20人以内的小班教学,灵活选用项目制、探究讨论和混合式的学习方式,学生有更多合作交流、动手实验和社会实践的机会。
【选课制】
对于选择参加国内高考的学生,进入高二以后,导师会个性化的帮助每个学生选择高考方案,学校的考试中心将为选择高考的高三学生提供包括自主招生,个性化辅导在内的高效的复习备考课程;
对于选择毕业后出国留学的学生,可以更自由的选择和规划四年的学习,并得到专业的留学申请指导。
学生每学期要签订学习契约,导师和每个课程的教师都会与家长一道关注学生契约的完成情况,力图让每个学生具备未来社会需要的基本素养和综合能力,更重要的是,未来学校努力让每个孩子更快乐健康的个性化的成长。
(三)空间设计设计要求——以开放、舒适、多元、立体为目标打造学习空间,营造多样专业学科环境,适应人文、科学(开展课题选择、对比实验、项目讨论等一系列科学相关课程)、艺术(可进行剧本创作、灯光舞美设计以及展示表演等沉浸式学习体验)、创客等教学需求。
设计理念——全方位体现“开放”教学理念(包括对内促进学科的融合、对外面向社区的开放)
传统:各种功能空间相对独立,边界分明,比如体育馆是运动的场所,教室是安静听课、学习的场所,文体室是关起门来唱歌跳舞的场所。走廊和教室是分开的,教室内部是单向的,老师在讲台上讲,学生坐在下面听。
创新策略
1.打破常规
原来校园里小操场只有280m的非标准跑道,没有400m跑道。新设计结合学生对于跑步的实际需求对校园总体布局进行了思考,围绕着校区设计了一个不规则的慢跑跑道,既相对灵活又解决了设计的功能需求。
图9
2.打破边界
把教室的墙体打断,改造为灵活的隔断墙,将原来单向的空间布局变为多向。在每个单元空间上形成一个向外突出的折角,在室内外都创造出更多的空间。
图10
图11
2.活动植入
改变传统校园围墙的僵硬和单薄感,通过加入不规则的空间和植入座椅,使师生可以在其中休憩并由此形成与外界交流的场所,形成生动的“游廊”空间,从而赋予校园边界活力和温度。
图12
图13
4.功能复合
改变传统空间功能单一化的模式,使餐厅、走道等空间通过灵活布置,适应不同休闲、教学、交流活动的需要。
图14
图15
--------------------------------------------------------------------------------
[1] 芦原义信著,尹培桐译,外部空间设计,中国建筑工业出版社,1985,4
[2] 芦原义信著,尹培桐译,外部空间设计,中国建筑工业出版社,1985,4
[3] 朱云琛,连接与空间,湖北美术学院硕士论文,2017,7-8
[4] 教育的未来与未来的学校,http://www.hlgzx.com/news/lilun/2017-09-18/15057197023344.html
[5] 牛牧,城市新区小学门前区空间研究,南京工业大学硕士论文,2014,73
[6] https://www.gooood.cn/
前端知识体系:https://mp.toutiao.com/core/article/new_article/
前端知识结构:https://github.com/JacksonTian/fks
Web前端开发大系概览:https://github.com/unruledboy/WebFrontEndStack
Web前端开发大系概览-中文版:http://www.cnblogs.com/unruledboy/p/WebFrontEndStack.html
免费的编程中文书籍索引:https://github.com/justjavac/free-programming-books-zh_CN
前端书籍:https://github.com/dypsilon/frontend-dev-bookmarks
前端免费书籍:https://github.com/vhf/free-programming-books
麻省理工学院公开课:计算机科学及编程导论:http://open.163.com/special/opencourse/bianchengdaolun.html
智能社 - 精通JavaScript开发:http://study.163.com/course/introduction/224014.htm#/courseDetail
JavaScript中的this陷阱的最全收集--没有之一:https://segmentfault.com/a/1190000002640298
JS函数式编程指南:https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch1.html
JavaScript Promise迷你书(中文版):http://liubin.org/promises-book/
腾讯移动Web前端知识库:https://github.com/AlloyTeam/Mars
- Front-End-:https://github.com/icepy/Front-End-Develop-Guide
Develop-Guide 前端开发指南:https://github.com/icepy/Front-End-Develop-Guide
前端开发笔记本:https://www.gitbook.com/book/li-xinyang/frontend-notebook/details
大前端工具集 - 聂微东:https://github.com/nieweidong/fetool
前端开发者手册:https://dwqs.gitbooks.io/frontenddevhandbook/content/
前端入门教程:http://www.cnblogs.com/jikey/p/3613082.html
瘳雪峰的Javascript教程 : http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000
- 前端工程师必备的PS技能——切图篇: http://www.imooc.com/learn/506
- 结合个人经历总结的前端入门方法:https://github.com/qiu-deqing/FE-learningdis
- 弹出层 :http://www.imooc.com/learn/58
- 焦点图轮播特效:http://www.imooc.com/learn/18
- css sprite 雪碧图制作:http://www.imooc.com/learn/93
- 版本控制入门 – 搬进 Github : http://www.imooc.com/learn/390
- Grunt-beginner前端自动化工具:http://www.imooc.com/learn/30
- chrome开发中心(chrome的内核已转向blink): https://developer.chrome.com/extensions/api_index.html
- safari开发中心 :https://developer.apple.com/safari/resources/
- microsoft js参考:https://msdn.microsoft.com/zh-cn/library/d1et7k7c(v=vs.94).aspx
- js秘密花园 :
- js秘密花园 :
- w3help 综合Bug集合网站:http://www.w3help.org/zh-cn/kb/
- 各种流行库搜索:http://microjs.com/#
- runoob.com-包含各种API集合:http://www.runoob.com/
- 开源中国在线API文档合集 : http://tool.oschina.net/apidocs
- devdocs 英文综合API网站:http://devdocs.io/
jQuery API 中文文档:
* hemin 在线版*:http://www.jquery123.com/
css88 jq api*:http://hemin.cn/jq/
css88 jqui api*: http://www.css88.com/jqapi-1.9/on/
学习jquery*:http://learn.jquery.com/
jquery 源码查找:https://j11y.io/jquery/
- Understanding ECMAScript 6- Nicholas C. Zakas:https://leanpub.com/understandinges6/read
- exploring-es6:https://leanpub.com/exploring-es6/read
- exploring-es6翻译:https://github.com/es6-org/exploring-es6
- exploring-es6翻译后预览:http://es6-org.github.io/exploring-es6/
- 阮一峰 es6:http://es6.ruanyifeng.com/
- ECMA-262,第 5 版:http://yanhaijing.com/es5/#null
- es5:http://es5.github.io/
- template-chooser:http://garann.github.io/template-chooser/
- artTemplate:https://github.com/aui/artTemplate
- tomdjs:https://github.com/aui/tmodjs/blob/master/README.md
- 淘宝模板juicer模板:http://juicer.name/docs/docs_zh_cn.html
- Fxtpl v1.0 繁星前端模板引擎:http://koen301.github.io/fxtpl/
- laytpl:http://laytpl.layui.com/
- mozilla - nunjucks:https://github.com/mozilla/nunjucks
- Juicer:https://github.com/PaulGuo/Juicer
-dustjs:http://akdubya.github.io/dustjs/
- etpl:http://ecomfe.github.io/etpl/
- artDialog 最新版:https://github.com/aui/artDialog
- artDialog 文档:http://aui.github.io/artDialog/doc/index.html
- google code 下载地址:https://code.google.com/p/artdialog/downloads/list
- 贤心弹出层:http://layer.layui.com/
- 响应式用户交互组件库:https://github.com/bh-lay/UI
- sweetalert-有css3动画弹出层:http://t4t5.github.io/sweetalert/
- CSS 语法参考:http://tympanus.net/codrops/css_reference/
- CSS3动画手册:https://isux.tencent.com/css3/index.html
- 腾讯css3动画制作工具:https://isux.tencent.com/css3/tools.html
- 志爷css小工具集合:http://linxz.github.io/tianyizone/
- css3 按钮动画:http://fian.my.id/Waves/
- animate.css:https://daneden.github.io/animate.css/
- 全局CSS的终结(狗带) [译]:http://www.alloyteam.com/2015/10/8536/
*请认真填写需求信息,我们会在24小时内与您取得联系。