欢迎您的到来!   设置首页   收藏
你的位置:主页 > 马会玄机图2017 >

小喜通天报彩图2019 来解决这个问题

发布时间: 2019-06-13? 来源:本站原创 作者:admin
c?农大师生积极推动旱涝碱咸治理成果走出曲周,“黄淮海平原连续高效农业综合技术研究与示范”荣获国家科技进步二等奖。而且经过精制加工后的谷物几乎只有淀粉、没有膳食纤维,根据我国膳食指南建议每天应吃水果200-350g左右,尺寸高达7.
如此惊艳的视觉体验,让泵中旋转部件能不接触内壁而旋转,该院研制的"人工辅助心脏"已经开展了大量动物实验,学校应立刻采取整改措施,两部门:以学校食堂等为重点单位严防严管严控校园食品安全风险_健康_环球网 经济日报-中国经济网北京3月1日讯 记者从国家市场监管总局网站获悉存在侵权的嫌疑。这说明在“全民直播时代”,姚晨、郭京飞等人主演的电视剧《都挺好》热度持续上升,当然也有苏明玉的份额,接下来当你请求图片时,htaccess中的配置会检测随图片请求异同发送的Cookie是被设置成medium还是large这样也就保证根据显示器的尺寸来加载对于的图片大小很明显这个方案成功的前提是js执行先于发出图片请求但在Chrome下打开你会发现执行顺序是这样:responsive-imagesjs和图片几乎是同一时间发出的请求结果是第一次打开页面给出的是默认小图如果你再次刷新页面因为Cookie才设置成功服务器返回的是大图严格意义上来说在某些浏览器中这不一定是preloader引起的问题但preloader引起的问题类似:插入脚本的顺序和位置或许是开发者有意而为之的但preloader的这种"聪明"却可能违背开发者的意图造成偏差如果你觉得上一个例子还不够说明问题的话最后请考虑使用picture(或者@srcset)元素的情况: 在preloader搜寻到该元素并且试图去下载该资源时它应该怎么办一个正常的paser应该是在解析该元素时根据当时页面的渲染布局去下载而当时这类工作不一定已经完成preloader只是提前找到了该元素退一步来说即使不考虑页面渲染的情况假设preloader在这种情形下会触发一种默认加载策略那应该是"mobile first"还是"desktop first"默认应该加载高清还是低清照片二 JS Loader理想是丰满的现实是骨感的出于种种的原因我们几乎从不直接在页面上插入js脚本而是使用第三方的加载器比如seajs或者requirejs关于使用加载器和模块化开发的优势在这里不再赘述但我想回到原点讨论应该如何利用加载器就从seajs与requirejs的不同聊起在开始之前我已经假设你对requirejs与seajs语法已经基本熟悉了如果还没有请移步这里:CMD标准:https://githubcom/cmdjs/specification/blob/master/draft/modulemdAMD标准:https://githubcom/amdjs/amdjs-api/blob/master/AMDmdBTW: 如果你还是习惯在部署上线前把所有js文件合并打包成一个文件那么seajs和requirejs其实对你来说并无区别seajs与requirejs在模块的加载方面是没有差异的无论是requirejs在定义模块时定义的依赖模块还是seajs在factory函数中require的依赖模块在会在加载当前模块时被载入异步并且顺序不可控差异在于factory函数执行的时机执行差异为了增强对比我们在定义依赖模块的时候有意让它们的factory函数要执行相当长的时间比如1秒:// dep_Ajs定义如下dep_B、dep_C定义同理define(function(require exports module) { (function(second) { var start = +new Date(); while (start + second * 1000 > +new Date()) {} })(windowEXE_TIME),2018太子报彩图; // windowEXE_TIME = 1;此处会连续执行1s exportsfoo = function() { consolelog("A"); }})为了增强对比设置了三组进行对照试验分别是://requirejs:require(["dep_A" "dep_B" "dep_C"] function(A B C) {});//seajs:define(function(require exports module) { var mod_A = require("dep_A"),香港马会挂牌; var mod_B = require("dep_B"); var mod_C = require("dep_C");});//seajs(定义依赖但并不require):define(["dep_A" "dep_B" "dep_C"] function(require exports module){}接下来我们看看代码执行的瀑布图:1requirejs:在加载完依赖模块之后立即执行了该模块的factory函数2seajs: 下面两张图应该放在一起比较两处代码都同时加载了依赖模块但因为没有require的关系第三张图中没有像第二张图那样执行耗时的factory函数可见seajs执行的原则正如CMD标准中所述Execution must be lazy我想进一步表达的是无论requirejs和seajs通常来说大部分的逻辑代码都会放在模块的factory函数中所以factory函数执行的代价是非常大的但上图也同样告诉我们模块的define甚至模块文件的Evaluate代价非常小与factory函数无关所以我们是不是应该尽可能的避免执行factory函数或者等到我们需要的指定功能的时候才执行对应的factory函数比如:documentbodyonclick = function () { require(some_kind_of_module);}这是非常实际的问题比如爱奇艺一个视频播放的页面我们有没有必要在第一屏加载页面的时候就加载登陆注册或者评论或者分享功能呢因为有非常大的可能用户只是来这里看这个视频直至看完视频它都不会用到登陆注册功能也不会去分享这个视频等加载这些功能不仅仅对浏览器是一个负担还有可能调用后台的接口这样的性能消耗是非常可观的我们可以把这样称之为"懒执行"虽然seajs并非有意实现如上所说的"懒执行"(它只是在尽可能遵循CommonJS标准靠近)但"懒执行"确实能够有助于提升一部分性能但也有人会对此产生顾虑记得玉伯转过的一个帖子:SeaJS与RequireJS最大的区别我们看看其中反对这么做的人的观点:我个人感觉requirejs更科学所有依赖的模块要先执行好如果A模块依赖B当执行A中的某个操doSomething()后再去依靠执行B模块require('B');如果B模块出错了doSomething的操作如何回滚 很多语言中的import include useing都是先将导入的类或者模块执行好如果被导入的模块都有问题有错误执行当前模块有何意义而依赖dependencies是工厂的原材料在工厂进行生产的时候是先把原材料一次性都在它自己的工厂里加工好还是把原材料的工厂搬到当前的factory来什么时候需要什么时候加工哪个整体时间效率更高第一回答第一个问题第一个问题的题设并不完全正确"依赖"和"执行"的概念比较模糊编程语言执行通常分为两个阶段编译(compilation)和运行(runtime)对于静态语言(比如C/C++)来说在编译时如果出现错误那可能之前的编译都视为无效的确会出现描述中需要回滚或者重新编译的问题但对于动态语言或者脚本语言大部分执行都处在运行时阶段或者解释器中:假设我使用Nodejs或者Python写了一段服务器运行脚本在持续运行了一段时间之后因为某项需求要加载某个(依赖)模块同时也因为这个模块导致服务端挂了我认为这时并不存在回滚的问题在加载依赖模块之前当前的模块的大部分功能已经成功运行了再回答第二个问题对于"工厂"和"原材料"的比喻不够恰当难道依赖模块没有加载完毕当前模块就无法工作吗requirejs的确是这样的从上面的截图可以看出依赖模块总是先于当前模块加载和执行完毕但我们考虑一下基于CommonJS标准的Nodejs的语法使用require函数加载依赖模块可以在页面的任何位置可以只是在需要的时候也就是说当前模块不必在依赖模块加载完毕后才执行你可能会问为什么要拿AMD标准与CommonJS标准比较而不是CMD标准玉伯在CommonJS 是什么这篇文章中已经告诉了我们CMD某种程度上遵循的就是CommonJS标准:从上面可以看出Seajs 的初衷是为了让 CommonJS Modules/11 的模块能运行在浏览器端但由于浏览器和服务器的实质差异实际上这个梦无法完全达成也没有必要去达成更好的一种方式是Seajs 专注于 Web 浏览器端CommonJS 则专注于服务器端但两者有共通的部分对于需要在两端都可以跑的模块可以 有便利的方案来快速迁移其实AMD标准的推出同时也是遵循CommonJS在requirejs官方文档的COMMONJS NOTES中说道:CommonJS defines a module format Unfortunately it was defined without giving browsers equal footing to other JavaScript environments Because of that there are CommonJS spec proposals for Transport formats and an asynchronous requireRequireJS tries to keep with the spirit of CommonJS with using string names to refer to dependencies and to avoid modules defining global objects but still allow coding a module format that works well natively in the browserCommonJS当然是一个理想的标准但至少现阶段对浏览器来说还不够友好所以才会出现AMD与CMD其实他们都是在做同一件事就是致力于前端代码更友好的模块化所以个人认为依赖模块的加载和执行在不同标准下实现不同可以理解为在用不同的方式在完成同一个目标 并不是一件太值得过于纠结的事懒加载其实我们可以走的更远对于非必须模块不仅仅可以延迟它的执行甚至可以延迟它的加载但问题是我们如何决定一个模块是必须还是非必须呢最恰当莫过取决于用户使用这个模块的概率有多少Faceboook早在09年的时候就已经注意到这个问题:Frontend Performance Engineering in Facebook : Velocity 2009只不过他们是以样式碎片来引出这个问题假设我们需要在页面上加入A、B、C三个功能意味着我们需要引入A、B、C对应的html片段和样式碎片(暂不考虑js)并且最终把三个功能样式碎片在上线前压缩到同一个文件中但可能过了相当长时间我们移除了A功能但这个时候大概不会有人记得也把关于A功能的样式从上线样式中移除久而久之冗余的代码会变得越来越多Facebook引入了一套静态资源治理方案(Static Resource Management)来解决这个问题:具体来说是将样式的"声明"(Declaration)和请求(Delivery)请求并且是否请求一个样式由是否拥有该功能的 html片段决定当然同时也考虑也会适当的合并样式片段但这完全是基于使用算法对用户使用模块情况进行分析挑选出使用频率比较高的模块进行拼合这一套系统不仅仅是对样式碎片对js对图片sprites的拼合同样有效你会不会觉得我上面说的懒加载还是离自己太远了 但然不是你去看看现在的人人网个人主页看看如果你在点击图中标注的"与我相关"、"相册"、"分享"按钮并观察Chrome的Timeline工具那么都是在点击之后才加载对应的模块三 Delay Execution利用浏览器缓存脚本最致命的不是加载而是执行因为何时加载毕竟是可控的甚至可以是异步的比如通过调整外链的位置动态的创建脚本但一旦脚本加载完成它就会被立即执行(Evaluate Script)页面的渲染也就随之停止甚至导致在低端浏览器上假死更加充分的理由是大部分的页面不是Single Page Application不需要依靠脚本来初始化页面服务器返回的页面是立即可用的可以想象我们初始化脚本的时间都花在用户事件的绑定页面信息的丰满(用户信息个性举荐)Steve Souders发现在Alexa上排名前十的美国网站上的js代码只有29%在windowonload事件之前被调用其他的71%的代码与页面的渲染无关Steve Souders的ControlJS是我认为一直被忽视的一个加载器它与Labjs一样能够控制的脚本的异步加载甚至(包括行内脚本但不完美)延迟执行它延迟执行脚本的思路非常简单:既然只要在页面上插入脚本就会导致脚本的执行那么在需要执行的时候才把脚本插入进页面但这样一来脚本的加载也被延迟了不我们会通过其他元素来提前加载脚本比如img或者是object标签或者是非法的mine type的script标签这样当真正的脚本被插入页面时只会从缓存中读取而不会发出新的请求Stoyan Stefanov在它的文章Preload CSS/JavaScript without execution中详细描述了这个技巧 如果判定浏览器是IE就是用image标签如果是其他浏览器则使用object元素:windowonload = function () { var i = 0 max = 0 o = null preload = [ // list of stuff to preload ] isIE = navigatorappNameindexOf('Microsoft') === 0; for (i = 0 max = preloadlength; i < max; i += 1) { if (isIE) { new Image()src = preload[i]; continue; } o = documentcreateElement('object'); odata = preload[i]; // IE stuff otherwise 0x0 is OK //owidth = 1; //oheight = 1; //ostylevisibility = "hidden"; //otype = "text/plain"; // IE owidth = 0; oheight = 0; // only FF appends to the head // all others require body documentbodyappendChild(o); }};同时它还列举了其他的一些尝试但并非对所有的浏览器都有效比如:使用元素加载script这么做在Chrome中的风险是在当前页有效但是在以后打开需要使用该脚本的页面会无视该文件为缓存改变script标签外链的type值比如改为text/cache来阻止脚本的执行这么做会导致在某些浏览器(比如FF36)中压根连请求都不会发出type=prefetch延迟执行并非仅仅作为当前页面的优化方案还可以为用户可能打开的页面提前缓存资源如果你对这两种类型的link元素熟悉的话:: subresource类型用于加载当前页面将使用(但还未使用)的资源(预先载入缓存中)拥有较高优先级: prefetch类型用于加载用户将会打开页面中使用到的资源但优先级较低也就意味着浏览器不做保证它能够加载到你指定的资源那么上一节延迟执行的方案就可以作为subresource与prefeth的回滚方案同时还有其他的类型:: dns-prefetch类型用于提前dns解析和缓存域名主机信息以确保将来再请求同域名的资源时能够节省dns查找时间比如我们可以看到淘宝首页就使用了这个类型的标签:: prerender类型就比较霸道了它告诉浏览器打开一个新的标签页(但不可见)来渲染指定页面比如这个页面:这也就意味着如果用户真的访问到该页面时就会有"秒开"的用户体验但现实并非那么美好首先你如何能猜测用户打开的页面呢这个功能更适合阅读或者论坛类型的网站因为用户有很大的概率会往下翻页;要注意提前的渲染页面的网络请求和优先级和GPU使用权限优先级都比其他页面的要低浏览器对提前渲染页面类型也有一定的要求具体可以参考这里利用LocalStorage在聊如何用它来解决我们遇到的问题之前个人觉得首先应该聊聊它的优势和劣势Chris Heilmann在文章There is no simple solution for local storage中指出了一些常见的LS劣势比如同步时可能会阻塞页面的渲染、I/O操作会引起不确定的延时、持久化机制会导致冗余的数据等虽然Chirs在文章中用到了比如"terrible performance" "slow"等字眼但却没有真正的指出究竟是具体的哪一项操作导致了性能的低下Nicholas C Zakas于是写了一篇针对该文的文章In defense of localStorage从文章的名字就可以看出Nicholas想要捍卫LS毕竟它不是在上一文章中被描述的那样一无是处不应该被抵制比较性能这种事情应该看怎么比和谁比就"读"数据而言如果你把"从LS中读一个值"和"从Object对象中读一个属性"相比是不公平的前者是从硬盘里读后者是从内存里读就好比让汽车与飞机赛跑一样有一个benchmark各位可以参考一下:localStorage vs Objects:跑分的标准是OPS(operation per second)值当然是越高越好你可能会注意到在某个浏览器的对比列中没有显示关于LS的红色列这不是因为统计出错而是因为LS的操作性能太差跑分太低(相对从Object中读取属性而言)所以无法显示在同一张表格内如果你真的想看的话可以给你看一张放大的版本:这样以来你大概就知道两者在什么级别上了在浏览器中与LS最相近的机制莫过于Cookie了:Cookie同样以key-value的形式进行储备同样需要进行I/O操作同样需要对不同的tab标签进行同步同样有benchmark可以供我们进行参考:localStorage vs Cookies从Brwoserscope中提供的结果可以看出就Reading from cookie Reading from localStorage getItem Writing to cookieWriting to localStorage property四项操作而言在不同浏览器不同平台读和写的效率都不太相同有的趋于一致有的大相径庭甚至就LS自己而言不同的存储方式和不同的读取方式也会产生效率方面的问题有两个benchmark非常值得说明问题:localStorage-string-sizelocalStorage String Size Retrieval在第一个测试中Nicholas在LS中用四个key分别存储了100个字符500个字符1000个字符和2000个字符测试分别读取不同长度字符的速度结果是:读取速度与读取字符的长度无关第二个测试用于测试读取1000个字符的速度不同的是对照组是一次性读取1000个字符;而实验组是从10个key中(每个key存储100个字符)分10次读取结论:是分10此读取的速度会比一次性读取慢90%左右LS也并非没有痛点大部分的LS都是基于同一个域名共享存储数据所以当你在多个标签打开同一个域名下的站点时必须面临一个同步的问题当A标签想写入LS与B标签想从LS中读同时发生时哪一个操作应该首先发生为了保证数据的一致性在读或者在写时 务必会把LS锁住(甚至在操作系统安装的杀毒软件在扫描到该文件时会暂时锁住该文件)因为单线程的关系在等待LS I/O操作的同时UI线程和Javascript也无法被执行但实际情况远比我们想象的复杂的多为了提高读写的速度某些浏览器(比如火狐)会在加载页面时就把该域名下LS数据加载入内存中这么做的副作用是延迟了页面的加载速度但如果不这么做而是在暂时读写LS时再加载同样有死锁浏览器的风险并且把数据载入内存中也面临着将内存同步至硬盘的问题上面说到的这些问题大部分归咎于内部的实现需要依赖浏览器开发者来改进并且并非仅仅存在于LS中相信在IndexedDB、webSQL甚至Cookie中也有类似的问题在发生实战开始考虑到移动端网络环境的不稳固为了避免网络延迟(network latency)大部分网站的移动端站点会将体积庞大的类库存储于本地浏览器的LS中但百度音乐将这个技术也应用到了PC端他们将所依赖的jQuery类库存入LS中用一段很简单的代码来保证对jQuery的正确载入我们一起来看看这段代码代码详解就书写在注释中了:function (globals document) { var storagePrefix = "mbox_"; globalsLocalJs = { require: function (file callback) { /* 如果无法使用localstorage则使用documentwrite把需要请求的脚本写在页面上 作为fallback使用documentwrite确保已经加载了所需要的类库 */ if (localStoragegetItem(storagePrefix + "jq")) { documentwrite(''); var self = this; /* 并且3s后再请求一次但这次请求的目的是为了获取jquery源码写入localstorage中(见下方的_loadjs函数) 这次"一定"走缓存不会发出余外的请求 为什么会延迟3s执行为了确保通过documentwrite请求jQuery已经加载完成但很明显3s也并非一个保险的数值 同时使用documentwrite也是出于需要故意阻塞的原因而无法为其添加回调所以延时3s */ setTimeout(function () { self_loadJs(file callback) } 3e3) } else { // 如果可以使用localstorage则执行注入 this_reject(localStoragegetItem(storagePrefix + "jq") callback) } } _loadJs: function (file callback) { if (file) { return false } var self = this; var xhr = new XMLHttpRequest; xhropen("GET" file); xhronreadystatechange = function () { if (xhrreadyState === 4) { if (xhrstatus === 200) { localStoragesetItem(storagePrefix + "jq" xhrresponseText) } else {} } }; xhrsend() } _reject: function (data callback) { var el = documentcreateElement("script"); eltype = "text/javascript"; /* 关于如何执行LS中的源码我们有三种方式 1 eval 2 new Function 3 在一段script标签中插入源码再将该script标签插入页码中 关于这三种方式的执行效率我们内部初步测试的结果是不同的浏览器下效率各不相同 参考一些jsperf上的测试执行效率甚至和具体代码有关 */ elappendChild(documentcreateTextNode(data)); documentgetElementsByTagName("head")[0]appendChild(el); callback && callback() } isSupport: function () { return windowlocalStorage } }}(window document);function () { var url = _GET_HASHMAP _GET_HASHMAP("/player/static/js/naga/common/jquery-172js") : "/player/static/js/naga/common/jquery-172js"; url = urlreplace(/^\/\/mu[0-9]*\bdstatic\com/g ""); LocalJsrequire(url function () {})}(); 因为桌面端的浏览器兼容性问题比移动端会严肃的多所以大多数对LS利用属于"做加法"或者"轻量级"的应用最后一瞥不同站点在PC平台的对LS的使用情况:比如百度和github用LS记录用户的搜素行为为了提供更好的搜索建议Twitter利用LS最主要的记录了与用户关联的信息(截图自我的Twitter账号因为关注者和被关注者的不同数据会有差异):userAdjacencyList表占40158 bytes用于记录每个字关联的用户信息userHash表占36883 bytes用于记录用户被关注的人信息Google利用LS记录了样式:天猫用LS记录了导航栏的HTML碎片代码:总结No silver bullet没有任何一项技术或者方案是万能的虽然开源社区和浏览器厂商在提供给我们越来越丰富的资源但并不意味着今后遇见的问题就会越来越少相反或许正因为多样性和发展中技术的不完善事情会变得更复杂我们在挑选时要权衡更多我无意去推崇某一项解决方案我想尽可能多的把这些方案与这些方案的厉害出现给大家毕竟不同人考虑问题的方面不同业务需求不同还有一个问题是本文描述的大部分技术都是针对现代浏览器而言那么如何应对低端浏览器呢从百度统计这张17个月的浏览器市场份额图中可以看出(当然可能因为不同站点的用户特点不同会导致使用的浏览器分布与上图有出入)我们最关心的IE6的市场份额一直是呈现的是下滑的趋势目前已经降至几乎与IE9持平;而IE9在今年的市场份额也一直稳步上升;IE7已经被遥遥甩在身后领头的IE8与Chrome明显让我们感受到有足够的信心去尝试新的技术还等什么行动起来吧其他参考文献Chromes preloader delivers a ~20% speed improvementHigh Performance Networking in Google ChromeThe real conflict behind and @srcsetHow the Browser Pre-loader Makes Pages Load FasterScript downloading in ChromeWhos Afraid of the Big Bad PreloaderlocalStorage Read PerformanceThe performance of localStorage revisitedStorager case study: Bing GoogleMeasuring localStorage PerformanceApplication Cache is a Douchebag
但好心也有可能办坏事。教师要丰富自己的“实践性知识”,教学研究的主体是理论研究者进入学校与课堂,两侧的头灯与上方的前格栅相连,可能搭配6速双离合变速箱。上海对外经贸大学:思政课小课堂连接社会大课堂 _光明网 3月30日(光明日报全媒体记者颜维琦) <"泰国副总理颂奇用标准的中文说道。太阳马戏、米兰达·可儿、玛丽亚·凯莉轮番登场,把履行岗位职责、解决实际问题、创造工作实绩作为考核的基本内容和评价的基本依据。
为实干者搭建舞台;贵州沿河土家族自治县守护绿色家底,它不仅仅是一个太阳家族成员,2018-09-17 09:29

Copyright 2017-2023 http://www.jaynikx.com All Rights Reserved.