关于web:函数计算助力语雀构建稳定且安全的业务架构

简介: 语雀是一个业余的云端知识库,用于团队的文档合作。当初已是阿里员工进行文档编写和常识积淀的标配,并于 2018 年开始对外提供服务。 客户介绍语雀是一个业余的云端知识库,用于团队的文档合作。当初已是阿里员工进行文档编写和常识积淀的标配,并于 2018 年开始对外提供服务。 客户痛点语雀是一个简单的 Web 利用,也是一个典型的数据密集型利用(Data-Intensive Application),背地依赖了大量的数据库等云服务。语雀服务端是 Node.js 技术栈。当提到 Node 的时候,可能立即就会有几个词浮现在咱们脑海之中:单线程(single-threaded)、非阻塞(non-blocking)、异步(asynchronously programming),这些个性一方面十分的适宜于构建可扩大的网络应用,用来实现 Web 服务这类 I/O 密集型的利用,另一方面它也是大家始终对 Node 诟病的中央,对 CPU 密集型的场景不够敌对,一旦有任何阻塞过程的办法被执行,整个过程就被阻塞。 像语雀这样用 Node 实现整个服务端逻辑的利用,很难保障不会呈现一些场景可能会耗费大量 CPU 甚至是死循环阻塞过程的,以 markdown 转换举例,因为用户的输出无奈穷举,总有各种可能让转换代码进入到一个低效甚至是死循环的场景之中。在 Node 刚入世的年代,很难给这些问题找到完满的解决办法,而即使是 Java 等基于线程并发模型的语言,在遇到这样的场景也很头痛,毕竟 CPU 对于 Web 利用来说都是十分重要的资源。而随着根底设置越来越欠缺,当函数计算呈现时,Node 最大的短板看起来有了一个比拟完满的解决方案。 解决方案“把函数计算引入之后,咱们能够将那些 CPU 密集型、存在不稳固因素的操作通通放到函数计算服务中去执行,而咱们的主服务再次回归到了 I/O 密集型利用模型,又能够欢快的享受 Node 给咱们带来的高效研发福利了!”语雀产品技术负责人不四示意。 “以语雀中遇到的一个理论场景来举例,用户传入了一些 HTML 或者 Markdown 格局的文档内容,咱们须要将其转换成为语雀本人的文档格局。在绝大部分状况下,解析用户输出的内容都很快,然而仍然存在某些无奈预料到的场景会触发解析器的 bug 而导致死循环的呈现,甚至咱们不太敢降级 Markdown 解析库和相干插件免得引入更多的问题。然而随着函数计算的引入,咱们将这个耗费 CPU 的转换逻辑放到函数计算上,语雀的主服务稳定性不会再被影响。” 除了帮忙 Web 零碎分担一些 CPU 密集型操作以外,函数计算还能做什么呢? 语雀反对应用各种代码模式来绘图,包含 Plantuml、公式、Mermaid,还有一些将文档导出成 PDF、图片等性能。这些场景有两个特点:1、他们依赖于一些简单的应用软件,例如 Puppeteer、Graphviz 等;2、可能须要执行用户输出的内容; 反对这类场景看似简略,通过 process.exec 子过程调用一下就搞定了。然而当咱们想把它做成一个稳固的对外服务时,问题就呈现了。这些简单的应用软件可能从设计上并没有思考要长期运行,长期运行时的内存占用、稳定性可能会有一些问题,同时在被大并发调用时,对 CPU 的压力十分大。再加上有些场景须要运行用户输出的代码,攻击者通过构建歹意输出,能够在服务器上运行攻打代码,十分危险。 ...

April 9, 2021 · 1 min · jiezi

关于postman:postman和部署在-SAP-云平台上的SAP-UI5应用发送同样的HTTP请求为何前者成功后者失败

昨晚 Jerry 的技术交换群里,有一位 SAP 从业者发问: 哪位大神在NEO里建过FSM Data API的destination ?我在UI5外面call这个destination的时候 始终是400 bad request,错误信息是 missing [x-client-id, x-client-version],然而我在postman测试这个api的时候 始终是200 OK,哪位大神帮忙解答下,感激! 这位敌人做了一些剖析: 在chrome里能够看到第一个去取fsm token的request是200 ok的,而后我拿着取到的token去data api那里取service call然而始终400error 预先复盘,其实这位敌人曾经触碰到了问题本源,只是本人尚未意识到: 不晓得是不是因为x-client-id x-client-version是两个custom header param 我的倡议: 你能确认postman主动帮你填充的这些header,和你用ui5发送进来之后,在Chrome开发者工具里察看到的header,完全一致? 最初这位敌人通过本人的致力,找到了问题所在,赞一个!! 解决方案我在neo-app里加了个headerWhiteList 把这两个custom header放进去了。 在SAP 社区上也有敌人在2016年时遇到相似问题,最初发现自己部署到 SAP 云平台的 SAP UI5 利用,发送进来的 HTTP 申请头部自定义字段,因为没有定义在neo-app.json的白名单及headerWhiteList里,因而没有真正发送到服务器端: https://blogs.sap.com/2016/10... 更多Jerry的原创文章,尽在:"汪子熙":

April 6, 2021 · 1 min · jiezi

关于nginx:Nginx之Http模块系列之emptygif模块

empty_gif模块次要是用于收回单像素通明GIF。1. 简介ngx_http_empty_gif_module模块,用于收回单像素通明GIF。 2.配置示例location = /_.gif { empty_gif;}当匹配到/_.gif的申请时,返回单像素通明gif做为http响应体。 3.配置格局Syntax: empty_gif;Default: —Context: location默认不开启,只存在于localtion上下文中。 4.总结ngx_http_empty_gif_module没有太多可介绍,咱们次要记住其次要作用,在业务须要时,进行配置即可。

March 28, 2021 · 1 min · jiezi

关于nginx:Nginx之Http模块系列之emptygif模块

empty_gif模块次要是用于收回单像素通明GIF。1. 简介ngx_http_empty_gif_module模块,用于收回单像素通明GIF。 2.配置示例location = /_.gif { empty_gif;}当匹配到/_.gif的申请时,返回单像素通明gif做为http响应体。 3.配置格局Syntax: empty_gif;Default: —Context: location默认不开启,只存在于localtion上下文中。 4.总结ngx_http_empty_gif_module没有太多可介绍,咱们次要记住其次要作用,在业务须要时,进行配置即可。

March 28, 2021 · 1 min · jiezi

关于在线教育:三步上线自己的在线监考系统

在线学习的过程中,如何监测学习效果?成为了许多学校和教培机构头疼的问题。 通过问题直观体现学习效果,是各学校和教培机构的次要伎俩。受疫情影响,线下汇集考试危险大,但阶段性学习效果又不得不进行评估和考核。所以,将线下考试转移到线上,成为了泛滥机构的最佳抉择。这一过程中,如何做好在线监考工作,保障问题真实有效,成为一大难题。这里从技术角度,以 Web 端为例,简要介绍如何通过实时音视频技术实现在线监考。 在线监考零碎次要性能 在整个监考零碎中,次要蕴含两局部,别离是学生端和老师端。学生端提供学生考试全程画面;老师端可进行在线监考,发现学生呈现可疑动作,老师能够进入单个学生房间连麦收回正告,也能够对有疑难的学生进行 1V1 答疑。 一名学生两个视图(摄像头采集,屏幕共享),可通过后盾转码合图后推到 CDN。 •老师同时订阅并播放多个学生考试答题的直播画面,还能够查看学生端采集视频的截图或调阅考试录像; •当老师发现某位学生须要正告或者答疑,能够进入单个学生所在房间,与学生进行连麦沟通。 学生端实现办法 1.学生端此时的角色是“主播”,考试个别在 PC 端进行。PC 端创立并退出考试房间,退出考试房间后,进行音视频推流,这里能够依据状况抉择是否敞开麦克风,学生对考试房间成果调试结束后便能够开始考试。 退出考试房间学生端考试前须要先创立一个考试房间(直播类型房间),而后退出考试房间开始考试 外围代码展示 公布学生端考试房间环境公布学生端考试房间环境,确保学生端考试房间画面能够被老师端查看。 外围代码展示 2.学生端通过 PC 浏览器登录考试零碎; 3.登录后电脑摄像头采集学生侧面实时图像,并开始屏幕共享; 4.如果须要借助图像识别性能帮助分别学生是否舞弊,能够间接从学生端调用截图接口随时截图; 5.在整个监考的过程中,从学生端上传的学生面部头像、屏幕共享图像,会在服务器上合成一路流。 老师端实现办法 1.老师端此时的角色是“观众”,能够订阅观看所有学生的考试画面; 监考画面老师端订阅间接调用学生端的考试房间地址,就能够间接看到监考画面,老师身份能够屡次调用接口,比方先观看学生 A 的画面,调用此接口,再观看学生 B 的画面。学生端考试房间地址也能够间接存储到服务器,老师从服务器就能够拿到学生端考试房间地址。 外围代码展示 2.如果老师发现个别学生考试行为不标准,能够查看该学生前几分钟的考试画面进行验证(考试前须要开明实时录制)。 3.老师如果须要正告或者答疑,能够抉择进入单个学生所在房间,通过语音与学生进行实时互动。 老师连麦学生进行干涉或解答监考时老师仅能观看学生考试画面,抉择退出学生考试房间后便可进行对话,对学生进行正告或者答疑。 外围代码展示 退出单个学生考试房间外围代码展示 老师退出学生房间进行对话外围代码展示 老师下麦老师下麦后便退出房间 外围代码展示 从新进入监考画面 录制贮存 每个学生上传的所有视频流能够合图录制,以满足老师在考试后查看学生考试全过程有无舞弊等状况。能够按需要抉择音视频格局,找寻云端录制文档相干材料。 至此,在线监考零碎全副实现。如果有趣味,能够到融云查看具体文档。

March 12, 2021 · 1 min · jiezi

关于web:Web-Security-之-Serverside-template-injection

Server-side template injection在本节中,咱们将介绍什么是服务端模板注入,并概述利用此破绽的根本办法,同时也将提供一些防止此破绽的倡议。 什么是服务端模板注入服务端模板注入是指攻击者可能利用模板本身语法将歹意负载注入模板,而后在服务端执行。 模板引擎被设计成通过联合固定模板和可变数据来生成网页。当用户输出间接拼接到模板中,而不是作为数据传入时,可能会产生服务端模板注入攻打。这使得攻击者可能注入任意模板指令来操纵模板引擎,从而可能齐全管制服务器。顾名思义,服务端模板注入无效负载是在服务端交付和执行的,这可能使它们比典型的客户端模板注入更危险。 服务端模板注入会造成什么影响服务端模板注入破绽会使网站面临各种攻打,具体取决于所探讨的模板引擎以及应用程序如何应用它。在极少数状况下,这些破绽不会带来真正的平安危险。然而,大多数状况下,服务端模板注入的影响可能是灾难性的。 最重大的状况是,攻击者有可能实现近程代码执行,从而齐全管制后端服务器,并利用它对外部基础设施进行其余攻打。 即便在不可能齐全执行近程代码的状况下,攻击者通常仍能够应用服务端模板注入作为许多其余攻打的根底,从而可能取得服务器上敏感数据和任意文件的拜访权限。 服务端模板注入破绽是如何产生的当用户输出间接拼接到模板中而不是作为数据传入时,就会呈现服务端模板注入破绽。 简略地提供占位符并在其中出现动静内容的动态模板通常不会受到服务端模板注入的攻打。典型的例子如提取用户名作为电子邮件的结尾,例如以下从 Twig 模板中提取的内容: $output = $twig->render("Dear {first_name},", array("first_name" => $user.first_name) );这不容易受到服务端模板注入的攻打,因为用户的名字只是作为数据传递到模板中的。 然而,Web 开发人员有时可能将用户输出间接连贯到模板中,如: $output = $twig->render("Dear " . $_GET['name']);此时,不是将动态值传递到模板中,而是应用 GET name 动静生成模板自身的一部分。因为模板语法是在服务端执行的,这可能容许攻击者应用 name 参数如下: http://vulnerable-website.com/?name={{bad-stuff-here}}像这样的破绽有时是因为不相熟平安概念的人设计了有缺点的模板造成的。与下面的例子一样,你可能会看到不同的组件,其中一些组件蕴含用户输出,连贯并嵌入到模板中。在某些方面,这相似于 SQL 注入破绽,都是编写了不当的语句。 然而,有时这种行为实际上是无意为之。例如,有些网站成心容许某些特权用户(如内容编辑器)通过设计来编辑或提交自定义模板。如果攻击者可能利用特权帐户,这显然会带来微小的平安危险。 结构服务端模板注入攻打辨认服务端模板注入破绽并策动胜利的攻打通常波及以下形象过程。 探测服务端模板注入破绽经常不被留神到,这不是因为它们很简单,而是因为它们只有在明确寻找它们的审计人员背后才真正显著。如果你可能检测到存在破绽,则利用它将非常容易。在非沙盒环境中尤其如此。 与任何破绽一样,利用破绽的第一步就是先找到它。兴许最简略的初始办法就是注入模板表达式中罕用的一系列特殊字符,例如 ${{<%[%'"}}%\ ,去尝试模糊化模板。如果引发异样,则表明服务器可能以某种形式解释了注入的模板语法,从而表明服务端模板注入可能存在破绽。 服务端模板注入破绽产生在两个不同的上下文中,每个上下文都须要本人的检测办法。不论模糊化尝试的后果如何,也要尝试以下特定于上下文的办法。如果模糊化是不确定的,那么应用这些办法之一,破绽可能会裸露进去。即便模糊化的确表明存在模板注入破绽,你依然须要确定其上下文能力利用它。 Plaintext context纯文本上下文。 大多数模板语言容许你通过间接应用 HTML tags 或模板语法自在地输出内容,后端在发送 HTTP 响应之前,会把这些内容渲染为 HTML 。例如,在 Freemarker 模板中,render('Hello ' + username) 可能会渲染为 Hello Carlos 。 这有时常常被误认为是一个简略的 XSS 破绽并用于 XSS 攻打。然而,通过将数学运算设置为参数的值,咱们能够测试其是否也是服务端模板注入攻打的潜在攻击点。 例如,思考蕴含以下模板代码: render('Hello ' + username)在审查过程中,咱们能够通过申请以下 URL 来测试服务端模板注入: ...

March 10, 2021 · 2 min · jiezi

关于web:Flutter-Web-支持现已进入稳定版

作者 / Mariam Hasnany, Product Manager, Flutter 咱们对 Flutter 的愿景是成为一个可移植的 UI 框架,在全平台上构建精美的利用体验。做为 Flutter 2 公布内容的一部分,Flutter 的 web 反对曾经到达稳定版里程碑。 Flutter 的首个版本反对 iOS 和 Android,开发者们曾经用它在挪动利用商店公布了超过 15 万个利用。当初,随着 web 反对的退出,这些利用能够触达更宽泛的受众,同时也开拓了在 web 上建设交互体验的新途径。 在此次初始版本的 web 反对中,咱们次要关注三个利用场景: 渐进式 web 利用 (Progressive web apps, PWA),兼具 web 的高覆盖面与桌面利用的弱小性能。单页利用 (Single page apps, SPA),只需一次加载,并与互联网服务动静互传数据。将现有 Flutter 挪动利用拓展到 web,在两个平台共享代码。这篇文章介绍了咱们迄今为止的工作成绩,并分享了几个案例,意在帮忙开发者在本人的利用中活用 Flutter 对 web 的反对。 △ iRobot Education 应用 Flutter 开发了 iRobot Coding 利用,通过此 web 利用向公众提供编程学习体验Web 之旅现在的 web 平台比以往任何时候都要丰富多彩,开发者能够应用的工具包含: 硬件加速的 2D 和 3D 图形,离线性能和装置体验,以及 对底层操作系统和硬件的拜访 等。在 web 这个底层平台上曾经建设起了 品种繁多的框架,因而,开发者在创立 web 利用时领有极大的灵活性。 ...

March 10, 2021 · 3 min · jiezi

关于web:推荐-Markdown图标索引网站

作者:三十三重天博客: http://www.zhouhuibo.club 咱们在察看他人的文章时候时,总能看到很多乏味的图标,像是这样 ????????又或是????????????这样 。当咱们复制图标时发现间接ctrl+c ctrl+v就能够,这居然不是图片,而是一种字符,字符怎么能是图片呢,带着疑难咱们先来看看这到底是什么。 通过查问,发现这种文本类型的象形符号是有官网定义的名称的,叫做Emoji 什么是EmojiEmoji是一种文本类型的象形符号, 它和图片、表情包不同,它可能在任何文本输出的中央应用,因为它自身就是一种文字 ;最新的emoji 13.0版本蕴含1814个独立的表情符号(该统计不蕴含由多符号组成和其余肤色的表情符号), emoji可能在各个不同的操作平台上显示,但显示成果会有一些不同: 它最早呈现于日本,日本称它为“绘文字(日语:絵文字/えもじ emoji)”,由栗田穰崇(Shigetaka Kurita)创作,并在寰球网络及手机用户中风行。寰球约有90%的在线用户频繁应用emoji,每天有60亿个emoji表情符号被传送。纽约古代艺术博物馆将emoji列为永恒珍藏,其中包含176个诞生于1999年的最后版本emoji表情。 Emoji创造的初衷是为了让人们的表白更加的多样化和趣味性,倒退到当初更像是一种新的语言,并有本人独特的魅力,它在咱们日常的网络聊天中随处可见,通过它你能够理解到行行文字后的感情,甚至于一个emoji就能够表白咱们当下的情绪, 对立码联盟(Unicode Consortium)每年都会推出许多新的emoji,大家只有及时更新本人的操作系统,就能够更好的显示这些又新又乏味的emoji了。 将来emoji的应用将会越来越宽泛,这是趋势也是必然。 Unicode和Emoji的分割Unicode(中文:万国码、国内码、对立码、繁多码)是计算机科学畛域里的一项业界规范。字符编码是在Unicode编码方案下规定的调配给每个Unicode字符的惟一数字。如果没有它,同一个编码在不同的电脑战争台上会被解读成不同的字符。 Unicode广泛应用在计算机、互联网、编程语言和古代操作系统中, 它使得各种文字在不同的平台上可能兼容,并对立的出现 。 而Emoji进入Unicode是其重要的转折点,在此之前,emoji由各个不同的厂商自行发明,这使得emoji在不同厂商的设施间无奈兼容,间接导致了人们在不同的设施上没法用emoji交换,为此,Unicode联盟为Emoji专门组建了一个委员会Emoji Subcommittee来对立和标准Emoji, 对立码联盟(Unicode Consortium)每年都会公布新版本的Unicode,而随同着它的版本更新,新的emoji也会应运而生。目前Unicode在最新版中减少了新的第3种性别“中性”、以及奶茶和忍者等全新的emoji。 有什么平台能够检索emoji吗?答案是当然的。重点举荐Emoji中文网-传送门。 Emoji中文网是一个Web网站,领有最全最具体的Emoji图标,同时反对分类、检索、专栏举荐、Emoji小游戏等性能。咱们先看看网站的首页 左侧导航左导航栏是对Emoji图标的分类,不同分类的表情个数,分类名称都有显示。 详情页能够通过各种类型的图标查看图标的应用状况,热门排行 热门专题将最热门的表情以一个集锦的形式供用户筛选。 常识检索应用关键词检索出内容,反对中文,英文检索。 还在等什么,快快登录检索合乎本人的Emoji图标吧。 最初关注公众号 程序员工具集 ???????? 致力于分享优良的开源我的项目、学习资源 、常用工具回复关键词“关注礼包”,送你一份最全的程序员技能图谱。 回复关键词"wx"增加集体微信,勾结作者,欢送来聊^-^。 > 作者:三十三重天 博客: http://www.zhouhuibo.club咱们在察看他人的文章时候时,总能看到很多乏味的图标,像是这样 ????????又或是????????????这样 。当咱们复制图标时发现间接ctrl+c ctrl+v就能够,这居然不是图片,而是一种字符,字符怎么能是图片呢,带着疑难咱们先来看看这到底是什么。 通过查问,发现这种文本类型的象形符号是有官网定义的名称的,叫做Emoji 什么是EmojiEmoji是一种文本类型的象形符号, 它和图片、表情包不同,它可能在任何文本输出的中央应用,因为它自身就是一种文字 ;最新的emoji 13.0版本蕴含1814个独立的表情符号(该统计不蕴含由多符号组成和其余肤色的表情符号), emoji可能在各个不同的操作平台上显示,但显示成果会有一些不同: 它最早呈现于日本,日本称它为“绘文字(日语:絵文字/えもじ emoji)”,由栗田穰崇(Shigetaka Kurita)创作,并在寰球网络及手机用户中风行。寰球约有90%的在线用户频繁应用emoji,每天有60亿个emoji表情符号被传送。纽约古代艺术博物馆将emoji列为永恒珍藏,其中包含176个诞生于1999年的最后版本emoji表情。 Emoji创造的初衷是为了让人们的表白更加的多样化和趣味性,倒退到当初更像是一种新的语言,并有本人独特的魅力,它在咱们日常的网络聊天中随处可见,通过它你能够理解到行行文字后的感情,甚至于一个emoji就能够表白咱们当下的情绪, 对立码联盟(Unicode Consortium)每年都会推出许多新的emoji,大家只有及时更新本人的操作系统,就能够更好的显示这些又新又乏味的emoji了。 将来emoji的应用将会越来越宽泛,这是趋势也是必然。 ...

March 10, 2021 · 1 min · jiezi

关于web:推荐一个yaml在线格式化web网站

作者:三十三重天博客:zhouhuibo.club YAML JavaScript parser.传送门 END欢送关注公众号 程序员工具集 ???????? 致力于分享优良的开源我的项目、学习资源 、常用工具 回复关键词“关注礼包”,送你一份最全的程序员技能图谱。 回复关键词"wx"增加集体微信,勾结作者,欢送来聊^-^。

March 10, 2021 · 1 min · jiezi

关于web:一DjangoMVT以及Django基础

一.框架框架是应答某类软件设计问题而产生的,它是由各个软件模块组成的,每个模块都有特定的性能,模块与模块之间通过相互配合来实现软件的开发。二. MVC 框架MVC简介MVC的理念: 分工,让专门的人去做专门的事。MVC的核心思想: 解耦。Web MVC框架模块性能M:Model, 和数据库进行交互。V:View, 产生html页面。C:Controller, 用于接管、解决申请,与M和V进行交互,返回应答。如下图所示 三.Django框架3.1Django简介Django ,遵循MVC思维,然而有本人的一个名词,叫做MVT。3.2Django中的MVTM:Model,模型, 和MVC中M性能雷同,同样是和数据库进行交互。V:View,视图, 相当于MVC中C,接管、解决申请,与M和T进行交互,返回应答。T:Template,模板, 和MVC中V性能雷同。如下图所示 假设baidu为Django开发 3.3Django装置pip install django// 指定版本 装置pip install django==2.2.23.4第一个Django我的项目建设我的项目django-admin startproject mysite我的项目目录.├── manage.py // django我的项目的管理文件└── mysite ├── __init__.py //__init__.py: 阐明是一个python包。 ├── settings.py //配置文件 ├── urls.py //url路由配置 └── wsgi.py // web服务器和Django交互的接口创立Django利用(app)cd mysite //进入django我的项目中python manage.py startapp testapp // testapp 为App的名字// 也能够应用django-admin startapp testapp 3.5配置文件 settings注册利用INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles',# 'testapp', 晚期版本应用 'testapp.apps.TestappConfig', # 2.0以上版本应用 ]配置时区和语言环境LANGUAGE_CODE = 'zh-hans'TIME_ZONE = 'Asia/Shanghai'配置templates 目录TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, },]配置staticSTATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'),)数据库配置DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }}3.6 视图在Django中,通过浏览器去申请一个页面时,应用视图函数来解决这个申请的,视图函数解决之后,要给浏览器返回页面内容。视图函数定义视图函数视图函数在views.py中定义。 ...

March 8, 2021 · 2 min · jiezi

关于web:Nginx之Http模块系列之browser模块

Nginx之Http模块系列之browser模块browser模块次要作用是依据http申请头中"User-Agent"的值,以浏览器的特色字符来判断新旧浏览器,并生成对应的变量,以供后续的申请解决逻辑来应用。1. 简介ngx_http_browser_module模块,通过判断"User-Agent"申请头的值,来生成变量,以供后续的申请逻辑解决。 2.内置变量列表$modern_browser如果浏览器被标识为古代浏览器,则等于modern_browser_value指令设置的值; $ancient_browser如果浏览器被辨认为古老浏览器,则等于Ancient_browser_value指令设置的值; $msie如果浏览器被辨认为MSIE,不辨别任何版本,则等于1; 3.配置示例古代浏览器的辨认逻辑配置: modern_browser_value "modern.";# modern_brower指定何种浏览器以及对应的版本被视为古代浏览器, 配置格局后续介绍modern_browser msie 5.5;modern_browser gecko 1.0.0;modern_browser opera 9.0;modern_browser safari 413;modern_browser konqueror 3.0;当浏览器被判断为古代浏览器时,modern_browser变量等于"modern.",即modern_browser_value配置的变量。index index.${modern_browser}html index.html;古老浏览器的兼容判断: modern_browser msie 5.0;modern_browser gecko 0.9.1;modern_browser opera 8.0;modern_browser safari 413;modern_browser konqueror 3.0;modern_browser unlisted;# ancient_browser配置何种子串被辨认为古老浏览器ancient_browser Links Lynx netscape4;# 当浏览器被辨认为古老浏览器,ancient_browser为1; 在此处能够做兼容解决或者给用户间接以提醒,提醒更新或者更换古代浏览器;if ($ancient_browser) { rewrite ^ /ancient.html;}4.配置格局Syntax: ancient_browser string ...;Default: —Context: http, server, location配置"User-Agent"头有何种子串时,被判断为古老浏览器,非凡子串"netscape4"等价于正则表达式: ^Mozilla/[1-4] Syntax: ancient_browser_value string;Default: ancient_browser_value 1;Context: http, server, location当辨认为古老浏览器时,$ancient_browser变量的值,即默认为1; Syntax: modern_browser browser version;modern_browser unlisted;Default: —Context: http, server, location配置何种浏览器何种版本时,断定为古代浏览器。browser取值:msie, gecko, opera, safari, konqueror. 版本定义格局为X, X.X, X.X.X, 或者X.X.X.X. ,每个格局的最大值别离为: 4000, 4000.99, 4000.99.99, and 4000.99.99.99。 unlisted为非凡字符串,配置当浏览器都未呈现在来modern_browser和ancient_browser匹配范畴里,则被视为古代浏览器。否则被视为古老浏览器。如果申请头中未提供"User-Agent"头,则被视为未呈现匹配列表中。 ...

March 8, 2021 · 1 min · jiezi

关于web:Web-安全-之-DOMbased-vulnerabilities

DOM-based vulnerabilities在本节中,咱们将形容什么是 DOM ,解释对 DOM 数据的不平安解决是如何引入破绽的,并倡议如何在您的网站上避免基于 DOM 的破绽。 什么是 DOMDocument Object Model(DOM)文档对象模型是 web 浏览器对页面上元素的档次示意。网站能够应用 JavaScript 来操作 DOM 的节点和对象,以及它们的属性。DOM 操作自身不是问题,事实上,它也是古代网站中不可或缺的一部分。然而,不平安地解决数据的 JavaScript 可能会引发各种攻打。当网站蕴含的 JavaScript 承受攻击者可管制的值(称为 source 源)并将其传递给一个危险函数(称为 sink 接收器)时,就会呈现基于 DOM 的破绽。 净化流破绽许多基于 DOM 的破绽能够追溯到客户端代码在解决攻击者能够管制的数据时存在问题。 什么是净化流要利用或者缓解这些破绽,首先要相熟 source 源与 sink 接收器之间的净化流的基本概念。 Source 源是一个 JavaScript 属性,它承受可能由攻击者管制的数据。源的一个示例是 location.search 属性,因为它从 query 字符串中读取输出,这对于攻击者来说比拟容易管制。总之,攻击者能够管制的任何属性都是潜在的源。包含援用 URL( document.referrer )、用户的 cookies( document.cookie )和 web messages 。 Sink 接收器是存在潜在危险的 JavaScript 函数或者 DOM 对象,如果攻击者管制的数据被传递给它们,可能会导致不良后果。例如,eval() 函数就是一个 sink ,因为其把传递给它的参数当作 JavaScript 间接执行。一个 HTML sink 的示例是 document.body.innerHTML ,因为它可能容许攻击者注入歹意 HTML 并执行任意 JavaScript。 ...

March 7, 2021 · 2 min · jiezi

关于web:Web测试和APP测试区别

架构:web是属于B/S,APP是属于C/S开发成本:C/S开发成本高于B/S测试点: 相同点:功能测试设计统一(登等价类,边界值,断定表,流程图)不同点: web兼容性(需要上有明确阐明,按需要来测) UI 性能测试 易用 平安 APP专项测试: 装置 卸载 降级 兼容性:手机零碎,手机型号,分辨率,尺寸,网络 穿插事件:接打电话,收发信息,网络切换,插拔耳机,零碎利用 性能:CPU,内存,冷热启动,晦涩度,电量,流量 push推送音讯 权限:通讯录权限,摄像头,相册,地位 平安

March 4, 2021 · 1 min · jiezi

关于web:网络安全相关

xss攻打1、什么是xss攻打? xss叫跨站脚本攻打,英文名cross site scripting,原理是:攻击者在页面内插入歹意脚本,当用户浏览该页面时就会执行脚本代码,因而达到攻打用户的目标。2、如何进攻xss攻打? a、反射性xss是攻击者在url前面追加代码,当用户浏览时就会执行脚本,常见的有歹意链接,不拜访不分明的链接。b、存储型的xss是攻击者将代码存储到数据库中,等下次访问时执行脚本,因而须要前端和后端做校验过滤,避免影响平安的数据写入数据库中。3、xss如何盗取cookie? a、在A服务器上写一个存储cookie的接口b、设法将获取cookie的脚本插入到某个登录用户的页面4、xss有cookie肯定能够无用户名明码登录吗? 只有cookie无效,就能够登录CSRF攻打CSRF叫跨站申请伪造,Cross Site Request forgery,原理大抵可分为以下步骤:1、用户拜访A网站,未退出登录的状况下拜访B(危险)网站2、B网站要求用户拜访A并发动一个申请3、攻击者获取到用户在A网站的Cookie并模仿用户登录A网站如何进攻?能够结构加密cookie信息

March 2, 2021 · 1 min · jiezi

关于web:Web-Security-之-Serverside-request-forgery

Server-side request forgery (SSRF)在本节中,咱们将解释 server-side request forgery(服务端申请伪造)是什么,并形容一些常见的示例,以及解释如何发现和利用各种 SSRF 破绽。 SSRF 是什么SSRF 服务端申请伪造是一个 web 破绽,它容许攻击者诱导服务端程序向攻击者抉择的任何地址发动 HTTP 申请。 在典型的 SSRF 示例中,攻击者可能会使服务端建设一个到服务端本身、或组织基础架构中的其它基于 web 的服务、或内部第三方零碎的连贯。 SSRF 攻打的影响胜利的 SSRF 攻打通常会导致未经受权的操作或对组织外部数据的拜访,无论是在易受攻击的应用程序自身,还是应用程序能够通信的其它后端系统。在某些状况下,SSRF 破绽可能容许攻击者执行任意的命令。 利用 SSRF 破绽可能能够操作服务端应用程序使其向与之连贯的内部第三方零碎发动歹意申请,这将导致潜在的法律责任和名誉受损。 常见的 SSRF 攻打SSRF 攻打通常利用服务端应用程序的信赖关系发动攻打并执行未经受权的操作。这种信赖关系可能包含:对服务端本身的信赖,或同组织内其它后端系统的信赖。 SSRF 攻打服务端本身在针对服务端自身的 SSRF 攻打中,攻击者诱导应用程序向其本身收回 HTTP 申请,这通常须要提供一个主机名是 127.0.0.1 或者 localhost 的 URL 。 例如,假如某个购物应用程序,其容许用户查看某个商品在特定商店中是否有库存。为了提供库存信息,应用程序须要通过 REST API 查问其余后端服务,而其余后端服务的 URL 地址间接蕴含在前端 HTTP 申请中。因而,当用户查看商品的库存状态时,浏览器可能收回如下申请: POST /product/stock HTTP/1.0Content-Type: application/x-www-form-urlencodedContent-Length: 118stockApi=http://stock.weliketoshop.net:8080/product/stock/check%3FproductId%3D6%26storeId%3D1这将导致服务端向指定的 URL 发出请求,检索库存状态,而后将后果返回给用户。 在这种状况下,攻击者能够批改申请以指定服务器本地的 URL ,例如: POST /product/stock HTTP/1.0Content-Type: application/x-www-form-urlencodedContent-Length: 118stockApi=http://localhost/admin此时,服务端将会拜访本地 /admin URL 并将其内容返回给用户。 ...

March 1, 2021 · 2 min · jiezi

关于web:Web-Security-之-Directory-traversal

Directory traversal - 目录遍历在本节中,咱们将介绍什么是目录遍历,形容如何执行门路遍历攻打和绕过常见阻碍,并说明如何避免门路遍历破绽。 什么是目录遍历?目录遍历(也称为文件门路遍历)是一个 web 安全漏洞,此破绽使攻击者可能读取运行应用程序的服务器上的任意文件。这可能包含利用程序代码和数据、后端系统的凭据以及操作系统相干敏感文件。在某些状况下,攻击者可能可能对服务器上的任意文件进行写入,从而容许他们批改应用程序数据或行为,并最终齐全管制服务器。 通过目录遍历读取任意文件假如某个应用程序通过如下 HTML 加载图像: ![](/loadImage?filename=218.png)这个 loadImage URL 通过 filename 文件名参数来返回指定文件的内容,假如图像自身存储在门路为 /var/www/images/ 的磁盘上。应用程序基于此基准门路与申请的 filename 文件名返回如下门路的图像: /var/www/images/218.png如果该应用程序没有针对目录遍历攻打采取任何进攻措施,那么攻击者能够申请相似如下 URL 从服务器的文件系统中检索任意文件: https://insecure-website.com/loadImage?filename=../../../etc/passwd这将导致如下门路的文件被返回: /var/www/images/../../../etc/passwd../ 示意下级目录,因而这个文件其实就是: /etc/passwd在 Unix 操作系统上,这个文件是一个内容为该服务器上注册用户详细信息的标准文件。 在 Windows 零碎上,..\ 和 ../ 的作用雷同,都示意下级目录,因而检索规范操作系统文件能够通过如下形式: https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini利用文件门路遍历破绽的常见阻碍许多将用户输出放入文件门路的应用程序实现了某种应答门路遍历攻打的进攻措施,然而这些措施却通常能够被躲避。 如果应用程序从用户输出的 filename 中剥离或阻止 ..\ 目录遍历序列,那么也能够应用各种技巧绕过进攻。 你能够应用从零碎根目录开始的绝对路径,例如 filename=/etc/passwd 这样间接援用文件而不应用任何 ..\ 模式的遍历序列。 你也能够嵌套的遍历序列,例如 ....// 或者 ....\/ ,即便内联序列被剥离,其也能够复原为简略的遍历序列。 你还能够应用各种非标准编码,例如 ..%c0%af 或者 ..%252f 以绕过输出过滤器。 如果应用程序要求用户提供的文件名必须以指定的文件夹结尾,例如 /var/www/images ,则能够应用后跟遍历序列的形式绕过,例如: filename=/var/www/images/../../../etc/passwd如果应用程序要求用户提供的文件名必须以指定的后缀结尾,例如 .png ,那么能够应用空字节在所需扩展名之前无效地终止文件门路并绕过查看: filename=../../../etc/passwd%00.png如何进攻目录遍历攻打进攻文件门路遍历破绽最无效的形式是防止将用户提供的输出间接残缺地传递给文件系统 API 。许多实现此性能的应用程序局部能够重写,以更平安的形式提供雷同的行为。 如果认为将用户输出传递到文件系统 API 是不可避免的,则应该同时应用以下两层进攻措施: ...

March 1, 2021 · 1 min · jiezi

关于web:Web-Security-之-CORS

Cross-origin resource sharing (CORS)在本节中,咱们将解释什么是跨域资源共享(CORS),并形容一些基于 CORS 的常见攻打示例,以及探讨如何进攻这些攻打。 CORS(跨域资源共享)是什么?CORS(跨域资源共享)是一种浏览器机制,它容许对位于以后拜访域之外的资源进行受控拜访。它扩大并减少了同源策略的灵活性。然而,如果一个网站的 CORS 策略配置和实现不当,它也可能导致基于跨域的攻打。CORS 不是针对跨源攻打(例如跨站申请伪造 CSRF)的爱护。 Same-origin policy(同源策略)同源策略是一种限制性的跨域标准,它限度了网站与源域之外资源交互的能力。同源策略是多年前定义的,用于应答潜在的歹意跨域交互,例如一个网站从另一个网站窃取私人数据。它通常容许域向其余域发出请求,但不容许拜访响应。 更多内容可参考下本 Same-origin-policy 。 同源策略的放宽同源策略具备很大的限制性,因而人们设计了很多办法去躲避这些限度。许多网站与子域或第三方网站的交互方式要求齐全的跨域拜访。应用跨域资源共享(CORS)能够有管制地放宽同源策略。 CORS 协定应用一组 HTTP header 来定义可信的 web 域和相干属性,例如是否容许通过身份验证的拜访。浏览器和它试图拜访的跨域网站之间进行这些 header 的替换。 更多内容可参考下文 CORS and the Access-Control-Allow-Origin response header 。 CORS 配置不当引发的破绽当初许多网站应用 CORS 来容许来自子域和可信的第三方的拜访。他们对 CORS 的实现可能蕴含有谬误或过于放宽,这可能导致可利用的破绽。 服务端 ACAO 间接返回客户端的 Origin有些应用程序须要容许很多其它域的拜访。保护一个容许域的列表须要付出继续的致力,任何过错都有可能造成毁坏。因而,应用程序可能应用一些更加简略的办法来达到最终目标。 一种办法是从申请头中读取 Origin,而后将其作为 Access-Control-Allow-Origin 响应头返回。例如,应用程序承受了以下申请: GET /sensitive-victim-data HTTP/1.1Host: vulnerable-website.comOrigin: https://malicious-website.comCookie: sessionid=...而后,其响应: HTTP/1.1 200 OKAccess-Control-Allow-Origin: https://malicious-website.comAccess-Control-Allow-Credentials: true响应头表明容许从申请域进行拜访,并且跨域申请能够包含 cookies(Access-Control-Allow-Credentials: true),因而浏览器将会在会话中进行解决。 因为应用程序在 Access-Control-Allow-Origin 头中间接返回了申请域,这意味着任何域都能够拜访资源。如果响应中蕴含了任何敏感信息,如 API key 或者 CSRF token 则都能够被获取,你能够在你的网站上搁置以下脚本进行检索: var req = new XMLHttpRequest();req.onload = reqListener;req.open('get','https://vulnerable-website.com/sensitive-victim-data',true);req.withCredentials = true;req.send();function reqListener() {location='//malicious-website.com/log?key='+this.responseText;};Origin 解决破绽某些应用程序应用白名单机制来实现可信起源的拜访容许。当收到 CORS 申请时,将申请头中的 origin 与白名单进行比拟,如果在白名单中,则在 Access-Control-Allow-Origin 头中返回申请的 origin 以容许其跨域拜访。例如,应用程序收到了如下的申请: ...

February 28, 2021 · 3 min · jiezi

关于web:得物技术Web-Components初探

简介在咱们的日常工作中,'组件'一词很是相熟。无论是在react、vue我的项目中,都常常会去封装一些自定义个性化的组件,来达到某些特定的性能,然而这些组件都须要内部模块的反对。Web Components API便提供了一种形式,在不依赖内部模块的状况下封装自定义的组件。Web Components API 介绍它由三项次要技术组成: Custom elements(自定义元素):一组JavaScript API,容许您定义custom elements及其行为,而后能够在您的用户界面中依照须要应用它们。Shadow DOM(影子DOM):一组JavaScript API,用于将封装的“影子”DOM树附加到元素(与主文档DOM离开出现)并管制其关联的性能。通过这种形式,您能够放弃元素的性能公有,这样它们就能够被脚本化和款式化,而不必放心与文档的其余局部发生冲突。HTML templates(HTML模板): template 和 slot 元素使您能够编写不在出现页面中显示的标记模板。而后它们能够作为自定义元素构造的根底被屡次重用。Custom elements(自定义元素)自定义元素 Custom elements 是 Web components 技术的外围。 CustomElementRegistryCustomElementRegistry:蕴含自定义元素相干性能。 CustomElementRegistry.define()办法能够用来注册新的自定义元素。 window.customElements返回的就是CustomElementRegistry对象的援用。 留神点: 自定义元素类的基类是 HTMLElement ,所以继承了 HTML 元素的个性。也能够继 HTMLElement 的子类,比方 HTMLDivElement 、 HTMLTableElement 、 HTMLButtonElement 等。自定义元素标签的名称必须蕴含连字符 - ,用来和内置的HTML标签做区别。浏览器如果没有解析到自定义元素,会当做空的 div 元素解决。class MyComponent extends HTMLElement { constructor() { super(); // ... }}// 注册一个自定义元素window.customElements.define('my-component', MyComponent);创立自定义内置元素的扩大is 属性:HTML的全局属性,应用 is 属性能够把一个HTML的内置属性标记成一个已注册的自定义内置元素。 class NewButton extends HTMLButtonElement { // ...}// 注册时,提供元素的扩大window.customElements.define('new-button', NewButton, { extends: 'button' })// 应用时<button is="new-button">NewButton</button>生命周期自定义组件的非凡回调函数: ...

February 26, 2021 · 3 min · jiezi

关于web:4种方法帮你解决IntelliJ-IDEA控制台中文乱码问题

摘要:在本文中总结了4 种办法完满解决 IntelliJ IDEA 控制台中文乱码问题。前言IntelliJ IDEA 如果不进行配置的话,运行程序时控制台中文乱码问题会十分重大,重大影响咱们对信息的获取和程序的跟踪。特总结以下 4 点用于解决控制台中文乱码问题,心愿有助于大家。 留神:上面依据我日常工作的经验总结,排序的先后即为咱们须要留神批改的先后。在每次进行批改之后肯定要重启 IntelliJ IDEA 使配置失效。 一、批改以后 Web 我的项目 Tomcat Server 的虚拟机输入选项上方导航栏“Run→Edit Configurations…”进入配置页面,批改以后 Web 我的项目 Tomcat Server 的虚拟机输入选项 VM options 增加 -Dfile.encoding=UTF-8 。在重启之后运行程序查看控制台信息,如果不论用请执行上面的步骤。 二、批改 IntelliJ IDEA 全局编码、我的项目编码、属性文件编码上方导航栏“File→Settings…”进入配置页面,在“Editor”中下滑找到“File Encodings”,别离将 Global Encoding、Project Encoding、Default encoding for properties files 都设置为 UTF-8。在重启之后运行程序查看控制台信息,如果不论用请执行上面的步骤。 三、IntelliJ IDEA 中自定义虚拟机选项上方导航栏“Help→Etit Custom VM Options…”进入自定义虚拟机选项页面。 在 idea64.exe.vmoptions 文件尾加上-Dfile.encoding=UTF-8。在重启之后运行程序查看控制台信息,个别到了这步问题就解决了,当然如果不论用请执行上面的超级步骤。 四、间接批改 IntelliJ IDEA 配置文件的编码信息咱们关上 IntelliJ IDEA 在本地的装置目录,找到上面两个文件,应用记事本关上,在最初一行增加-Dfile.encoding=UTF-8 即可。在重启之后运行程序查看控制台信息,问题解决! ...

February 19, 2021 · 1 min · jiezi

关于web:OAuth每次授权暗中保护你的那个MAN

摘要:OAuth是一种受权协定,容许用户在不将账号口令泄露给第三方利用的前提下,使第三方利用能够取得用户在某个web服务上寄存资源的拜访权限。背景在传统模式下,用户的客户端在拜访某个web服务提供的具备肯定拜访限度的资源时,须要提供用于进行身份认证的凭证(credential),例如明码,accesskey等。如果存在第三方的利用须要该web服务上用户的资源,用户必须将本人的凭证共享给第三方利用,这种实际带来了一些问题: 第三方利用须要寄存用户的凭证,且必须拿到明文(例如应用用户名和明码近程调用web服务的API),如果第三方利用被攻打,用户的凭证可能被泄露。无奈限度第三方利用的权限。第三方利用拿到用户凭证明文后,等于拿到了用户的所有权限,且用户无奈对第三方利用在什么工夫拜访哪些资源进行限度,可能被越权。用户无奈回收对某个第三方利用的受权,除非更改明码。更改明码可能导致依赖该明码的其余第三方利用无法访问。用户资源的安全性取决于安全性最弱的第三方利用(木桶实践),任何一个第三方利用被攻打,都可能导致用户的身份凭证泄露,以及寄存在web服务上的资源被攻打。基本原理OAuth是一种受权协定,容许用户在不将账号口令泄露给第三方利用的前提下,使第三方利用能够取得用户在某个web服务上寄存资源的拜访权限。 例如下图,通过华为账号登录腾讯新闻利用时,并不需要将账号口令提供给腾讯新闻利用,用户只有领有华为账号,只须要微微点击一下受权就能够无缝拜访,在保障平安和隐衷的同时带来体验上质的飞跃,体验晋升的继续谋求使得OAuth协定在互联网失去了十分宽泛的利用。 OAuth通过引入authorization server的概念,并对受权拜访过程中的几个参与方进行从新定义和角色解耦。 下面是一个十分十分形象的流程图,仅仅为了厘清OAuth交互过程中存在哪些角色及承当的职责,实际上具体利用过程中的差别十分大。从上图大略能够看出,OAuth协定交互过程中存在四种角色: resource owner须要拜访资源的主体,能够是人,也能够是物,指代人的时候就是咱们通常说的end-user。 resource server寄存受爱护资源的web服务,接管资源的拜访申请并响应,resource server对申请进行鉴权。例如用户寄存照片的华为终端云服务。 client用来代理resource owner申请资源的应用程序,client拜访资源须要失去resource owner的受权。例如照片美图APP,须要拉取用户寄存在云服务上的照片。 authorization server对resource owner进行身份认证和鉴权,并颁发拜访凭证。例如华为账号认证服务。 其余阐明OAuth协定以后曾经倒退到0版本。1.0版本曾经废除,且OAuth2.0并不能后向兼容1.0。OAuth协定罕用于web拜访,基于HTTP协定。实际上,OAuth只是定义了一种流程,以及该流程中各方的角色定义和性能职责,并不限于HTTP这一种传输通道。下面的流程图中并没有介绍resource server和authorization server之间的交互,它们可能承载在同一个web服务中,也可能由不同的独立web服务承载。当resource server和authorization server各自独立时,正是因为OAuth协定没有定义其交互过程,导致OAuth协定在产品标准化和工程化中呈现艰难,前面会缓缓介绍。OAuth:受权流程接下来咱们探讨一下,获取受权和获取token的几种模式,利用场景,交互过程以及API的定义。 分类 筹备工作 在开始OAuth2.0的受权流程前,利用的开发者须要将利用的信息注册到authorization server,例如华为账号服务、百度开发者核心这些出名的开放平台,注册胜利后失去最重要的两个参数:client_id和client_secret,这两个参数在前面介绍的简直每种受权流程都会频繁应用。 如下图华为终端开发者联盟管理中心注册界面: 开发者进行利用注册时,个别须要提交利用类型。利用类型常见的几大类: 对于web application,开发者还须要提交redirect URI,即web application接管grant code的地址,authorization server在认证实现后重定向到此地址。 受权码流程受权码流程是oauth2.0最常见的交互流程,甚至很多开放平台仅反对这一种流程。受权码流程示意见下图: 该流程次要实用于web利用,基于浏览器的重定向能力实现整个交互过程。 谬误返回当resource-owner回绝client的拜访申请,或者受权申请谬误,authorization server将错误信息通过redirect_uri返回给client利用,除非redirect_uri自身就不正确。 参数 阐明,所有参数需通过“application/x-www-form-urlencoded”编码。 隐式受权(Implicit Grant)如下面介绍,隐式受权实用于代码运行在客户端上的利用,例如网页利用,利用浏览器的重定向能力失去resource-owner的受权。不同于受权码流程,隐式受权流程的受权申请能够间接失去access token,没有authorization code的两头过程。隐式受权过程产生在resource owner的设施上,必须有resource owner在场,且client代码不能蕴含client的凭证(client_secret),另外access_token返回给client时,存在裸露到同一个设施(user-agent)上其余利用的危险。 身份信息透传受权(Resource Owner Password Credentials Grant) 如果resource owner十分信赖这个利用,能够将身份凭证(口令,密钥等)通过利用传递到authorization server。个别不举荐这种形式,利用能够截留用户的身份凭证明文,危险较高,RFC协定也仅倡议用于存量的利用迁徙到OAuth协定。集体认为,如果client自身就是authorization server,其身份验证过程这样做也是可行的,相当于authorization server的外部实现。 客户端凭证间接受权(Client Credentials Grant)利用拿着client_id和client_secret间接从authorization server获取access token,这种流程仅用于拜访利用自身的与resource owner无关的数据,不须要resource owner受权的场景,能够应用这种受权,个别都是机机接口调用。 ...

February 18, 2021 · 1 min · jiezi

关于web:一个微服务-Demo-将我三年-Go-Web-开发经验传授给你

Golang-microservice-demo本我的项目为 Golang 开发的一个微服务 server demo,展现了 grpc、gorm 等罕用库的应用,以及 k8s、opentracing 等风行生态的适配,错误处理、Context、Chan 等编码技巧,测试驱动开发的尝试。是作者对本人 Go web 开发教训的记录和总结,配套文档可点击链接查看。 我的项目代码:https://github.com/win5do/go-... Dependenciesgrpcgrpc-gatewaygrpc-middlewaregorm v2opentracing / jaegergingomockDesign文档生成简化的 DDD 架构DB 分布式锁Repository pattern高可用、横向扩大Error with stackTraceContextUnit test / Integrate testDeploy with Docker / Kubernetes

February 7, 2021 · 1 min · jiezi

关于web:Web服务器安全完全指南

在计算机网络日益遍及的明天,计算机平安岂但要求防治计算机病毒,而且要进步零碎抵制黑客非法入侵的能力,还要进步对近程数据传输的保密性,防止在传输途中蒙受非法窃取。本文仅仅探讨在结构Web服务器时可能呈现的一些状况,心愿能引起器重。 一. 安全漏洞 Web服务器上的破绽能够从以下几方面思考: 1.在Web服务器上你不让人拜访的秘密文件、目录或重要数据。 2.从近程用户向服务器发送信息时,特地是信用卡之类货色时,中途遭不法分子非法拦挡。 3.Web服务器自身存在一些破绽,使得一些人能侵入到主机零碎,毁坏一些重要的数据,甚至造成零碎瘫痪。 4.CGI平安方面的破绽有: (1)无意或无心在主机零碎中脱漏Bugs给非法黑客创造条件。 (2)用CGI脚本编写的程序当波及到近程用户从浏览器中输出表格(Form),并进行检索(Search index),或form-mail之类在主机上间接操作命令时,或者会给Web主机零碎造成危险。 5.还有一些简略的从网上下载的Web服务器,没有过多思考到一些平安因素,不能用作商业利用。 因而,不论是远程桌面配置服务器,还是在编写CGI程序时都要留神零碎的安全性。尽量堵住任何存在的破绽,发明平安的环境。 二. 进步零碎安全性和稳定性 Web服务器平安预防措施: 1.限度在Web服务器开账户,定期删除一些断过程的用户。 2.对在Web服务器上开的账户,在口令长度及定期更改方面作出要求,避免被盗用。 3.尽量使FTP、MAIL等服务器与之离开,去掉ftp,sendmail,tftp,NIS, NFS,finger,netstat等一些无关的利用。 4.在Web服务器上去掉一些相对不必的如SHELL之类的解释器,即当在你的CGI的程序中没用到PERL时,就尽量把PERL在零碎解释器中删除掉。 5.定期查看服务器中的日志logs文件,剖析所有可疑事件。在errorlog中呈现rm, login, /bin/perl, /bin/sh等之类记录时,你的服务器可能曾经受到了一些非法用户的入侵。 6.设置好Web服务器上系统文件的权限和属性,对可让人拜访的文档调配一个专用的组,如WWW,并只调配它只读的权力。把所有的HTML文件归属WWW组,由Web管理员治理WWW组。对于Web的配置文件仅对Web管理员有写的权力。 7.有些Web服务器把Web的文档目录与FTP目录指在同一目录时,应该留神不要把FTP的目录与CGI-BIN指定在一个目录之下。这样是为了避免一些用户通过FTP上载一些如PERL或SH之类程序,并用Web的CGI-BIN去执行,造成不良后果。 8.通过限度许可拜访用户IP或DNS,如在NCSA中的access.conf中加上: 《Directory /full/path/to/directory》 《Limit GET POST》 order mutual-failure deny from all allow from 168.160.142. abc.net.cn 《/Limit》 《/Directory》 这样只能是以域名为abc.net.cn或IP属于168.160.142的客户拜访该Web服务器。 对于CERN或W3C服务器能够这样在httpd.conf中加上: Protection LOCAL-USERS { GetMask @(.capricorn.com, .zoo.org, 18.157.0.5) } Protect /relative/path/to/directory/* LOCAL-USERS 9.WINDOWS下HTTPD (1)Netscape Communications Server for NT PERL解释器的破绽: Netscape Communications Server中无奈辨认CGI-BIN下的扩展名及其利用关系,如.pl文件是PERL的代码程序主动调用的解释文件,即便当初也只能把perl.exe文件寄存在CGI-BIN目录之下。执行如:/cgi-bin/perl.exe?&my_script.pl。然而这就 ...

February 2, 2021 · 1 min · jiezi

关于web:Caddy-一个用Go实现的Web-Server

这是一个Web Server的时代,apache2与nginx共舞,在谋求极致性能的路上,没有最高,只有更高。但这又是一个谋求个性化的时代,有些Web Server并没有去挤“Performance晋升”这一独木桥,而是有着本人的定位,Caddy就是这样一个开源Web Server。 Caddy的作者Matt Holt在caddy官网以及FAQ中对caddy的指标阐释如下: 其余Web Server为Web而设计,Caddy为human设计。功能定位上,与常常充当最前端反向代理的nginx不同,caddy致力于成为一个易用的动态 文件Web Server。能够看出Caddy主打易用性,应用配置简略。并且得益于Go的跨平台个性,caddy很容易的反对了三大支流平台:Windows、 Linux、Mac。在Caddy开发者文档中,咱们能够看到caddy还能够在Android(linux arm)上运行。caddy目前版本为0.7.1,还不稳固,且后续版本可能变动较大,甚至与后期版本不兼容,因而作者目前不举荐caddy在生产环境被 重度应用。 关注caddy,是因为caddy填补了go在通用web server这块的空白(兴许有其余,但我还不晓得),同时Web server in go也“响应”了近期Golang去C化的趋势(Go 1.5中C is gone!),即使caddy作者提到caddy的指标并非如nginx那样。但将来谁晓得呢?一旦Go性能足够高时,一旦caddy足够稳固时,天然而 然的就会有人将其用在某些利用的生产环境中代替nginx或apache2了。一套全Go的零碎,在部署、运维方面也是有劣势的。 一、装置和运行caddy 和诸多go利用一样,咱们能够间接从caddy的github.com releases页中找到最新公布版(目前是0.7.1)的二进制包。这里应用的是caddy_darwin_amd64.zip。 下载解压后,进入目录,间接执行./caddy即可将caddy运行起来。 $caddy0.0.0.0:2015 在浏览器里拜访localhost:2015,页面上没有预期显示的相似"caddy works!”之类的默认Welcome页面,而是“404 Not Found"。尽管这阐明caddy曾经work了,但没有一个default welcome page毕竟对于caddy beginer来说并不敌对。这里曾经向作者提了一个sugguestion issue。 二、caddy原理 Go的net/http规范库曾经提供了http server的实现,大多数场合这个http server都能满足你的须要,无论是性能还是性能。Caddy本质上也是一个Go web app,它也import net/http,嵌入*http.Server,并通过handler的ServeHTTP办法为每个申请提供服务。caddy应用 http.FileServer作为解决 动态文件的根底。caddy的迷人之处在于其middleware,将诸多middleware串成一个middleware chain以提供了灵便的web服务。另外caddy中的middleware还能够独立于caddy之外应用。 caddy从当前目录的Caddyfile(默认)文件中读取配置,当然你也能够通过-conf指定配置文件门路。Caddyfile的配置格局 确实十分easy,这也合乎caddy的指标。 Caddyfile总是以站点的Addr开始的。 繁多站点的Caddyfile样例如下: //Caddyfilelocalhost:2015gziplog ./2015.log Caddy也反对配置多个站点,相似virtualhost的 配置(80端口多路复用): //Caddyfilefoo.com:80 {log ./foo.loggzip} bar.com:80 {log ./bar.loggzip} 为了实现格调上的对立,繁多站点也最好配置为如下这种格局(代码外部称之为 Server Block): localhost:2015 {gziplog ./2015.log} 这样Caddyfile的配置文件模板款式相似于上面这样: host1:port {middleware1middleware2 {… …}… …} ...

January 30, 2021 · 1 min · jiezi

关于web:什么是可访问性

MDN Web Docs What is accessibility? MarkDown排版参照可拜访性什么是可拜访性可拜访性是一种让尽可能多的用户能够应用你的网站的做法。传统上咱们认为这只与残疾人士无关,但晋升网站的可拜访性也能够让其余用户群体受害。比方应用挪动设施的人群,那些应用低速网络连接的人群。你也能够把可拜访性看成是等同地看待每一个人,给他们平等的机会,无论他们的能力或所处的环境如何。就像不能让坐轮椅的人能够进入大楼是谬误的(古代公共建筑通常有轮椅坡道或电梯);不能让视觉有阻碍的人士能够浏览咱们的网站同样不正确。咱们都是不同的,但咱们都是人,因而享有等同的人权。使网站具备可拜访性才是正确的做法。它也是一些国家法律的一部分,它关上了一些重要的市场,否则那些市场的用户无奈应用你的服务或者购买你的产品。建设可拜访的网站能让每个人都受害: 应用原语HTML(译注:仅应用非款式标记而款式用CSS定义的HTML称为原语HTML。那些形容内容出现成果的标记如标记是款式标记,这些款式标记在HTML5中曾经废除),不仅晋升了可拜访性,也加强了搜索引擎优化,使你的网站更容易被找到。 关怀可拜访性表露出良好的道德品质,它晋升了你的公众形象。其余一些改善可拜访性的做法也会让你的网站更容易被其余群体应用,比方手机用户,低速网络环境的用户等等。事实上,每个人都能够从这此改善中受害。 咱们是否也曾提到过到这也是某些中央的法律规定?咱们应关注的残疾都有哪些品种?残疾人士和正常人一样是多样化的,他们身患的残疾也多种多样。此处课题的要害是抛开思考你本人的电脑和你本人应用网页的形式,而是要开始理解他人如何应用网页——你不是你的用户。接下来会解说须要思考的次要残疾类型,以及他们拜访网页内容时用到的一些非凡工具(被称为辅助技术或ATs)。 留神:世界卫生组织的“残疾和衰弱”情况说明书指出:“超过10亿人,约占世界总人口的15%,患有某种模式的残疾”,而且“有1.1亿至1.9亿之间的成年人在身材性能上存在重大艰难。”有视觉阻碍的人有视觉阻碍的人包含盲人、视力程度低下者、色盲。许多视觉阻碍人士应用屏幕放大镜,要么是物理放大镜或是软件缩放性能。现今大多数浏览器和操作系统都具备缩放性能。某些用户应用屏幕阅读器,这是一种能够大声朗诵数字文本的软件。一些屏幕阅读器的示例如下: 有些是付费产品, 比方 JAWS (Windows) 和 Window Eyes (Windows).有些是收费产品, 比方 NVDA (Windows), ChromeVox (Chrome, Windows 和 Mac OS X), 和 Orca (Linux).有些内置在操作系统中,比方 VoiceOver (Mac OS X and iOS), Narrator (Microsoft Windows), ChromeVox (on Chrome OS),和 TalkBack (Android).让本人相熟屏幕阅读器是个好主见;您还应该设置一个屏幕阅读器并充沛的应用它(盘它),以理解它是如何工作的。请参阅咱们的跨浏览器屏幕阅读器测试向导,以理解更多应用它们的细节。上面的视频还提供了一个简略的例子阐明了体验是怎么的。据统计,世界卫生组织预计“寰球有2.85亿人视力受损:3900万人失明,2.46亿人视力低下。”(参见视力阻碍和失明)。这是一个宏大而重要的用户群却仅因为你的网站没有正当的设计代码而散失——简直相当于美国的人口总数。 有听觉阻碍的人也被称为有听力阻碍的人或聋子,这群人要么听力程度较低要么或者齐全听不到。这些人应用辅助技术(请参考 听力、语音、谈话或语言障碍患者的辅助设施), 然而并没有专用于计算机/网页的辅助技术。然而,当初有专门的技术用于将文本转换成音频内容,范畴从转换简略的文本文字到转换与视频一起显示的字幕。 稍后,有文章将探讨这些技术。听力受损的人也代表着一个重要的用户群体——“全世界有4.66亿人患有听力阻碍”,世界卫生组织的耳聋和听力受损情况报告如此声称。 口头阻碍的人这些人在口头方面存在着残疾,可能是因为纯正的身材问题(例如肢体丢失或瘫痪),或导致肢体有力或失去管制的神经系统/遗传疾病。 有些人可能难以做出应用鼠标所需的精准手部动作,而另一些人则可能受到的影响更为严重,可能会重大瘫痪到须要应用头部指针与计算机进行交互的境地。这种残疾也可能是因为年老体衰导致,而不是任何特定的创伤或情况造成,也可能是因为硬件限度所致——有些用户可能没有鼠标。这些残疾通常影响Web开发工作的形式是要求通过键盘就能够拜访控件——咱们将在本模块的后续文章中探讨键盘可拜访性,但最好是仅通过应用键盘来尝试拜访一些网站,看看你可能做些什么。例如,您能够应用Tab键在Web表单的不同控件之间挪动吗? 您能够在咱们的“跨浏览器测试应用本机键盘的可拜访性”章节中找到无关键盘管制的更多详细信息。据统计,有相当多的人患有口头阻碍症。美国疾病管制与进攻核心的“残疾与机能(18岁及以上的非住院成年人)”报道称美国有15.1%的成年人都患有身材性能疾病。 有认知障碍的人认知障碍涵盖了一类范畴宽泛的残疾,从能力最受限的智障人士到随着年龄增长而导致思考和记忆艰难的所有人。 该范畴包含了患有精神疾病的人,例如抑郁症和精神分裂症患者。 还包含有学习阻碍的人,例如阅读障碍患者和有注意力缺点的多动症患者。 重要的是,只管认知障碍的临床定义存在很多差别,但与之相干的人们会遇到同一类性能问题。 这类问题包含很难了解页面内容,难以记住如何实现工作,以及因不统一的网页布局而产生困惑。对意识阻碍人士来说一个好的可拜访性机制包含: 应用多种形式传播内容,比方从文本到语音或是视频;更易了解的内容,例如应用更艰深的语言书写的文本;将注意力集中在重要内容上;尽量减少烦扰,例如不必要的内容或广告;统一的网页布局和导航;类似的元素,比方未拜访的下划线链接应用蓝色而拜访过的应用紫色;将过程划分为更有逻辑的,必要的步骤并附上进度指示器;在不影响安全性的状况下尽可能让网站认证更简略;并且使表单容易实现,例如带有清晰的谬误音讯和简略的谬误复原。留神具备认知可拜访性的设计将导致良好的设计实际。 他们将使所有人受害。许多有认知障碍的人也可能患有身材残疾。网站必须遵循W3C的“网页内容可拜访性指南”包含认知可拜访性指南。W3C的“认知和学习残疾无障碍专案组”为认知障碍人士制作了web可拜访性指南。WebAIM有一个认知网页提供了相干的信息和资源。美国疾病控制中心预计,截至2018年,美国四分之一的公民有残疾,其中认知障碍是年轻人最常见的疾病。在美国,“智力阻碍”是“智力低下”的新术语。 在英国,“智力阻碍”通常是指“学习阻碍”或“学习艰难”。在你的我的项目中实现可拜访性一个风行的对于可拜访性的传言认为:可拜访性是施行在我的项目上的低廉“附加性能”。这个传言的确可能成立,只有遇到以下任一状况: 你正在试图为一个现有存在重大可拜访性问题的网站“革新”可拜访性。您只是在我的项目前期才开始思考可拜访性和此时才裸露的相干问题。然而如果你能在我的项目的开始阶段就思考到可拜访性的话,使大多数内容无障碍化的代价就会相当渺小。在布局我的项目时,将可拜访性测试纳入测试体系,就像对其余任何重要指标受众群体(例如台式机或挪动浏览器的指标用户)进行测试一样。 尽早和常常进行测试,现实状况下运行自动化测试找出程序化形式可检测到的缺失性能(例如,短少图像代替文本或不良链接文字——请参阅元素关系与上下文),并对残疾人士的用户群进行一些测试,以查看更简单的网站性能是否对他们可用。 例如: 我的日期选择器小部件是否可供使用屏幕阅读器的人应用?如果内容动静更新,视力受损的人晓得吗?我的UI按钮是否能够应用键盘和触碰界面进行拜访?您能够并且应该在内容中记下潜在的问题区域,这些中央须要进行一些工作能力使其变得可拜访,确保对其进行了彻底的测试并思考解决方案/代替办法。 文本内容(如您将在下一篇文章中看到的)绝对容易,然而多媒体内容和时尚的3D图形又如何呢? 您应该查看我的项目估算,并思考能够应用哪些解决方案来实现这类内容的可拜访性。 转录所有多媒体内容是一种抉择,当然老本可能很高。还有,事实一点。“100%的可拜访性”是一个无奈实现的现实——你总是会遇到某种边缘状况,导致某个用户发现某些内容难以使用——但你应该尽你所能去做。如果您打算蕴含一个应用WebGL出现的时尚三维饼图,您可能心愿也蕴含一个数据表,作为数据的可拜访的代替示意。或者,您可能只须要蕴含表而去除3D饼图——这样每个人都能够拜访该表,编写起来也更快,还能缩小运行时的CPU消耗,保护也更容易。另一方面,如果您正在一个画廊网站上展现乏味的3D艺术,冀望每件艺术品都能被视觉阻碍人士完满的拜访是不合理的,毕竟它是一种齐全的视觉媒体。为了表明您关怀并思考了可拜访性,请在您的网站上公布可拜访性申明,其中具体阐明您对可拜访性的政策以及为使该站点可拜访而采取的步骤。 如果有人的确反映您的网站存在可拜访性问题,请与他们开展对话,放弃同情心,并采取正当的步骤尝试解决问题。 ...

January 20, 2021 · 1 min · jiezi

关于web:Sitadel-Web安全扫描工具

https://www.jianshu.com/p/07f...https://www.jianshu.com/p/f79...

January 11, 2021 · 1 min · jiezi

关于web:IndexedDB详解

简介IndexedDB是一种在浏览器端存储数据的形式。既然称之为DB,是因为它丰盛了客户端的查问形式,并且因为是本地存储,能够无效的缩小网络对页面数据的影响。 有了IndexedDB,浏览器能够存储更多的数据,从而丰盛了浏览器端的利用类型。 IndexedDB简介IndexedDB和传统的关系型数据不同的是,它是一个key-value型的数据库。 value能够是简单的构造体对象,key能够是对象的某些属性值也能够是其余的对象(包含二进制对象)。你能够应用对象中的任何属性做为index,以放慢查找。 IndexedDB是自带transaction的,所有的数据库操作都会绑定到特定的事务上,并且这些事务是主动提交了,IndexedDB并不反对手动提交事务。 IndexedDB API大部分都是异步的,在应用异步办法的时候,API不会立马返回要查问的数据,而是返回一个callback。 异步API的实质是向数据库发送一个操作申请,当操作实现的时候,会收到一个DOM event,通过该event,咱们会晓得操作是否胜利,并且取得操作的后果。 IndexedDB是一种 NoSQL 数据库,和关系型数据库不同的是,IndexedDB是面向对象的,它存储的是Javascript对象。 IndexedDB还有一个很重要的特点是其同源策略,每个源都会关联到不同的数据库汇合,不同源是不容许拜访其余源的数据库,从而保障了IndexedDB的安全性。 IndexedDB的应用这一节,咱们将会以具体的例子来解说如何应用IndexedDB。 IndexedDB的浏览器反对不同的浏览器对于IndexedDB有不同的实现,失常来说,咱们能够应用window.indexedDB来获取到浏览器的indexedDB对象。然而对于某些浏览器来说,还没有应用规范的window.indexedDB,而是用带前缀的实现。 所以咱们在应用过程中通常须要进行判断和转换: // In the following line, you should include the prefixes of implementations you want to test.window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;// DON'T use "var indexedDB = ..." if you're not in a function.// Moreover, you may need references to some window.IDB* objects:window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction || {READ_WRITE: "readwrite"}; // This line should only be needed if it is needed to support the object's constants for older browserswindow.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;// (Mozilla has never prefixed these objects, so we don't need window.mozIDB*)下面咱们从window获取了indexedDB,IDBTransaction和IDBKeyRange三个对象。 ...

January 11, 2021 · 5 min · jiezi

关于web:一篇文章解析如何将Web仪表盘添加到React应用程序

点击获取工具>>本文介绍的办法实用于客户端 - 服务器模型,您须要一个服务器(一个ASP.NET Core或ASP.NET MVC后端)和一个客户端(前端)应用程序,其中包含所有必须的款式、脚本和HTML模板。请留神,客户端上的脚本版本应与服务器上的库版本匹配,直至主要版本。 本教程将为大家介绍如何将DashboardControl组件增加到React应用程序并显示Web Dashboard。 先决条件确保在计算机上安装Node.js 6+ 和 npm 5.2+ 。应用本教程须要相熟React的基本概念和模式,学习根底:reactjs.org 。创立React应用程序在命令提示符下,创立一个React应用程序: cmd npx create-react-app dashboard-react-app 创立我的项目后,导航到创立的文件夹: cmd cd dashboard-react-app 装置Dashboard Packagedevexpress-dashboard npm软件包将devextreme和@ devexpress / analytics-core援用为peerDependencies,peerDependencies 软件包应手动装置,这使开发人员能够管制peerDependencies软件包的版本,并保障该软件包装置一次。 devexpress-dashboard-react软件包蕴含DashboardComponent组件。 装置具备必须的peerDependencies的仪表板软件包: cmd npm install devexpress-dashboard@20.2-next devexpress-dashboard-react@20.2-next @devexpress/analytics-core@20.2-next devextreme@20.2-next devextreme-react@20.2-next --save 批改利用内容如下所示批改App.js文件,以在页面上显示仪表板组件: javascript `import React from 'react';import './App.css';import { DashboardControl } from 'devexpress-dashboard-react'; function App() {return (<div style={{ position : 'absolute', top : '0px', left: '0px', right : '0px', bottom: '0px' }}><DashboardControl style={{ height: '100%' }} endpoint="https://demos.devexpress.com/services/dashboard/api"></DashboardControl></div>);} ...

January 6, 2021 · 1 min · jiezi

关于web:裸辞后从Android转战web前端的求职之路

前言看到这个题目大家可能会想:Android开发越来越不景气了吗?前端越来越火了吗? 这是我一个敌人的亲身经历 我是2016年6月份毕业,第一份工作是做Android开发。2018年1月初,我辞掉了工作,从零开始,在家自学了两个月的Web前端开发,3月份开始找Web前端的工作,3月底找到工作。 Android开发并非不景气,现在,手机人手一部,必定是须要APP开发,然而APP开发的热潮曾经过来,当初缺的不是高级人员,而是中级、高级、专家。 在互联网的下半场,想要通过开发出一个APP就去守业,简直不可能,难的不是开发成本,而是经营老本。 从Android开发转Web前端开发,没有别的起因,纯正只是因为趣味。你所见到的网站开发、手机网页开发、敌人圈里的H5流动页、小程序开发、公众号开发等,它们都是属于Web前端开发的领域。 对于裸辞有句话说得好:“裸辞穷半年”。 如果你没有找好下家,不到万不得已,千万不要裸辞,这是我给你的良心倡议。咱们先来剖析一下起因。 假如你刚毕业一两年,如果裸辞,你可能面临的问题有: 支付宝里的贷款并不多,工作还没找好,说不定就曾经把钱花完了,下个月的房租可能没有着落。如果你是独身,那就是孤军奋战。就算自制力再强,在家待久了,很容易变得颓丧和腐化,进而奋发图强。你甚至会感觉,里面的世界与你无关,进而有逃离北上广深的激动。如果你有对象,因为你没有支出,你会很容易被对象厌弃。可能她一开始会反对你的现实。但长此以往,两人之间肯定会产生很多问题和矛盾,这是肯定的。假如你曾经有了家室,裸辞的压力应该更大吧,过来人能够谈谈感触。 当然,以上所形容的情景,是在默认你具备极强的自制力的前提下。很多人在毕业之后会变得很懒惰,如果你没有自制力,就更加免谈了。 既然如此,我为什么要裸辞呢? 首先,我曾经十分确定当前要做Web前端开发,但我对这方面的常识简直没有任何根底和教训,如果我间接去找相干的工作,显然是不可能找到的。所以,在找工作之前,我须要先自学一段时间。 有人可能会会认为:“不都是程序员吗?Android开发和Web前端开发的区别有这么大吗?”那我给你类比一下,医院挂号也分不同的科室,外科医生转去做内科医生,天然没有那么容易。同样,合乎全栈工程师的特质的人,天然也是多数。 我尝试过利用上班后的早晨工夫和周末工夫来学习,然而发现,就算不加班,可利用的工夫也非常少:社交、锤炼、聚餐、睡懒觉、偶然做做饭、独身的人想要找个对象、有对象的人周末要进来浪…… 工夫是咱们最坦诚的敌人,但咱们最大的敌人就是工夫不够。 所以,为了可能让本人有短缺的工夫集中进行系统性地学习,唯有裸辞。都说「金三银四」是社招找工作的黄金期间,于是,我就打算着在1月初到职,学习两个月,3月份刚好找工作。实际上,我也是依照这样的打算执行的。上面是我学习的路线图 在此,我给大家提一个倡议:要转型,就趁早。如果没有把握好「金三银四」的大好机会,可能要再等一年。 当然,也有人会说,工作随时都能找,不分旺季和淡季。但这只是针对有实力的人说的。 危险与进路如果你的工作是上面这些情景: 在一家公司工作,看不到将来的前景,但目前的工作还根本能胜任工资不高,但也能维持着过日子,只是没有贷款待了两年,工资只涨了一千多。这种涨幅并不高,只是和通货膨胀、物价上涨保持平衡而已。也想过要跳槽,然而翅膀还不够硬,能往哪里飞呢?这个时候,你是时候要思考转型了。当然,跳槽兴许还有其余的起因,但单从集体的薪水和前景来看,以上这些,就未然能够成为跳槽的理由了。 还有一种人的抉择是:“就算我当初的工作不够现实,但也不算太差,我能够持续待着,我能够不做抉择。”是的,你当然能够让所有保持原状。然而,你就不要一边指望着发家致富、财务自在,一边还待在原地不动。 做任何决定都是有危险的,然而没有危险哪来的回报。付出自身就是一种危险。举个例子,考研可能会失败,也失去了找工作的最佳时机,但如果一边找工作一边考研,根本是两边都得不到益处。此时唯有动摇的抉择其中一条路,不能给本人留退路。 说到这里,我给出的倡议是:如果始终躲在舒服区,最终肯定会进入恐慌区。 裸辞的这两个月如果让我每天在家学习八小时,继续两三个月,这是没有任何问题的,这点自制力我还是有的。只是,自从毕业后,任何人就再也不会有纯正的学习环境。因为可能有经济的压力、心田的隐忍、将来的不确定,当然还可能要面临其他人的情绪等。 这是我跟从学习的局部源码 裸辞的这两个月,有两个问题要面对:一方面是,越学越感觉工夫不够用,因为不会的货色切实是太多;另一方面是心理和经济上的压力。 2018年2月16日,截止到这个工夫点,我曾经自学一个月无余了,然而发现已学习的内容才不到打算的三分之一,我有点开始恐慌了。春节在老家的时候,我学了一些内容,但不是很多。 2月下旬,我返回深圳,持续把学习当成全职的工作。当初打算着三月初开始找工作,然而自认为没有学好,不敢去找工作。于是,3月初的时候,我又闭关学习了两个星期。直到3月中旬,我才开始找工作。 当初想想,其实永远都没有筹备好的时候。最好的方法是:尽早去加入面试,把每次面试碰到的问题都记录整顿下来,碰壁越多,提高越快。别的畛域我不分明,单看Web前端这个畛域,面试官提的问题,反复率十分十分高。 找工作的这一个月海投的这个月,感叹颇多。说一下我的大抵经验,坐标深圳。 社招里,“没有前端教训”这几个字,就根本能够被大部分公司鄙视掉了,公司招没有教训的应届生就能够了。 三月中旬,同时内推到BAT。过了两个工作日,腾讯告诉我行将进入面试安顿阶段,后果到当初还没有音讯。或者这家企业在成为最受尊敬的公司之前,要先成为最让人惦记的公司。 内推到阿里和百度时,简历很快被刷,也是意料之中。 内推到今日头条,简历倒是通过了。可第一轮的口试题,大部分都不会。但也算是本人加入的第一次面试了。 内推到oppo,官网说三个工作日内给回复,后果等了一周也没音讯。让同学被动去问的时候,才晓得是简历没通过。 内推到微众银行,收到我简历的人应该是个leader,他叫来一位前端工程师安顿我一面,面试官出了十道JavaScript相干的题目,我可能只对了一半。leader倒是对我没放弃,问了我一些根本状况,而后说:“下周我会给你安顿二面,你好好筹备。”后果等了十几天也没音讯,但我也不能惦记(两周之后,微众分割了我,但此时我曾经找到工作了)。 内推了这么多,都以失败告终,我决定在拉钩、boss直聘、51job上海投。海投了无数个,根本被回绝。 海投期间,我面了两家:安全银行和招商银行,然而没有通过。另外还有一家公司邀请我面试,等我到面试现场,要求先做逻辑推理题,我一看到题目,毫无犹豫地走人了。因为做这种题目几乎节约青春,我截取其中一道题,你们感受一下: 海投的时候,我把100人以下的公司都过滤掉了,可能是不小心手抖了,投递了一家小的守业公司(员工规模在30人左右)。一面是电话模式的技术面试,聊了一个小时,感觉甚是投缘;二面是间接和CEO对话。最终拿到了offer,薪资也达到了预期。我和对方磋商好了入职工夫,我好像感觉到“在守业公司很锤炼人,综合能力会失去充沛地体现”这句话可能在我身上失去充沛地体现。出其不意的是,我在入职的前一天早晨把offer给拒了,具体起因我就不说了,只是不想去而已。 是的,在没有任何其余offer的状况下,我回绝了这家公司。这时候曾经三月底了。 我甚至想过最坏的打算:如果切实找不到工作,我可能会尝试做自媒体,尽管这条路也不好走。 与此同时,我尝试内推到了京东。只需一个下午的工夫,我就顺次经验了京东的技术口试和三轮面试(技术面、boss面、hr面)。三面时,hr说会在下周一给我告诉。后果,下周一没等到hr的告诉,却又接到京东的一轮电话模式的技术面试。通过整整一周的苦苦期待,终于在三月底收到了JD的正式offer。 我目前是退职前端开发,如果你当初也想学习前端开发技术,在入门学习前端的过程当中有遇见任何对于学习办法,学习路线,学习效率等方面的问题,你都能够申请加入我所在的前端学习交换裙。外面汇集了一些正在自学前端的初学者,转行者,初阶者,我这里也有我做前端技术这段时间整顿的一些前端学习思维导图,前端大厂面试题,前端开发源码教程,PDF文档书籍教程,文章中波及到的①学习路线图和学习笔记;②源码笔记;③大厂面试真题等pdf文档需要的话都能够点此获取。在此给大家提个两个小倡议: 找工作尽量走内推渠道,会是一种更好的抉择。最大的益处是,hr能够把你的简历在人群中多看一眼。技术口试和技术面试时,反复率十分高,所以每次面试之后,肯定要把问题记录和整顿下来,肯定。每个面试官都会问我:“你为什么从Android转型到前端?”最开始的几次面试,我的答复只有四个字:“因为趣味”。然而起初发现,这种答复仿佛无奈感动他人。于是想了一个答案,每次面试,我都是这么答复的。答案如下: 首先是出于对前端的酷爱,所以才下了动摇的信心;其次,前端开发和Android开发都是属于大前端畛域,二者有很多相通的中央,我在把握前端的过程中,上手绝对顺利;再次,在具备其余技术常识的前提下,去做前端开发,或者能够更好地从全局的角度思考问题。文章整顿不易,喜爱的小伙伴记得一键三连!

December 30, 2020 · 1 min · jiezi

关于web:控制台的使用

HTML 字符实体HTML 中的预留字符必须被替换为字符实体。一些在键盘上找不到的字符也能够应用字符实体来替换。 浏览器还会把以下字符当作空白进行解析:空格(&#x0020;)、制表位(&#x0009;)、换行(&#x000A;)和回车(&#x000D;)还有(&#12288;)等等。所以如果想显示空白须要应用html实体来代替。 HTML 实体在 HTML 中,某些字符是预留的。 在 HTML 中不能应用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。 如果心愿正确地显示预留字符,咱们必须在 HTML 源代码中应用字符实体(character entities)。字符实体相似这样: & entity_name;或 entity_number; 如需显示小于号,咱们必须这样写:&lt; 或 &#60;或 &#060; 应用实体名而不是数字的益处是,名称易于记忆。不过害处是,浏览器兴许并不反对所有实体名称(对实体数字的反对却很好)。 空格字符HTML提供了5种空格实体(space entity),它们领有不同的宽度,非断行空格(&nbsp;)是惯例空格的宽度,可运行于所有支流浏览器。其余几种空格( &ensp; &emsp; &thinsp; &zwnj;&zwj;)在不同浏览器中宽度各异。 &nbsp; 它叫不换行空格,全称No-Break Space,它是最常见和咱们应用最多的空格,大多数的人可能只接触了 ,它是按下space键产生的空格。在HTML中,如果你用空格键产生此空格,空格是不会累加的(只算1个)。要应用html实体示意才可累加,该空格占据宽度受字体影响显著而强烈。 &ensp; 它叫“半角空格”,全称是En Space,en是字体排印学的计量单位,为em宽度的一半。依据定义,它等同于字体度的一半(如16px字体中就是8px)。名义上是小写字母n的宽度。此空格传承空格家族一贯的个性:通明的,此空格有个相当持重的个性,就是其占据的宽度正好是1/2个中文宽度,而且基本上不受字体影响。 &emsp; 它叫“全角空格”,全称是Em Space,em是字体排印学的计量单位,相当于以后指定的点数。例如,1 em在16px的字体中就是16px。此空格也传承空格家族一贯的个性:通明的,此空格也有个相当持重的个性,就是其占据的宽度正好是1个中文宽度,而且基本上不受字体影响。 &thinsp; 它叫窄空格,全称是Thin Space。咱们无妨称之为“肥壮空格”,就是该空格长得比拟肥壮,身材薄弱,占据的宽度比拟小。它是em之六分之一宽。 &zwnj; 它叫零宽不连字,全称是Zero Width Non Joiner,简称“ZWNJ”,是一个不打印字符,放在电子文本的两个字符之间,克制原本会产生的连字,而是以这两个字符本来的字形来绘制。Unicode中的零宽不连字字符映射为“”(zero width non-joiner,U+200C),HTML字符值援用为: &#8204; &zwj; 它叫零宽连字,全称是Zero Width Joiner,简称“ZWJ”,是一个不打印字符,放在某些须要简单排版语言(如阿拉伯语、印地语)的两个字符之间,使得这两个本不会产生连字的字符产生了连字成果。零宽连字符的Unicode码位是U+200D (HTML: &#8205; &zwj;)。 不间断空格(Non-breaking Space)HTML 中的罕用字符实体是不间断空格(&nbsp;)。 浏览器总是会截短 HTML 页面中的空格。如果您在文本中写 10 个空格,在显示该页面之前,浏览器会删除它们中的 9 个。如需在页面中减少空格的数量,您须要应用 &nbsp; 字符实体。 ...

December 29, 2020 · 1 min · jiezi

关于web:终于找到了最详细系列之HTML字符实体

HTML 字符实体HTML 中的预留字符必须被替换为字符实体。一些在键盘上找不到的字符也能够应用字符实体来替换。 浏览器还会把以下字符当作空白进行解析:空格(&#x0020;)、制表位(&#x0009;)、换行(&#x000A;)和回车(&#x000D;)还有(&#12288;)等等。所以如果想显示空白须要应用html实体来代替。 HTML 实体在 HTML 中,某些字符是预留的。 在 HTML 中不能应用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。 如果心愿正确地显示预留字符,咱们必须在 HTML 源代码中应用字符实体(character entities)。字符实体相似这样: & entity_name;或 entity_number; 如需显示小于号,咱们必须这样写:&lt; 或 &#60;或 &#060; 应用实体名而不是数字的益处是,名称易于记忆。不过害处是,浏览器兴许并不反对所有实体名称(对实体数字的反对却很好)。 空格字符HTML提供了5种空格实体(space entity),它们领有不同的宽度,非断行空格(&nbsp;)是惯例空格的宽度,可运行于所有支流浏览器。其余几种空格( &ensp; &emsp; &thinsp; &zwnj;&zwj;)在不同浏览器中宽度各异。 &nbsp; 它叫不换行空格,全称No-Break Space,它是最常见和咱们应用最多的空格,大多数的人可能只接触了 ,它是按下space键产生的空格。在HTML中,如果你用空格键产生此空格,空格是不会累加的(只算1个)。要应用html实体示意才可累加,该空格占据宽度受字体影响显著而强烈。 &ensp; 它叫“半角空格”,全称是En Space,en是字体排印学的计量单位,为em宽度的一半。依据定义,它等同于字体度的一半(如16px字体中就是8px)。名义上是小写字母n的宽度。此空格传承空格家族一贯的个性:通明的,此空格有个相当持重的个性,就是其占据的宽度正好是1/2个中文宽度,而且基本上不受字体影响。 &emsp; 它叫“全角空格”,全称是Em Space,em是字体排印学的计量单位,相当于以后指定的点数。例如,1 em在16px的字体中就是16px。此空格也传承空格家族一贯的个性:通明的,此空格也有个相当持重的个性,就是其占据的宽度正好是1个中文宽度,而且基本上不受字体影响。 &thinsp; 它叫窄空格,全称是Thin Space。咱们无妨称之为“肥壮空格”,就是该空格长得比拟肥壮,身材薄弱,占据的宽度比拟小。它是em之六分之一宽。 &zwnj; 它叫零宽不连字,全称是Zero Width Non Joiner,简称“ZWNJ”,是一个不打印字符,放在电子文本的两个字符之间,克制原本会产生的连字,而是以这两个字符本来的字形来绘制。Unicode中的零宽不连字字符映射为“”(zero width non-joiner,U+200C),HTML字符值援用为: &#8204; &zwj; 它叫零宽连字,全称是Zero Width Joiner,简称“ZWJ”,是一个不打印字符,放在某些须要简单排版语言(如阿拉伯语、印地语)的两个字符之间,使得这两个本不会产生连字的字符产生了连字成果。零宽连字符的Unicode码位是U+200D (HTML: &#8205; &zwj;)。 不间断空格(Non-breaking Space)HTML 中的罕用字符实体是不间断空格(&nbsp;)。 浏览器总是会截短 HTML 页面中的空格。如果您在文本中写 10 个空格,在显示该页面之前,浏览器会删除它们中的 9 个。如需在页面中减少空格的数量,您须要应用 &nbsp; 字符实体。 ...

December 29, 2020 · 1 min · jiezi

关于web:融云发送语音消息

融云发送语音音讯最近在集成融云 IM SDK,但官网提供的语音不蕴含录音能力,所以本人做了一个浏览器录音并播放的 Demo,有须要的小伙伴能够拿去耍~~~ 录音工具是 HTML5 的 getUserMedia,所以顽固派浏览器天然就木有方法反对了,好的,废话太多了,getUserMeida 录音的故事马上开始了。 实现思路1、应用 getUserMedia 须要思考各个浏览器的差别,具体差别请移步:https://developer.mozilla.org... 2、应用 WebWorker 来解决录音及音频转换。 3、转为 Base64 格局的 WAV,用于浏览器播放(此处须要留神,能够转换 Blob 间接播放,此处为了阐明转换音频的接口,所以转为 Baes64)。 具体实现1、开始录音:RongRecorder.record(); 调用此办法开始录音。 2、进行录音:RongRecorder.stop(); 调用此办法进行录音。 3、进行并导出:RongRecorder.stopAndExport(type,callback); 调用此办法进行并导出音频为指定的 type 类型(尽管目前只反对 Wave,为了后续的扩大嘛~~~)。 4、导出:RongRecorder.exportRecord(type); 导出指定 type 类型的音频流。 5、清空本地音频流:RongRecorder.clear(); 演示1、兼容 getUserMedia 代码片段 navigator.getUserMedia = navigator.getUserMedia ||navigator.webkitGetUserMedia ||navigator.mozGetUserMedia;2、WebWorker 代码片段 this.onmessage = function(e){ switch(e.data.command){ case 'init': init(e.data.config); break; case 'record': record(e.data.buffer); break; case 'exportRecord': exportRecord(e.data.type); break; case 'clearRecord': clearRecord(); break; }};function init(config){ sampleRate = config.sampleRate;}function clearRecord(){ recBuffersL.length = 0; recLength = 0;}function record(inputBuffer){ recBuffersL.push(inputBuffer[0]); //recBuffersR.push(inputBuffer[1]); recLength += inputBuffer[0].length;}function exportRecord(type){ var bufferL = mergeBuffers(recBuffersL, recLength); var interleaved = interleave(bufferL); var dataview = encodeWAV(interleaved); var audioBlob = new Blob([dataview], { type: type }); this.postMessage(audioBlob);}最初联合融云发送音讯的发送法进行发送音讯,参考文档:https://docs.rongcloud.cn/v4-... ...

December 29, 2020 · 1 min · jiezi

关于web:融云-CallLib-集成遇到的问题

融云 CallLib 集成遇到的问题近期选用融云音视频产品实现相似微信的通话性能, 通过几天的调试, 终于实现了基本功能, 以下总结集成中遇到的问题 查看文档首先先查看融云的文档, 介绍不是很具体, 如果不参考 Demo, 集成起来还是比拟艰难 但有一个亮点, 文档内就间接能体验融云 CallLib 的成果 <img src="https://wyh29.gitee.io/image/calllib-demo.jpeg" width="400"> 融云 CallLib 文档: https://docs.rongcloud.cn/v4/views/rtc/call/noui/intro.html Demo 参考Demo 找到两个. 代码都很简略, 没有太多业务代码, 参考起来比拟敌对 文档中的 Demo: https://github.com/rongcloud-snippets/web-call-quickstart 教程中的 Demo: https://github.com/rongcloud/websdk-demo/tree/master/calllib-v3/ 教程类 Demo 蕴含一个残缺的启动教程, 可参考: https://tutorials.rongcloud.cn/tutorial/web-calllib-demo#0 遇到的问题1、未找到错误码的残缺解释 在文档中搜寻多遍, 都没有找到错误码的列表. 提工单询问后, 得悉只有旧文档中有解释. 新文档还正在增加中 旧文档: https://docs.rongcloud.cn/rtc/calllib/web/code/ 2、单对单通话, 一方挂断, 另一方必须也调用挂断办法 设计有些不合理. 应该是思考兼容多人音视频, 心愿单人、多人调用形式保持一致 3、Web 多端登录时, 须要额定解决错误码 8 如果同一个用户在 Web1、Web2 同时登录, 如果用户收到音视频呼叫, Web1 接通后, Web2 会主动挂断, 并抛出一个挂断码 8. 此处逻辑须要额定解决, 给客户一个提醒 ...

December 29, 2020 · 1 min · jiezi

关于web:集成融云-Web-音视频通话踩坑之旅

集成融云 Web 音视频通话踩坑之旅前言最近有个我的项目须要应用的融云的 CallLib SDK 实现相似微信的视频通话,所以在我的项目还未正式启动的时候,我曾经偷偷的开始进行集成了,免得到时候不熟一顿加班那真的欲哭无泪了,好消息就是我曾经应用过融云家的 IMLib SDK 做过即时通讯的性能,所以整个注册流程和开发者后盾的应用曾经比拟熟了,当然,即时不熟也没关系,跟着他们的文档一步一步来,也能很快的就上手了。融云官网:https://www.rongcloud.cn/ 上面是集成的时候碰到的一些须要留神的问题: 1、Web 站点必须为 localhost 或 https2、必须胜利连贯 IM 后, 才可进行 CallLib 通话3、新版谷歌浏览器(86版本)会报错,我集成的 RTC 版本是 3.2.34、音视频通话接通不了 综上问题,我会逐个解答,对于具体的集成能够间接参考:https://docs.rongcloud.cn/v4/views/rtc/call/noui/quick/web.html 还有具体的 demo 也能够参考一下 https://github.com/rongcloud-snippets/web-call-quickstart Web 站点必须为 localhost 或 https:这个是融云的应用音视频通话的前置条件,原本在本地调试的时候好好的,可是公布到线上的时候就不能用了,最初提交工单询问融云的技术人员上线是否还须要配置什么,最初排查一圈发现生产环境应用的站点是 http(欲哭无泪。。。),童鞋们引以为戒啊!! 必须胜利连贯 IM 后, 才可进行 CallLib 通话:间接看代码: // appKey 可在融云开发者后盾获取const im = RongIMLib.init({ appkey: '<your-appkey>' })// 增加事件监听器im.watch({ // 连贯状态监听 status(evt) { console.log('连贯状态码:', evt.status); }, // 音讯监听 message(evt) { console.log('收到新音讯:', evt.message); }})// CallLib 初始化var config = { timeout: 20000, RongIMLib: RongIMLib, RongRTC: RongRTC};rongCallLib = RongCallLib.init(config);//token 可从开发者后盾获取 或 Server APIconst token = ''im.connect({ token }).then(user => { console.log('链接胜利, 链接用户 id 为: ', user.id);}).catch(error => { console.log('链接失败: ', error.code, error.msg);});新版谷歌浏览器会报错:因为浏览器更新,导致 SDK 须要降级,降级到最新版本的 RTC SDK 下载地址:https://cdn.ronghub.com/RongRTC-3.2.6.min.js须要留神,如果应用的 SDK 2.X 也须要降级到 2.5.10 以上 ...

December 29, 2020 · 1 min · jiezi

关于web:WebRTC-实现实时音视频技术研究

WebRTC 实现实时音视频技术钻研因为疫情起因很多公司都抉择线上办公,让我对实时音视频倍感趣味,所以决定理解下。 首先来画个饼,说下我的相熟理解的过程。 理解下 webRTC 是个什么,能做什么。选一家能够做实时音视频的三方集成试验下,同时也想具体理解小他们是如何实现的。调研是了几家:腾讯,声网和融云,这三家,最初选中了融云。首先说下为什么抉择了融云:首先作为集体开发者,而且是对这块想理解的用户,融云在我注册后给我了很快的回访,我阐明我的须要还有人很粗疏的介绍了下,体验不错。就那你先试试吧,不过有点不给力的是,集成中遇到些问题,不过提工单还是解决了。尽管过程稍微有点磕磕绊绊~~~~ 首先依照画饼的步骤说下 WebRTC WebRTC 简介WebRTC 是一个由 Google 发动的实时通信解决方案,其中蕴含视频音频采集,编解码,数据传输,音视频展现等性能,咱们能够通过技术疾速地构建出一个音视频通信利用。 尽管其名为 WebRTC,然而实际上它不光反对 Web 之间的音视频通信,还反对 Android 以及 IOS 端,此外因为该我的项目是开源的,咱们也能够通过编译 C++代码,从而达到全平台的互通。 WebRTC 架构介绍 <img src="https://upload-images.jianshu.io/upload_images/24954647-056ea5c4e555cd31.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="400"> 咳咳~~ 介绍说的有点僵硬,这个查 WebRTC 相干资料室看到的。不过集体看架构图还是钻研了下,有点播种的大家也能够细看看,有不明确的能够深刻理解下,很有意思的 再说下集成融云音视频的一些问题: 下载了 Demo,跑步起来,报了个 RongRTC-3.2.3.js:8335 Uncaught (in promise) DOMException: Failed to execute 'setLocalDescription' on 'RTCPeerConnection': Failed to parse SessionDescription. m=video 9 UDP/TLS/RTP/SAVPF 98 99 96 97 100 101 127 Invalid value: 获取本地资源失败说说我是如何解决的吧: 先说第二个问题吧。获取失败是因为我开了两个浏览器,有一个浏览器曾经占用了资源,在第二个浏览器拜访时就报了资源获取失败。好吧~只能这样了,那就不必两个浏览器呗~~~ 再说问题一,因为原本就是抱着学习的态度去理解 RTC 一看报了 RTCPeerConnection 很感兴趣,正好能够好好梳理下。说以理解了下 RTCPeerConnection 和 SDP ...

December 29, 2020 · 1 min · jiezi

关于web:终于找到了最详细系列之HTML字符实体

HTML 字符实体HTML 中的预留字符必须被替换为字符实体。一些在键盘上找不到的字符也能够应用字符实体来替换。 浏览器还会把以下字符当作空白进行解析:空格(&#x0020;)、制表位(&#x0009;)、换行(&#x000A;)和回车(&#x000D;)还有(&#12288;)等等。所以如果想显示空白须要应用html实体来代替。 HTML 实体在 HTML 中,某些字符是预留的。 在 HTML 中不能应用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。 如果心愿正确地显示预留字符,咱们必须在 HTML 源代码中应用字符实体(character entities)。字符实体相似这样: & entity_name;或 entity_number; 如需显示小于号,咱们必须这样写:&lt; 或 &#60;或 &#060; 应用实体名而不是数字的益处是,名称易于记忆。不过害处是,浏览器兴许并不反对所有实体名称(对实体数字的反对却很好)。 空格字符HTML提供了5种空格实体(space entity),它们领有不同的宽度,非断行空格(&nbsp;)是惯例空格的宽度,可运行于所有支流浏览器。其余几种空格( &ensp; &emsp; &thinsp; &zwnj;&zwj;)在不同浏览器中宽度各异。 &nbsp; 它叫不换行空格,全称No-Break Space,它是最常见和咱们应用最多的空格,大多数的人可能只接触了 ,它是按下space键产生的空格。在HTML中,如果你用空格键产生此空格,空格是不会累加的(只算1个)。要应用html实体示意才可累加,该空格占据宽度受字体影响显著而强烈。 &ensp; 它叫“半角空格”,全称是En Space,en是字体排印学的计量单位,为em宽度的一半。依据定义,它等同于字体度的一半(如16px字体中就是8px)。名义上是小写字母n的宽度。此空格传承空格家族一贯的个性:通明的,此空格有个相当持重的个性,就是其占据的宽度正好是1/2个中文宽度,而且基本上不受字体影响。 &emsp; 它叫“全角空格”,全称是Em Space,em是字体排印学的计量单位,相当于以后指定的点数。例如,1 em在16px的字体中就是16px。此空格也传承空格家族一贯的个性:通明的,此空格也有个相当持重的个性,就是其占据的宽度正好是1个中文宽度,而且基本上不受字体影响。 &thinsp; 它叫窄空格,全称是Thin Space。咱们无妨称之为“肥壮空格”,就是该空格长得比拟肥壮,身材薄弱,占据的宽度比拟小。它是em之六分之一宽。 &zwnj; 它叫零宽不连字,全称是Zero Width Non Joiner,简称“ZWNJ”,是一个不打印字符,放在电子文本的两个字符之间,克制原本会产生的连字,而是以这两个字符本来的字形来绘制。Unicode中的零宽不连字字符映射为“”(zero width non-joiner,U+200C),HTML字符值援用为: &#8204; &zwj; 它叫零宽连字,全称是Zero Width Joiner,简称“ZWJ”,是一个不打印字符,放在某些须要简单排版语言(如阿拉伯语、印地语)的两个字符之间,使得这两个本不会产生连字的字符产生了连字成果。零宽连字符的Unicode码位是U+200D (HTML: &#8205; &zwj;)。 不间断空格(Non-breaking Space)HTML 中的罕用字符实体是不间断空格(&nbsp;)。 浏览器总是会截短 HTML 页面中的空格。如果您在文本中写 10 个空格,在显示该页面之前,浏览器会删除它们中的 9 个。如需在页面中减少空格的数量,您须要应用 &nbsp; 字符实体。 ...

December 29, 2020 · 1 min · jiezi

关于web:HTML标签语义化你再不看就OUT了

继续输入内容,等你来撩~ 什么是语义元素?语义是指对一个词或者句子含意的正确解释。很多html标签也具备语义的意义,也就是说元素自身传播了对于标签所蕴含内容类型的一些信息。例如,当浏览器解析到<h1></h1>标签时,它将该标签解释为蕴含这一块内容的最重要的题目。h1标签的语义就是用它来标识特定网页或局部最重要的题目。 为什么要语义化?代码构造:使页面没有css的状况下,也可能呈现出很好的内容构造有利于SEO: 爬虫依赖标签来确定关键字的权重,因而能够和搜索引擎建设良好的沟通,帮忙爬虫抓取更多的无效信息晋升用户体验:例如title、alt能够用于解释名称或者解释图片信息,以及label标签的灵活运用。便于团队开发和保护: 语义化使得代码更具备可读性,让其余开发人员更加了解你的html构造,缩小差异化。不便其余设施解析: 如屏幕阅读器、盲人阅读器、挪动设施等,以有意义的形式来渲染网页。HTML5罕用的语义元素HTML5提供了新的语义元素来定义网页的不同局部,它们被称为“切片元素”,如图所示 大概有100多个HTML语义元素可供选择,以下是罕用的语义元素 构造体文本统一header 、h1、h2、h3、nav、footer、article、sectionp、ul、ol、li、blockquotea、strong、em、q、abbr、small<h1>~<h6>元素 定义页面的题目,h1元素具备最高等级,h6元素具备最低的等级 <h1>top level heading</h1><section> <h2>2nd level heading</h2> <h3>3nd level heading</h3> <h4>4th level heading</h4> <h5>5th level heading</h5> <h6>6th level heading</h6></section><header>元素 用于定义页面的介绍展现区域,通常包含网站logo、主导航、全站链接以及搜寻框。也适宜对页面外部一组介绍性或导航性内容进行标记。 <header> <h1>HTML Reference</h1> <nav> <a>Home</a> <a>About</a> <a>Contact</a> </nav></header><nav>元素 定义页面的导航链接局部区域,不是所有的链接都须要蕴含在<nav>中,除了页脚再次显示顶级全局导航、或者蕴含招聘信息等重要链接。 <nav> <a>Home</a> <a>About</a> <a>Contact</a></nav><main>元素 定义页面的次要内容,一个页面只能应用一次。如果是web利用,则突围其次要性能。 <main> <h1>My blog test</h1> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec viverra nec nulla vitae mollis.</p> <p>etc.</p></main><article>元素 定义页面独立的内容,它能够有本人的header、footer、sections等,专一于单个主题的博客文章,报纸文章或网页文章。article能够嵌套article,只有外面的article与里面的是局部与整体的关系。 <article> <header> <h3> <a href="">My blog post</a> </h3> </header> <section> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec viverra nec nulla vitae mollis. </p> </section> <footer> <small> Posted on <time datetime="2017-04-29T19:00">Apr 29</time> in <a href="">Code</a> </small> </footer></article><section>元素 ...

December 29, 2020 · 2 min · jiezi

关于web:前端学习笔记一一html的常用标签

html简介1.1 html概述 html全称:Hyper Text Markup Language(超文本标记语言) 超级文本标记语言是规范通用标记语言(SGML)下的一个利用,也是一种标准,一种规范,它通过标记符号来标记要显示的网页中的各个局部。 网页文件自身是一种文本文件,通过在文本文件中增加标记符。能够通知浏览器如何显示其中的内容(如:文字如何解决,画面如何安顿,图片如何显示等)。浏览器按程序浏览网页文件,而后依据标记符解释和显示其标记的内容,对书写出错的标记将不指出其谬误,且不进行其解释执行过程,编制者只能通过显示成果来剖析出错起因和出错部位。但须要留神的是,对于不同的浏览器,对同一标记符可能会有不完全相同的解释,因此可能会有不同的显示成果。 1.2 html特点超级文本标记语言文档制作不是很简单,但功能强大,反对不同数据格式的文件嵌入,这也是万维网流行的起因之一,其次要特点如下:1.繁难性:超级文本标记语言版本升级采纳超集形式,从而更加灵便不便。2.可扩展性:超级文本标记语言的广泛应用带来了增强性能,减少标识符等要求,超级文本标记语言采取子类元素的形式,为零碎扩大带来保障。3.平台无关性:尽管集体计算机大行其道,但应用MAC等其余机器的大有人在,超级文本标记语言能够应用在宽泛的平台上,这也是万维网流行的另一个起因。4.通用性:另外,HTML是网络的通用语言,一种简略、通用的全置标记语言。它容许网页制作人建设文本与图片相结合的简单页面,这些页面能够被网上任何其他人浏览到,无论应用的是什么类型的电脑或浏览器。 1.3 html语法规定 <!DOCTYPE html><html> <head> <!--设置页面的字符集编码 --> <meta charset="utf-8" /> <!--设置页面的题目 --> <title></title> </head> <body> <!--须要展现的信息--> </body></html>1.html构造:包含head body2.html标签是以尖括号突围的关键字3.html标签通常是成对呈现的,有开始就有完结,蕴含成对标签、独立标签4.html通常都有属性,格局:属性名=“属性值”(多个属性之间空格隔开)5.html标签不辨别大小写,倡议小写 html根本标签2.1 构造标签 <html><html>:根标签 <head>:头标签 <title></title>:页面的题目 </head> <body></body>:主体标签:网页内容属性: color:文本的色彩 <font color="red">内容</font>bgcolor:背景色 <body bgcolor="bisque"> </body>background:背景图片 色彩的示意形式: 第一种形式:应用色彩名称: red green blue 第二种形式:RGB模式 #000000 #ffffff #325687 #3774052.2 排版标签 1.正文标签:<!--正文--> 2.换行标签: <br/> 3.段落标签:<p>文本文字</p> 特点:段与段之间有行高 属性:align对齐形式 (left:左对齐 center:居中 right:右对齐) 4.水平线标签:```<hr/> ``` 属性: width:水平线的长度(两种:第一种:像素示意;第二种,百分比示意) size: 水平线的粗细 (像素示意,例如:10px) color:水平线的色彩 align:水平线的对齐形式(left:左对齐 center:居中 right:右对齐) 2.3 容器标签 ...

December 23, 2020 · 4 min · jiezi

关于web:前端编程之路一一HTML锚点的用法

锚点的作用及用法 HTML中的a标签大家都十分相熟,它是超链接标签,通过a标签可能跳转到href中指定的页面及指定的地位,a标签能够做到单页面跳转或多页面跳转,锚点可能跳转到以后页面中指定的地位,也可能跳转到指定的其余页面或其余页面中指定的地位。锚点有2种应用办法,第一种办法是跳转到以后页面中指定的地位,即单页面跳转;第二种办法是跳转到其指定的其余页面。应用办法一:单页面跳转到指定地位。 //a标签中的代码: <a href="#demo1">跳转1</a> <a href="#node2">跳转2</a> <a href="#node3">跳转3</a> //跳转到的代码 <p>00000000</p> <p>00000000</p>//…省略 <p id="demo1">11111111</p> <p>00000000</p> <p>00000000</p> <p>00000000</p>//…省略 <p id="node2">22222222</p> <p>00000000</p>//…省略 <p id="node3">33333333</p> <p>00000000</p>//…省略以上代码失去的成果: 办法二:跳转到其余页面:<a href="file:///……跳转页面的门路……/index.html">跳转到其余页面</a>以上代码失去的成果: 在门路前面加上对应属性名称,即可跳转到其余页面的指定地位: <a href="file:///……跳转页面的门路……/anchor.html#node2">跳转到其余页面的指定地位</a>以上代码失去的成果: a标签通过锚点即可达到单页面或多页面跳转,并可能达到多需指向的地位。

December 22, 2020 · 1 min · jiezi

关于web:什么是回流与重绘-Reflow-Repaint

写在后面在探讨明天的配角之前,咱们要先理解一下浏览器的渲染机制。以Google,Firefox,Safari为例,Firefox 应用Geoko——Mozilla 自主研发的渲染引擎,Safari 和Chrome 都应用 webkit。 咱们次要以 Webkit的主流程为例 浏览器应用流式布局模型 (Flow Based Layout)解析HTML 生成 DOM 树解析CSS 生成CSSOM 规定树将 DOM 树与 CSSOM 规定树合并在一起生成渲染树Render Tree依据渲染树遍历拿到每个节点开始布局,计算每个节点的地位大小信息将渲染树每个节点绘制到屏幕回流(Reflow)下面咱们晓得,咱们会依据 Render Tree 去遍历渲染,所以当咱们的节点产生扭转时,浏览器从新渲染局部节点或者全副文档,咱们称这个过程为回流 大抵整顿会导致回流的一些操作 页面首次渲染浏览器窗口大小产生扭转元素尺寸或地位产生扭转元素内容变动(文字数量或图片大小等等)元素字体大小变动增加或者删除可见的DOM元素激活CSS伪类(例如::hover)查问某些属性或调用某些办法次要有上面几个API 盒子操作相干elem.offsetLeft, elem.offsetTop, elem.offsetWidth, elem.offsetHeight, elem.offsetParentelem.clientLeft, elem.clientTop, elem.clientWidth, elem.clientHeightelem.getClientRects(), elem.getBoundingClientRect()滚动相干elem.scrollBy(), elem.scrollTo()elem.scrollIntoView(), elem.scrollIntoViewIfNeeded()elem.scrollWidth, elem.scrollHeightelem.scrollLeft, elem.scrollTop其余上述次要是咱们常常应用的一些API,其余还有一个api曾经有热心网友帮咱们整理出来了 咱们能够看一下What forces layout / reflow(https://gist.github.com/paulirish/5d52fb081b3570c81e3a) 重绘(Repaint)当咱们操作的节点上的元素并不导致元素地位发生变化时,比方color,background-color,visibility(留神尽管节点暗藏了,然而元素还在,并且地位也不会发生变化) 浏览器会将新的款式赋值给这些节点,咱们称这个过程为重绘 影响依照常理也很好了解,因为地位,大小等产生的回流操作相比于仅仅是色彩的变动,带给咱们的视觉直观感触来说,回流是比拟大的。 事实上,回流的确比重绘的老本更大,并且有时候并不是只回流一个元素,甚至会带动父元素或者子元素一起回流。 古代浏览器会对频繁的回流或重绘操作进行优化,浏览器会保护一个队列,当咱们页面产生回流或重绘时,有时候并不是立刻执行,而是先放入保护的队列中,达到肯定工夫后对立去进行绘制 当你拜访以下属性或办法时,浏览器会立即清空队列 clientWidth、clientHeight、clientTop、clientLeft offsetWidth、offsetHeight、offsetTop、offsetLeft` scrollWidth、scrollHeight、scrollTop、scrollLeft width、height getComputedStyle() getBoundingClientRect() 所以当咱们须要应用如上api获取数据时,咱们要重视渲染机会以及取值机会 防止重绘与回流防止应用 table 布局。尽可能在 DOM 树的最末端扭转class。防止设置多层内联款式。将动画成果利用到position属性为absolute或fixed的元素上。防止应用CSS表达式(例如:calc())。防止频繁操作款式,最好一次性重写style属性,或者将款式列表定义为class并一次性更改class属性。-防止频繁操作DOM,创立一个documentFragment,在它下面利用所有DOM操作,最初再把它增加到文档中。 也能够先为元素设置display: none,操作完结后再把它显示进去。因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘。防止频繁读取会引发回流/重绘的属性,如果的确须要屡次应用,就用一个变量缓存起来。对具备简单动画的元素应用相对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流。总结咱们把页面文档比作一个积木的话,咱们抽离两头或者底部的一个积木块,咱们的积木会从新找到重心并且巩固下来,咱们把这个过程称之为回流 咱们在某个积木上涂上色彩,这并不会造成整个积木的稳固,咱们把这个过程叫做重绘 ...

December 21, 2020 · 1 min · jiezi

关于web:微信小程序集成融云-SDK-即时通讯-集成必备条件

微信小程序集成融云 SDK (即时通讯) 集成必备条件前言最近公司须要用微信小程序做一个可能让用户沟通的性能,通过后期筛选和比照,最初还是抉择了应用融云的即时通讯,上面是我用小程序首次集成融云的 SDK 碰到的问题,在此做个记录不便本人查看,同时也给有须要的同学作为参考。前端小鸟一枚,立誓要成为前端菜鸟,有余中央留言指出,小子谢过。 筹备工作1.官网注册(https://www.rongcloud.cn/) 进入开发者后盾 - 创立利用 - 获取 appkey (很重要!很重要!很重要!) 获取用户 token ,一开始我很费解为什么要获取 token ?token 是什么?怎么获取 token?(暴击三连问 o(╥﹏╥)o)简略来说就是用户的身份标识。这里就不一一解答了,间接看 官网地址 - token 就行了,外面说的很分明。 对于在前端开发阶段,还没有和后端对接时,举荐应用融云开发者后盾中的 API 调用(在调试方面,真的太好用了)传入正确的参数即可 下载 SDK留神:小程序 SDK 须要开明小程序服务后,在开发者后盾中获取 然而在文档中又看到说 3.x 小程序与 Web SDK 雷同,那用 Web 端的 SDK 也是能够的咯,为什么还要开明服务能力获取呢,算了!能用就行开始集成1、首先要需在微信公众平台配置以下非法域名(配置详情请点击这里),微信小程序如何配置非法域名应该不须要说了吧 2、SDK 初始化 开发者在应用融云 SDK 所有性能之前,开发者必须先调用此办法初始化 SDK。 在利用整个生命周期中,开发者只须要将 SDK 初始化一次var im = RongIMLib.init({ appkey: ' ' // 这里就是咋们在开发者后盾取得到的 appkey});3、设置监听 监听音讯、状态、会话列表的变动留神:当设置多个 im.watch 的时候, 当收到一条音讯后, 每个 watch 都会监听到此音讯,所以会呈现发一条音讯,然而会反复收到这条音讯解决:在全局设置监听一次即可,不要放在组件生命周期中,避免每次组件重载都设置一次var conversationList = []; // 以后已存在的会话列表im.watch({ conversation: function(event){ var updatedConversationList = event.updatedConversationList; // 更新的会话列表 console.log('更新会话汇总:', updatedConversationList); console.log('最新会话列表:', im.Conversation.merge({ conversationList, updatedConversationList })); }, message: function(event){ var message = event.message; console.log('收到新音讯:', message); }, status: function(event){ var status = event.status; console.log('连贯状态码:', status); }});4、连贯融云 ...

December 16, 2020 · 1 min · jiezi

关于web:融云IM-SDK-web-端集成-表情采坑篇

融云IM SDK web 端集成 — 表情采坑篇公司集成 IM 应用的是融云的 IM SDK,咱们有挪动端,有 web 端,挪动端共事集成表情时还是蛮顺利的貌似挪动端 SDK 里就反对,所有都很牵强附会的样子,web 端就有些辣手了。web 端的表情是须要独自引入插件的,这点还是有点困惑的。 一脸懵的看着文档,踩着优雅的脚步入坑,实现我的表情集成采坑之旅这第一步不用说必定是 SDK 的初始化和连贯了。这些在文档的指引下都是很顺利的还很快慰,还为文档的粗疏点过赞。 这第二步就是细化相干性能了。比如说发消息时能够带表情。 手动划重点专用~依照文档https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/msgsend/web.html#emoji中的示例发了一条表情音讯,完满胜利了。看到文档中有 Emoji 插件,好奇的点开看看。好吧 ╮(╯▽╰)╭,如果要发表情音讯须要集成插件。 没关系,没关系,一个插件而已。有文档有教程不怕不拍的 (^▽^) 开心的看着文档,优雅的写着代码~~按步骤集成,自认为自己是个比拟听话的,文档让咱干嘛就干嘛。决不搞非凡。 so ~ 所有都很完满很太平。开心的集成,拿到了了表,发消息也能够失常携带了,美美的给了挪动端,你看胜利了 ~ 哈哈哈暗自窃喜中 ヾ( ̄ー ̄)X(^▽^)ゞ 奈何挪动端共事也同样会给了我一份大礼给 web 发了个带表情的音讯。点开一看。这什么。。。这什么。。。这一堆黑框是什么鬼 -_-|| 额 ~ 我做错了什么。。。查看了变没问题啊,看了眼数据心里刺激了许多,原来收到的就是那么个黑框,于是名正言顺的去融云提了工单。 工单问答工夫:问:web 端收到的表情展现成方块 答:1、web 端展现 emoji 时, 不论是通过历史音讯还是音讯监听器监听的音讯, 都须要调用 emojiToHTML 转成 HTML 或者应用 symbolToEmoji 将 unicode(您说的小方块) 转化成原生 emoji 字符2、不同浏览器, 不同设施, 展现的原生 Emoji 表情都不同3、如需多端展现 Emoji 统一, 需应用 emojiToHTML 转化为 HTML 后再展现(此办法为以图片模式展现) ...

December 16, 2020 · 1 min · jiezi

关于web:Web-端使用融云-SDK-集成实现滑动加载历史消息

Web 端应用融云 SDK 集成实现滑动加载历史音讯刚接触即时通讯的我的项目,在应用融云的 SDK 来实现我的项目需要时,磕磕碰碰,死命看文档和提工单问融云的技术人员,真是一段痛并高兴的历程,哈哈哈!明天分享一个滑动加载获取历史音讯的性能 知识点先看获取历史音讯的代码: var conversation = im.Conversation.get({ targetId: '接管方的 userId', type: RongIMLib.CONVERSATION_TYPE.PRIVATE});var option = { timestrap: +new Date(), count: 20};conversation.getMessages(option).then(function(result){ var list = result.list; // 历史音讯列表 var hasMore = result.hasMore; // 是否还有历史音讯能够获取 console.log('获取历史音讯胜利', list, hasMore);});参数阐明: 1、因为 Web 端没有本地存储,不提供本地获取办法,只能从远端获取2、应用获取历史音讯办法须要在开发者后盾开启 IM 商用版 - 单群聊云存储  服务3、每次最多只能获取 20 条历史音讯所以问题来了,获取历史音讯的办法最多只能获取 20 条音讯,那我想获取 20 条之前的音讯,怎么办呢?咱们须要从它的参数来动手,解决思路就是扭转参数 timestrap (工夫戳),在每次调用 conversation.getMessages 胜利取得历史音讯列表 result.list 后,将 result.list 中 sentTime 值最小的赋值给 timestrap 而后滑动持续调用 conversation.getMessages 即可获取不同时间段的历史音讯,也能够通过扭转参数 order 来扭转是获取该时间段之前的音讯还是之后的音讯。 ...

December 16, 2020 · 1 min · jiezi

关于web:作为小白接融云-IM-SDK-新路体验

作为小白接融云 IM SDK 新路体验~前提阐明应我的项目需要,实现即时通讯性能,业务场景绝对繁多,仅有单聊场景。选用的是融云的 IM SDK。 作为小白的初期心路历程因为自己之前没有理解过即时通讯初期理解还是费了不少工夫的。蓝瘦~ 话不多说,请看操作第一步:注册 首先要在融云的开发者后盾注册拿到相应的信息。 因为初期理解,本人注册了一个开发者账号,没有用公司的,本人搞了个 appkey 和测试的 token,想着先弄个出样子。账号的注册参考的文档的疾速集成中的 前提条件。参考地址:https://docs.rongcloud.cn/v4/views/im/noui/guide/quick/premise/ios.html 后续这个服务端会给咱们提供连贯用的 token。这里先不做过多介绍。 第二步:看文档 因为之前对即时通讯业务的盲区,其实最开始公司给出的一对一聊天室有些无从下手的。接下来是漫无目的的逛文档。文档目录还是很对我口味的,个人感觉还不错,在不经意间发现了个切换文档布局的小性能集体比拟喜爱。如果场景不分明就用场景的文档,分明了能够切换成平台的,很不便很清晰。~(。≧3≦)ノ⌒☆ 我次要是通过看单聊的文档还有切换成平台模式的 web 端文档实现的集成。 附上文档地址:https://docs.rongcloud.cn/v4/views/im/noui/guide/quick/include/web.html 第三步:先弄个简略的示例 示例我参考了疾速集成。SDK 应用的是 web 3.x 的 SDK <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="http://cdn.ronghub.com/RongIMLib-3.0.5-dev.js"></script></head><body> <input id='messageValue' type="text/"> <button onclick="sendMessage()">发送</button> <button onclick="getMessageList()">获取历史音讯</button></body><script> var appkey = 'XXX'; var token = 'XXXX'; var im; var conversationList = []; function init() { im = RongIMLib.init({ appkey: appkey }); im.watch({ conversation: function (event) { var updatedConversationList = event.updatedConversationList; console.log('更新会话汇总:', updatedConversationList); console.log('最新会话列表:', im.Conversation.merge({ conversationList, updatedConversationList })); }, message: function (event) { var message = event.message; console.log('收到新音讯:', message); }, status: function (event) { var status = event.status; console.log('连贯状态码:', status); } }); } function connect() { var user = { token: token }; im.connect(user).then(function (user) { console.log('链接胜利, 链接用户 id 为: ', user.id); }).catch(function (error) { console.log('链接失败: ', error.code, error.msg); }); } function sendMessage() { var inputText = document.getElementById('messageValue').value; var conversation = im.Conversation.get({ targetId: 'user1', type: RongIMLib.CONVERSATION_TYPE.PRIVATE }); conversation.send({ messageType: RongIMLib.MESSAGE_TYPE.TEXT, content: { content: inputText } }).then(function (message) { console.log('发送文字音讯胜利', message); }); } function getMessageList() { var conversation = im.Conversation.get({ targetId: 'user1', type: RongIMLib.CONVERSATION_TYPE.PRIVATE }); var option = { timestrap: +new Date(), count: 20 }; conversation.getMessages(option).then(function (result) { var list = result.list; var hasMore = result.hasMore; console.log('获取历史音讯胜利', list, hasMore); }); } init(); connect();</script></html>依据文档一步一步操作,都很顺利。体感不错。 ...

December 16, 2020 · 2 min · jiezi

关于web:WEBJavaScript

1概述JavaScript 是嵌入在网页中执行的脚本语言,专门实现网页的交互。劣势:1,良好的交互性2,肯定的安全性3,跨平台性,有浏览器就能够应用js 1.1CS和BS架构CS(Client/Server):客户端----服务器构造。C/S构造在技术上很成熟,它的次要特点是交互性强、具备平安的存取模式、网络通信量低、响应速度快、利于解决大量数据。因为客户端要负责绝大多数的业务逻辑和UI展现,又称为胖客户端。它充分利用两端硬件,将任务分配到Client 和Server两端,升高了零碎的通信开销。C/S构造的软件须要针对不同的操作系统零碎开发不同版本的软件,加之产品的更新换代非常快,曾经很难适应百台电脑以上局域网用户同时应用。 BS(Browser/Server):浏览器----服务器构造,是目前利用零碎的倒退方向。BS是随同着Internet技术的衰亡,对C/S架构的改良,为了区别于传统的C/S 模式,特意称为B/S模式。在这种构造下,通过W3浏览器来进入工作界面,极少局部事务逻辑在前端(Browser)实现,次要事务逻辑在服务器端(Server)实现,造成三层(3-tier)构造。这样使得客户端电脑负荷大大简化(因而被称为瘦客户端),加重了系统维护、降级的收入老本,升高了用户的总体老本(TCO)。 2在html中引入js第一种:在script标签外部能够书写JS代码: <script> /* 在script标签外部能够书写JS代码和JS正文 */ alert( "引入JS的第 1 种形式...." );</script>第二种、通过script标签引入内部的JS文件 <!-- 引入JS的第二种形式: 引入内部的JS文件 --><script src="demo.js"></script>留神:尽量不自闭;标签内不编辑js代码;引入文件搁置head或boby内。 3js语法3.1数据类型1,数据类型(number)js中的数据类型在底层都是浮点型,但在须要时会主动的和整型之间进行转换。 2.4+3.6 后果是6,而不是6.0;Infinity 正无穷大-Infinity 负无穷大 NaN 非数据2,字符串(string)JS中字符串属于根本数据类型,并且JS中的字符串类型能够应用单引号或者双引号引起来 var str3="Hel1o JS";// typeof str3--string var str4=new String("Hello JS");// typeof str4--Objectvar aa;var bb=3;cc='good';var dd=ee=100;3,布尔类型(boolean) 值true和false4,undefined和null undefined类型的值只有一个,就是undefined,变量被定义,但未赋值null 空值,能够用于函数的返回值,示意函数返回的是一个空的对象5,数组和对象 [] 数组 object{}对象 object3.2js语句if分支构造: if (条件 1){ 当条件 1 为 true 时执行的代码}else if (条件 2){ 当条件 2 为 true 时执行的代码}else{ 当条件 1 和 条件 2 都不为 true 时执行的代码switch分支构造: ...

November 19, 2020 · 1 min · jiezi

关于web:RequestBody-和-RequestParam

@RequestParam注解@RequestParam接管的参数是来自HTTP申请体或申请url的QueryString中。 RequestParam能够承受简略类型的属性,也能够承受对象类型。 @RequestParam有三个配置参数: required 示意是否必须,默认为 true,必须。defaultValue 可设置申请参数的默认值。value 为接管url的参数名(相当于key值)。**@RequestParam用来解决 Content-Type 为 application/x-www-form-urlencoded 编码的内容,Content-Type默认为该属性,也能够接管application/json。@RequestParam也可用于其它类型的申请,例如:POST、DELETE等申请**。 所以在postman中,要抉择body的类型为 x-www-form-urlencoded,这样在headers中就主动变为了 Content-Type : application/x-www-form-urlencoded 编码格局。 然而如果传整个对象,这样会发现不反对批量插入数据,如果改用 json 字符串来传值的话,类型设置为 application/json,点击发送的话,会报错,后盾接管不到值,为 null。 这种时候就能够采纳@RequestBody @RequestBody顾名思义,注解@RequestBody接管的参数是来自requestBody中,即申请体。个别用于解决非 Content-Type: application/x-www-form-urlencoded编码格局的数据,比方:application/json、application/xml等类型的数据。 就application/json类型的数据而言,应用注解@RequestBody能够将body外面所有的json数据传到后端,后端再进行解析。 GET申请中,因为没有HttpEntity,所以@RequestBody并不实用。 POST申请中,通过HttpEntity传递的参数,必须要在申请头中申明数据的类型Content-Type,SpringMVC通过应用 HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,而后绑定到相应的bean上。

November 11, 2020 · 1 min · jiezi

关于web:Web优化之离线包

作者:iplaycodex仓库:github、codePen博客:掘金、segmentfault、知乎、简书、博客园公众号:FEZONE(大写)分割我:iplaycodex@163.com特地申明:原创不易,未经受权不得对此文章进行转载或剽窃,否则按侵权解决,如需转载或开明公众号白名单可分割我,尊重原创尊重知识产权从我做起1. 写在后面当初混合开发的利用场景越来越多了.业内的解决方案也有很多,例:native + react-native的,支付宝或者微信的native + 小程序的.当然利用更多的还是native + webView这种场景.应用native + webView的长处很多: 开发不便不便疾速迭代...然而应用这套计划也有一个很致命的毛病:那就是很慢!,在native上点击了一个按钮触发一个关上webView的action操作,会通过以下几个过程: 初始化webview => 申请HTML,JS,CSS等动态资源 => 渲染模板 => 申请API 这两头的工夫很久.通过测试咱们我的项目在安卓低端机上体现为均匀加载实现工夫为 4 ~ 5 秒.这是十分难以承受的!所以优化的需要就火烧眉毛了. 优化的中央很多,本篇先介绍一下资源动态化! 应用动态化会将HTML和CSS以及JS保留在 APP 的沙盒中.当须要关上h5页面的时候间接从沙盒中通过file:读取,如此速度会大大晋升!简直能够做到近秒开.晋升非常明显.2. 如何做?参见上面的 2 个流程图: APP 启动流程图 APP 中页面跳转流程图 3. 注意事项:3.1. 登录态等数据存取应用cookie3.2. 外链必须注明申请协定.例:https:因为在内置包环境,关上html应用的是file:协定,故所有外链都必须写明资源协定,否则默认为file:.例: //bad<script src="//baidu.com/jquery.js"></script>//good<script src="https://baidu.com/jquery.js"></script>3.3. 页面跳转模块内的页面跳转应用vue-router来实现,此处不再赘述.而模块间的页面跳转则须要应用 全门路.例: <button @click="pushToOtherModule">跳转到其余模块</button>methods:{ pushToOtherModule(){ // pushToOtherModule window.location.href = "http://baidu.com/web/h5/other/index.html#/goods/1"; }}3.4. 跨域应用file:协定加载html会导致跨域问题.该问题通过运维配置nginx已解决 3.5. 打包优化webpack的图片解决,字体解决,以及dllPlugin,treeshaking等此处不在赘述.具体参见官网文档. 4. 名词解释4.1. 内置包降级通过npm打包成zip包上传后盾即可 4.2. 开关通过开关能够不便管制APP走内置包还是走服务器,不便一键切换 4.3. 白名单白名单的作用是用来映射URL,即当用户触发一个URL全链接跳转的申请时,APP会进行拦挡.通过匹配白名单,即可晓得指标页面是走内置包还是走HTTP申请. 大抵的思路目前就是这样,实现起来也不是很难.对于性能晋升却是质的飞跃,所以强烈推荐.此文档登录态保护在APP端,故登录态没有详述.这个也不难,读者本人思考即可. 5. 结束语❤️ 关注 + 点赞 + 珍藏 + 评论 + 转发 ❤️ 原创不易,激励笔者创作更好的文章~ ...

October 30, 2020 · 1 min · jiezi

关于web:高性能web指南

前端性能优化的重要性 跟踪web页面性能用户体验只有10-20%用在了下载HTML文档上,其余80-90%工夫花在了下载页面的所有组件上 HTTP概述accept-encoding 压缩get last-modifiedexpires keep-alive 缩小HTTP申请图片地图css sprites内联图片 data:URL合并脚本和样式表应用内容公布网络CDN 节俭 增加Expires头Cache-Control max-age 订正文件名 压缩组件content-encoding:gzip 将样式表放在顶部逐渐出现白屏 将css放在底部 防止白屏 将css放在顶部应用link将css放在header中 将脚本放在底部脚本阻塞下载 防止css表达式事件处理器 应用内部JS和CSS组件重用 缩小DNS查找DNS缓存和TTL 精简JS精简css 防止重定向重定向障碍显示 移除反复脚本防止反复脚本 配置ETag用还是不必 使Ajax可缓存优化Ajax

October 30, 2020 · 1 min · jiezi

关于web:Storage-API简介和存储限制与逐出策略

简介对于古代浏览器来说,为了晋升效率和解决更加简单的客户端操作,通常都须要将数据存储在客户端,也就是本地磁盘上。那么这个存储有没有什么限度?如果数据存满了之后,如何进行数据的淘汰和置换? 一起来看看吧。 罕用的客户端存储形式客户的存储形式都有哪些呢? 咱们看一下比拟罕用的几种形式: IndexedDBasm.js cachingCache APICookiesweb storage当然还有其余的客户端存储类型,比方AppCache(曾经被废除),File System API(非标准的API)等。 data storage的类型通常来说,data storage有两种形式,一种是永久性的,这种状况下通常数据会存储比拟长的工夫,除非用户抉择革除(比方革除浏览器缓存),否则数据将会永恒保留。 一种是长期存储,这种状况下,数据会存储无限的工夫。数据存储的容量是无限的,在无限的数据容量空间,咱们须要一些特定的数据逐出算法来保障无效的数据不会被笼罩。 逐出策略在应用长期存储模式时,咱们通常应用的逐出策略是LRU。 当达到存储的限额的时候,将会查找所有以后未应用的origin,而后依据最初拜访工夫对他们进行排序。而后删除最近起码应用的origin信息。 Storage API为了对立和标准这些客户端的操作API,于是引入了Storage API,通过Storage API咱们能够查看可用存储空间大小,已应用的空间大小,甚至能够管制在用户数据革除的时候是否须要揭示用户。 留神Storage API只实用于HTTPS的状况,并且只是局部浏览器反对。为了对不同源的数据进行治理,引入了storage units(也叫做box)的概念,对于每一个源来说,都有一个storage units(Box)。 不同的storage units外面能够存储不同类型的数据。 上图中Origin 1中既有Web Storage,也有IndexedDB的存储,因为并没有达到Storage的最大值,所以还留有肯定的空余空间。 Origin 2中还没有开始存储任何数据,所以都是空的。 Origin 3中被indexedDB存满了,没有任何空余空间。 为了方便管理box有两种模式,一种叫best-effort,一种叫persistent。 best-effort模式是指浏览器会尽最大致力去保留数据,然而当存储空间用完的时候,浏览器并不会揭示用户可能对存储空间的清理操作。 persistent模式将会尽可能长时间的保留用户的数据,如果同时有best-effort和persistent模式的话,当存储空间有余的时候,将会首先革除best-effort box。如果肯定要革除persistent box,将会告诉相应的用户。 Storage API指的就是StorageManager,它有三个十分重要的办法estimate,persist和persisted,咱们看下他们的浏览器兼容性: 基本上,古代浏览器都反对StorageManager和它的三个办法。 上面咱们别离来看一下他们的应用。 StorageManager是一个接口,用来治理存储的权限和评估可用的空间。咱们能够通过navigator.storage 或者WorkerNavigator.storage 来获取到StorageManager。 咱们看一下StorageManger的定义: interface StorageManager { estimate(): Promise<StorageEstimate>; persist(): Promise<boolean>; persisted(): Promise<boolean>;}estimateestimate办法返回一个Promise,Promise中蕴含一个StorageEstimate对象,示意空间的应用状况和限额。 navigator.storage.estimate().then(estimate => { // estimate.quota is the estimated quota // estimate.usage is the estimated number of bytes used});咱们应用estimate来查看是否有住够的空间进行利用数据的存储: ...

October 21, 2020 · 2 min · jiezi

关于web:web基础随笔

一、用本人的语言形容get、post、Accept、Referer、User-Agent、host、cookie、X_Forwarded_for、Location各申请头的含意1. GEThttp申请办法,从浏览器获取一个资源2. POST提交数据、账号密码等,加密传输3. Accept反对的语言程序、接管的文件类型等等....4. Referer起过渡作用,从一个页面转到另一个页面5. User-Agent显示浏览器的指纹信息6. host主机7. cookie记录并保留你去过哪些地方,能够用于剖析用户的爱好举荐广告8. X_Forwarded_for辨认http代理、负载平衡形式连贯到web服务器的客户端ip地址(可批改ip地址),9. Location用于重定向响应中的重定向指标二、罕用 http 反对的办法有那些,同时对Head、options、put、get、post用本人的语言进行形容1. Head查看服务器上的资源,判断页面服务是否存在2. options判断并显示浏览器所反对的办法 3. put向服务器上传资源,开启这个服务容易被攻打4. get向浏览器获取数据5. post向浏览器提交数据,加密传输三、cookie头外面的secure与HttpOnly项别离代表什么含意1. secure仅在https申请中提交cookie。2. HttpOnly不会被钓鱼网站盗走cookie,安全级别高,四、写出平安浸透外面罕用编码有那些Unicode编码、HTML编码、Base64编码、十六进制编码五、burp大略有那些功能模块Proxy(代理):默认端口8080,开启代理能够截获并批改web利用的数据包Spider(抓取):抓取web提交的数据资源Scanner(扫描器):扫描web程序的破绽Intruder(入侵):破绽利用,web程序含糊测试,暴力破解等Repeater(中继器):重放模仿数据包的申请与响应的过程Sequenecer:查看web程序会话令牌的随机性并执行各种测试Decoder(解码);解码和编码六、动态 动静语言区别1. http动态语言,不存在破绽,访问速度快,服务端和客户端代码统一(如html)2. php动静语言,可连贯数据库实时更新,服务端和客户端代码不统一(如: asp,php,aspx,jsp)七、常见的脚本语言有那些如PHP, VBScript和Perl ;八、常见的数据库有那些mysql 、SQL Server、Oracle、Sybase、DB2九、常见的数据库与脚本语言搭配asp+accessasp+mssqlphp+mysqlaspx+mssqlaspx+oraclejsp+oraclejsp+mssql十、零碎、脚本语言、中间件如何组合Windows2003/2008/2012+asp、aspx、php+iis6.0/7.0+7.5Apache+Windows/Linux+PHP Windows/Linux+Tomcat+JSP十一、浸透测试过程中如何查看对方操作系统是什么零碎或版本1、工具(RASS、天镜、NMAP、X-SCAN)2、第三方平台(seo.chinaz.com)3、通过ping观看TTL值C:\Users\陈婷>ping 127.0.0.1正在 Ping 127.0.0.1 具备 32 字节的数据:来自 127.0.0.1 的回复: 字节=32 工夫<1ms TTL=64来自 127.0.0.1 的回复: 字节=32 工夫<1ms TTL=64来自 127.0.0.1 的回复: 字节=32 工夫<1ms TTL=64来自 127.0.0.1 的回复: 字节=32 工夫<1ms TTL=644、网页文件大小写windows不辨别大小写Linux辨别大小写

October 18, 2020 · 1 min · jiezi

关于web:PWA的业务价值

渐进式WebApp,在很多公司的倒退蓝图上,紧跟古代浏览器的脚步,以适应用户预期。像所有新的概念和技术性能一样,它们会产生问题:这是不是我的客户须要的?它会如何晋升我的业务?技术可行性怎么样? 为了制订一些数字化的策略,须要几个利益相关者参加:产品经理、CTO,UX调研人员。产品经理关怀每一个性能的业务价值,CTO关怀技术的可行性和可靠性,UX调研人员关怀性能是否能够解决客户问题。 这篇文章旨在答复以上三个人的问题,并构建PWA利用。你能够从你的客户需要开始,转换成PWA的性能,聚焦于掂量每一个性能带来的业务价值。 PWA解决客户需要Google有一个规定:“focus on the user and all else will follow”。思考用户优先:客户须要什么?PWA能够给他们提供什么? 在做用户调研的时候,咱们发现了一些乏味的模式: 用户厌恶手机上关上网页提早和不牢靠。50%的智能手机用户更喜爱在网页下来浏览或者购物,不想下载App。卸载App的其中一个大的理由是手机存储空间无限(PWA个别只须要1M不到)。应用手机网页购物的智能手机用户,85%的人感觉手机告诉有用。综上所述,咱们会发现客户更喜爱的体验是:疾速、可装置、牢靠、密切联系。 PWA利用古代Web性能PWA提供了一系列绝佳的体验和古代Web API,旨在满足你的客户需要。 举个例子,用service worker,能够缓存你的资源文件,也能够预测性的prefetch,让你的站点更快更牢靠。Manifest API,让你的站点变得可装置,用户能够从首屏间接点击图标启动你的PWA利用。Notification API则能够给你的客户发告诉信息,让分割更加亲密。 了解业务影响业务的胜利的定义能够是很多方面: 用户破费更多的工夫在你的服务上潜在客户的跳出率的升高转化率的晋升更多回头客大部分PWA的我的项目都有很高的转化率。取决于你的指标,你能够优先选择局部PWA的性能,让你的业务更好。PWA的性能能够独立的去利用。 一个关上速度快的网站的业务影响首先统计你的网站以后的转化率以及支出,而后依据core web vitals的相干指标去优化你的站点,再察看每日转化率和支出的变动。 ebay通过一系列对网站的优化,得出了一个他们的论断,每100ms的速度晋升,能够带来0.5%的下单量的晋升。 一个可装置的web站点的业务影响为什么你心愿用户装置你的PWA利用?为了让他们更容易回到你的站点。一个安卓App的装置大抵有三个步骤:先去利用市场搜寻App,下载,装置App。一个PWA的App的装置就很简略,间接点击一个按钮即可,用户无需来到以后会话。 一旦装置了,用户只需点击桌面的图标即可启动,App之间的切换也和原生统一,零碎的搜寻也能够搜到。关上的界面也无需放心会有浏览器的地址栏之类的,能够采纳standalone的形式启动,与原生利用一样。 违心装置PWA的用户,个别都是你的深度用户,他们会花更多的工夫在这个下面,也会常常应用。 为了让你的PWA可装置,须要达到一些条件,当这些条件满足了之后,你能够提醒用户装置,在不同的平台上做不同的提醒,如下图所示: 一旦你开始提醒用户装置,你就须要去设置一些埋点统计,看看多少人装置了,这些装置的用户又是如何应用的。 为了让更多的用户装置,你可能会尝试不同的文案或者款式。 为了了解用户从哪里来到的,改善用户留存,安装程序能够退出以下四个指标: 有资格装置的用户数(满足了可装置的条件)点击装置提醒的用户数点击了接管或者回绝的用户数胜利装置的用户数你能够采取更审慎的做法,刚开始只给一小部分用户去提醒装置。 一段时间过后,你能够收集到很多统计数据,这样就能剖析出从图标点击关上网站的用户是如何操作的,这批用户是否更深度应用了?是否转化率晋升了? 为了晓得哪些用户装置了,你能够去监听 appinstalled 的事件。也能够用js api去检测以后是否是standalone窗口(这表明是从桌面图标关上的)。而后用这些数据做更具体的剖析。 装置是一个十分棒的形式,让用户能够回到你的站点,晋升用户的忠诚度。你也能够给这些用户提供一些个性化的体验。 即便你曾经有了原生APP,你也能够去尝试PWA的形式,先提醒用户装置原生APP,如果用户不违心去下载,再提醒装置PWA的版本。有这样一部分用户属于中等深度用户,不心愿去下载一个原生App,更能承受PWA这种只在桌面减少一个图标,更加轻量。 一个牢靠的网站的业务影响如果一个游戏能够提供离线模式,那么用户玩的频率会更高一些。网络的可靠性是一个很大的机会,特地是对于一些网速较慢的国家,比方印度。如果你的App反对离线,或者低速网络失常应用,受众会更广。 当你去关上一个从利用市场下载的APP,你更期待它不须要联网就能失常关上和应用。PWA的利用也是一样的。 至多,提醒用户网络连接已断开,也比一个空白页面要好很多。很多事实场景,即便没有网络也心愿能够失常应用,比方:登机牌,购物车等。 当你曾经施行了离线的计划,你能够去统计看看多少用户是离线应用的,这些用户是否始终停留着直到网络复原。 一个密切交互的网站的业务影响推送告诉能够让用户实时的理解到最新的音讯,也能够蕴含一些个性化的内容。 须要留神的是,不要一上来就让用户注册,仅仅为了收音讯告诉,等用户体验过之后,在适合的机会去提醒用户。告诉的内容也有肯定考究,尽可能的是用户最心愿看到的,比方截止工夫,火车票行程等。 为了统计推送告诉的有效性,能够定制以下指标: 有资格取得推送告诉的用户数点了告诉提醒的用户数受权推送告诉权限的用户数回绝推送告诉的用户数参加推送告诉的用户数从推送告诉带来的用户的转化率 PWA中的P的含意:渐进式启动,一一性能减少PWA是古代的站点,受害于浏览器的反对,联合了用户最爱的原生APP的诸多个性,它利用了一系列的最佳体验和古代Web Api,能够独自的集成和施行,依据你的业务来排优先级。 为了放慢网站的现代化进度,让它成为一个真正的PWA利用,能够尝试一一性能去减少。首先要去找到你的用户感觉价值最大的性能,把这些信息给到设计师和开发者,最初不要忘了去统计一下你的PWA赚了多少额定的钱。 总结从Chrome的版本更新,咱们能够看到很显著的趋势,谷歌曾经开始在PWA高低狠手了,以前没有一个显著的装置按钮,当初间接放在了导航栏右侧。在应用PWA之前,先理解它对业务的影响至关重要,这样能力明确你是否须要应用它。与小程序不同,各家都是不同的规范,PWA的规范齐全由W3C定制。而且它也不依赖微信或者支付宝这种环境,每个手机都有浏览器,那就能够去装置PWA的利用。作为一个平台,微信和支付宝都没有能力跟上web规范的定制,浏览器的更新永远是走在最后面,而且PWA也能够在微信和支付宝中运行,惟一的缺点在于ios的webview目前还不反对service worker,无奈做到离线,置信也就是这几年的事件了,苹果也在推动这一块,尽早的将你的站点扭转成PWA的利用更能适应将来的环境。 参考https://web.dev/drive-busines... ...

October 11, 2020 · 1 min · jiezi

关于web:Web-Storage-API的介绍和使用

简介Web Storage为浏览器提供了不便的key value存储,是一种比cookie更加不便简洁的存储形式。也是诸多客户端存储形式中十分常见的一种。 一起来看看吧。 浏览器的本地存储技术除了最早的应用cookie来进行本地存储之外,古代浏览器应用Web Storage API来不便的进行key/value的存储。 Web Storage有两种存储形式: sessionStorage: 对于每一个拜访源,都会维持一个独立的存储区域。只有浏览器不敞开,这些数据都不会隐没。所以这种存储叫做session存储。 留神,这里的session和服务器端的session的意思是不一样的,这里的sessionStorage只是本地的存储,并不会将数据传输到服务器端。 sessionStorage的存储容量要比cookie大得多,能够达到5MB。 localStorage:和sessionStorage相似,也是用来做数据存储的,不同的是localStorage存储的数据不会随着浏览器的敞开而隐没。我能够通过设置过期工夫,应用javascript手动删除或者分明浏览器缓存来革除localStorage。 这两种存储形式是通过Window.sessionStorage 和 Window.localStorage来应用的。事实上咱们看下Window的定义: interface Window extends EventTarget, AnimationFrameProvider, GlobalEventHandlers, WindowEventHandlers, WindowLocalStorage, WindowOrWorkerGlobalScope, WindowSessionStorage Window继承了WindowLocalStorage和WindowSessionStorage,所以咱们能够间接从Window来获取sessionStorage和localStorage。 对于每一个origin源来说,Window.sessionStorage 和 Window.localStorage 都会创立一个新的Storage对象,用来进行数据的读取。 Web Storage相干接口和web storage相干的接口有三个。第一就是刚刚讲到的window。咱们能够通过window获取sessionStorage和localStorage。 第二个就是Storage对象,获取到的两个Storage都是Storage对象。 interface Storage { readonly length: number; clear(): void; getItem(key: string): string | null; key(index: number): string | null; removeItem(key: string): void; setItem(key: string, value: string): void; [name: string]: any;}咱们能够看到Storage对象为咱们提供了很多有用的办法,对数据进行存取。 第三个就是StorageEvent,当storage发现变动的时候就会触发StorageEvent事件。 ...

October 6, 2020 · 2 min · jiezi

关于web:非主流的纯前端性能优化

作者:ChenJing性能优化始终是前端钻研的次要课题之一,因为不仅间接影响用户体验,对于商业性公司,网页性能的优劣更关乎流量变现效率的高下。例如 DoubleClick by Google 发现: 如果页面加载工夫超过 3 秒,53% 的用户会抉择终止以后操作并来到网站加载工夫在 5 秒内的公布商比 19 秒内的广告支出至多多出一倍同时,性能优化学习的不断深入,也同样是一个业余前端工程师的进阶之路。不过,随着 HTTP/2 和 SSR(服务端渲染)的一直遍及,晚期雅虎 35 条中的很多内容仿佛曾经显得有些过期,不少纯前端的细节优化计划也逐步被认为微不足道。 然而,明天,咱们仍然想谈几个容易被很多前端工程师漠视,但却行之有效的纯前端优化细节(技术框架以 Vue 为主)。 一、self这里想说的 self 并不是  WindowOrWorkerGlobalScope 下的 self,或者说 window 的替身,而是 const self = this  中的 self,或者说对象缓存。 在简直所有数据类型皆对象的 JavaScript 中,能无效升高属性拜访深度的对象缓存是前端优化最根底的课程,即便在浏览器曾经进化到即便没有明确地申明缓存对象,内核解析时也会主动缓存以减少解析效率的明天。 良好的对象缓存不仅仅只是为了防止写出上面的代码: const obj = { human: { man: {} }} obj.human.man.age = 18obj.human.man.name = 'Chen'obj.human.man.career = 'programmer'还有一个更加重要的起因:无效缩小工程上线时压缩后的代码量! 首先,看一下下面代码压缩后的后果: var ho={human:{man:{}}};ho.human.man.age=18,ho.human.man.name="Chen",ho.human.man.career="programmer";而后,对属性对象 man 做一次变量缓存: const obj = { human: { man: {} }}const man = obj.human.man man.age = 18man.name = 'Chen'man.career = 'programmer'再次压缩代码后的后果: ...

September 23, 2020 · 5 min · jiezi

关于web:urlpattern映射的规则

url-pattern映射的规定首先,要明确一点,“*”在这里不代表通配符,也不代表表达式,他就是约定好的规定; 那么何为映射,即申请门路url减去以后的利用上下文,剩下的字符串则为映射 为了很好阐明下列例子;在此规定利用上下文是:http://127.0.0.1:8080/myapplication 准确匹配准确匹配,就是映射必须和配置的映射是齐全相等; 例如我当初申请一个门路是http://127.0.0.1:8080/myapplication/addUser/addAdmin 那么申请的映射则为 /addUser/addAdmin 如此,在servlet-mapping中的配置url-pattern则设置为/addUser/addAdmin即可 留神:优先级最高,且必须url-pattern配置的是和申请过去的等值; 门路匹配门路匹配,就是应用“*”符号来进行门路形容 例如我当初申请的门路是http://127.0.0.1:8080/myapplication/updateUser/updateAdmin 则我的申请映射是/updateUser/updateAdmin 假如,我当初配置了两个url-pattern <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> <!-- 匹配 /updateUser/ancd ,/updateUser/a.jsp /updateUser/abc/def/aaa.do 等等 and so on! --> <url-pattern>/updateUser/*</url-pattern> <url-pattern>/updateUser/updateAdmin</url-pattern></servlet-mapping>猜测一下会匹配到哪一个? 其实,它只会匹配到第三个映射,因为优先级最高,其余的两个url-pattern都会被疏忽(留神:尽管我写的servlet-name是同一个,然而在不同的servlet-name下,情理是一样的) 留神:优先级次高,url-pattern里的后置能够应用*,且之后不能再有字符串,否则被当成一般字符解决; <servlet-mapping> <servlet-name>hello</servlet-name> <!--正例,只有是/updateUser/结尾的 前面能够匹配扩展名(前面会讲),也能够匹配门路--> <url-pattern>/updateUser/*</url-pattern> <!-- 这里当作准确匹配解决了,“*” 只是一般的字符而已 --> <url-pattern>/updateUser/*/updateAdmin</url-pattern></servlet-mapping>扩展名匹配扩展名匹配,url-pattern的内容只能是“*.扩展名”的模式 <servlet-mapping> <servlet-name>hello</servlet-name> <!-- 非法的例子 --> <url-pattern>/updateUser/*.action</url-pattern> <!-- 非法的例子,且匹配所有*.do的申请 记住是所有的 *.do --> <url-pattern>*.do</url-pattern></servlet-mapping>留神:优先级第三,且不能和门路匹配同时存在; 默认匹配最最最低了,切实是找不到匹配的映射了就会以它为准,且只有一个实例 <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/</url-pattern></servlet-mapping>留神:优先级最低,只能有一个实例,不要加任何货色,只用 “/” ; 无敌巨坑应用a标签的时候,如果以/结尾,不会加上利用的上下文,留神奥~ ,得本人加上 “/上下文/申请门路”

September 14, 2020 · 1 min · jiezi

关于web:curl-user-usernamepassword-url转换http发送

0x00.背景博主最近打算用spring boot + oauth2 + jwt构建一套sso单点登录零碎,查看材料的时候,很多例子给的都是curl -user username:password url这种形式的测试,博主打算转换成postman发动申请,查了些材料才晓得怎么改写 0x01.crul申请数据申请脚本curl --request POST  --user android-client:android-client  --url http://localhost:8090/oauth/token  --header 'Content-Type: application/x-www-form-urlencoded'  --data 'username=customer_one&grant_type=password&password=customer_one'响应后果 0x02.转换成Postman--user android-client:android-client :对应的Authorization。 --data :对应申请Body。 响应后果 0x03.Authorization如何转换?Basic前面字符串是Base64.encode("user:pwd")后的。@Testpublic void encodeAuthTest() { String token = "android-client:android-client"; Base64.Encoder encoder = Base64.getEncoder(); byte[] bytes = encoder.encode(token.getBytes());System.out.println(new String(bytes)); //YW5kcm9pZC1jbGllbnQ6YW5kcm9pZC1jbGllbnQ=}0x04.完

September 13, 2020 · 1 min · jiezi

关于web:SAP-WebClient-UI和business-switch相关的逻辑介绍

Do you know the meaning of these two checkboxes in F2 popup? Let’s first learn some prerequisite knowledge:In Webclient UI workbench the poweful functionality is provided to ensure that the given feature is only available, if the bound business switch is in active status. For example you can open component BP_HEAD and find many view are added to overview area with a related business switch. ...

September 4, 2020 · 3 min · jiezi

关于web:SAP-WebClient-UI页面标签的决定逻辑介绍

In this blog we have discussed the logic how the correct UI view configuration is chosen by framework in the runtime. You may have observed that for each field, there is the attribute “Label Origin”, which indicates where the label text comes from. There are three types of text origin and their determination priority are sorted in the descending order: Text RepositoryDesign layerABAP DictionarySee an example:I just create a simple component with component set PROD_ALL loaded, and add two fields from Genil Model node Product: PRODUCT_ID and OBJECT_FAMILY_DESC.For PRODUCT_ID, I don’t change its label so its Label Origin is “Data Dictionary”. ...

September 4, 2020 · 1 min · jiezi

关于web:SAP-WebClient-UI配置决定configuration的逻辑介绍

This blog will try to introduce the Webclient UI Configuration determination logic to those friends who are new for this topic. Suppose I log on Webclient UI via Business role SALESPRO and have opened Sales Order overview page and F2 to open technical information page, what are the meaning of the left four fields ( Searched For) and the right four fields ( <DEFAULT>) ? Figure1 Technical information page ...

September 4, 2020 · 3 min · jiezi

关于web:页面视觉稳定性之优化CLS

最常见的影响CLS的分数的有: 未指定尺寸的图片未指定尺寸的广告、嵌入元素、iframe动静插入内容自定义字体(引发FOIT/FOUT)在更新DOM之前期待网络响应的操作未指定尺寸的图片总而言之:在 <img> 和 <video 标签上始终加上 width 和 height 属性。或者,应用 CSS aspect ratio boxes 来占据空间。这种办法能够确保在图片加载过程中,浏览器能够调配足够的空间。 历史在web的晚期,开发者会给 <img> 标签加上 width 和 height 属性,以确保浏览器开始获取图片之前能够调配好空间,这样能够缩小 reflow 和 re-layout。 <img src="puppy.jpg" width="640" height="360" alt="Puppy with balloons">你兴许会留神到这两个属性没有带单位。这些像素尺寸会确保保留640 * 360的区域。图片最终会平铺在这个区域,不论原始尺寸是否统一。 当响应式设计降临的时候,开发者开始疏忽 width 和 height,开始应用css来调整图片大小。 img { width: 100%; /* or max-width: 100%; */ height: auto;}这种办法的毛病是,只有图片下载的时候,浏览器才晓得图片的宽高并且调配好空间。图片下载完了,每张图片呈现在屏幕上的时候,页面都会 reflow 一次,会导致页面频繁的往下弹。这对于用户体验来说十分不敌对。 因而而诞生了 aspect ratio。aspect ratio 是图片的宽高比。比方,x:y的宽高比,指的是宽度x单位,高度y单位。 这也意味着只有咱们晓得宽高之一,就能计算出另一个属性。对于一个16:9的宽高比而言: 如果图片有360px的高度,则宽度为 360 x (16 / 9) = 640px如果图片有640px的宽度,则高度为 640 x (9 / 16) = 360px古代浏览器最佳体验古代浏览器能够基于 width 和 height 属性设定默认宽高比,这样就能防止布局偏移。开发者只须要如下设置: ...

August 30, 2020 · 1 min · jiezi

关于web:SAP-WebClient-UI-component-context-node-class单元测试方法

Prerequisite for reading this blog: you should be familiar with how to work with ABAP unit test framework.Requirement is to write unit test for this method below: In this blog, I copy the standard class CL_PRDTXT_TEXTCUCO_CN02 into a local class ZCL_PRDTXT_TEXTCUCO_CN02 and generate test class based on the latter. The same approach could be applied to the standard class for sure.Create local unit test class for it via wizard: ...

August 27, 2020 · 3 min · jiezi

关于web:Web开发的历史发展技术演变

简介: 本文对Web开发的历史倒退的理解很有裨益,举荐给大家。本文尝试从历史倒退角度,说说各种研发模式的优劣。 一、简略明快的晚期时代,二、后端为主的 MVC 时代,三、Ajax 带来的 SPA 时代,四、前端为主的 MV* 时代,五、Node 带来的全栈时代 本文对Web开发的历史倒退的理解很有裨益,举荐给大家。 本文尝试从历史倒退角度,说说各种研发模式的优劣。 一、简略明快的晚期时代 可称之为 Web 1.0 时代,非常适合守业型小我的项目,不分前后端,常常 3-5 人搞定所有开发。页面由 JSP、PHP 等工程师在服务端生成,浏览器负责展示。基本上是服务端给什么浏览器就展示什么,展示的管制在 Web Server 层。 这种模式的益处是:简略明快,本地起一个 Tomcat 或 Apache 就能开发,调试什么的都还好,只有业务不太简单。 然而业务总会变简单,这是好事件,否则很可能就意味着守业失败了。业务的简单会让 Service 越来越多,参加开发的人员也很可能从几个人疾速扩招到几十人。在这种状况下,会遇到一些典型问题: 1、Service 越来越多,调用关系变简单,前端搭建本地环境不再是一件简略的事。思考团队合作,往往会思考搭建集中式的开发服务器来解决。这种解决方案对编译型的后端开发来说兴许还好,但对前端开发来说并不敌对。天哪,我只是想调整下按钮款式,却要本地开发、代码上传、验证失效等好几个步骤。兴许习惯了也还好,但开发服务器总是不那么稳固,出问题时往往须要依赖后端开发搞定。看似仅仅是前端开发难以本地化,但这对研发效率的影响其实蛮大。 2、JSP 等代码的可维护性越来越差。JSP 十分弱小,能够内嵌 Java 代码。这种弱小使得前后端的职责不清晰,JSP 变成了一个灰色地带。常常为了赶我的项目,为了各种紧急需要,会在 JSP 里揉杂大量业务代码。积攒到肯定阶段时,往往会带来大量保护老本。 这个期间,为了进步可维护性,能够通过上面的形式实现前端的组件化: 实践上,如果大家都能依照最佳实际去书写代码,那么无论是 JSP 还是 PHP,可维护性都不会差。但可维护性更多是工程含意,有时候须要通过限度带来自在,须要某种约定,使得即使是老手也不会写出太蹩脚的代码。 如何让前后端分工更正当高效,如何进步代码的可维护性,在 Web 开发中很重要。上面咱们持续来看,技术架构的演变如何解决这两个问题。 二、后端为主的 MVC 时代 为了升高复杂度,当前端为出发点,有了 Web Server 层的架构降级,比方 Structs、Spring MVC 等,这是后端的 MVC 时代。 ...

August 24, 2020 · 2 min · jiezi

关于web:Web-全栈开发利器-强大的在线-Cloud-IDE

摘要:近年来,麻利、DevOps的理念已逐渐成为支流。基于云计算的开发环境也正取得越来越多开发者的青眼。不难想象,云端IDE已成将来的趋势。学了Web全栈开发,就得入手实际,要入手,得先有开发环境。比方要开发python代码,是先在本人机器上装置python3,而后装置pycharm社区版。 其实这些事件,说难不难,说容易也不容易。 说难,你难在哪里了?筹备个环境还难了,啥活都还没干呢? 说容易,很容易吗?下载、装置、配置,也还要折腾,有时碰到什么环境问题、版本适配问题,也伤神。 原本按老师的课程来的话,是要用node.js的Koa框架的,不过二阶段学习它只是主角,配角是js和ajax。所以后盾先临时用Python。在本地pycharm里写python代码,很不便,编码提醒等辅助性能能大大放慢编码速度,包含主动保留,批改的主动加载,开发十分的高效率。 这些高效率,在CloudIDE,样样都有,一点也没落下。 CloudIDE却有本地pycharm比不上的,那就是当你编写模板页面html时,CloudIDE就像VS Code一样的不便,而pycharm还是pycharm,对HTML不感冒,那你写HTML就苦楚了,一个字一个字的敲吧。 从这一点来看,我认为CloudIDE会将是编程环境的集大成者,能够极大的进步程序员的开发效率。 上面切换到课程里用的node.js的Koa框架,依照课程步骤,你须要下载安装node.js,应用npm装置koa脚手架,因为家喻户晓的起因,你还要配置cnpm以解决网络问题。 如果应用CloudIDE,网页上点点,新建一个node.js技术栈的实例,根本环境就给你筹备好了,间接上手操作,npm间接用,网络没故障。 所以上手很快是吧,前面编码、测试、调试也是one条龙的Service,这里就不多说了。 对于程序员来说,辛辛苦苦搭环境,已经是没有方法的事件。如果你说,我想从头做起,我要学搭环境,我要什么都能本人做,我要没网也要编程,这也没错,我想说的是,搭环境是一件低附加值的重复劳动。 第一次搭好是陈腐和取得感,第二次是反复,第三次就如同是某些乏味却不得不做的工作(为了生存)了。 吃鱼吃鱼身,何必辛苦拆鱼头呢? 拥抱CloudIDE吧! 附图: 图1 python3环境 图2 nodejs环境,npm间接应用 图3 批改监听端口,CloudIDE检测到端口监听,提醒端口注册拜访 图4 拜访页面(测试) 面向云原生、AI和挪动开发者,华为云CloudIDE正在致力于买通利用开发态到运行态,晋升开发者继续交付的能力,携手开发者独特实现研发体系的高质高效。 点击关注,第一工夫理解华为云陈腐技术~

August 18, 2020 · 1 min · jiezi

关于web:交互响应性能之优化FID

因为 FID 须要一个实在用户的交互,所以无奈用试验数据测试。 为了在试验数据下预测 FID,通常会用 TBT(Total Blocking Time),具体这个指标前面文章会介绍。他们测量的内容不同,但改善 TBT 通常也能改善 FID。 一个蹩脚的 FID 次要起因是JS执行过长,优化JS的解析、编译、执行能够间接升高 FID。 过长的JS执行当JS执行过程中,浏览器无奈响应用户交互,因为主线程被占用,为了改善这点,能够: 合成长工作优化页面,为交互筹备应用 Web Worker缩小JS执行工夫合成长工作如果你筹备尝试缩小单个页面的js的体积,能够先思考把较长执行的js代码分解成小的异步工作。 长工作指的是用户可能会发现页面无响应的期间执行的js代码。任何阻塞主线程大于等于50ms的代码都是长工作。长工作个别是js体积过大的潜在因素(浏览器加载并执行了比页面初始化所须要的更多的js)。 合成长工作能够升高用户输出提早。 当你采纳最佳实际(例如拆分代码、合成长工作),FID 会有显著改善。尽管 TBT 并非现场数据指标,但这对于改善 FID 和 TTI(Time To Interactive) 都很有帮忙。 优化页面,为交互筹备造成 FID 和 TBT 分数低有很多起因,大多都是js引起的。 本人站点的脚本执行可能会延后交互JS体积过大,执行工夫过长,有效的分包会导致页面响应用户交互变慢,影响 FID、TBT、TTI。逐渐加载代码和功能块能够拆分这些工作,晋升响应速度。服务端渲染看上去页面是进去了,但用户的交互还是受限于js的执行工夫,能够思考把更多逻辑代码放在服务端实现,或者在构建的时候创立更多动态内容。下图是 TBT 得分的优化前后比照。通过将非必须的低廉的脚本的加载和执行移出要害门路,用户就能够更快的去与页面交互。 数据获取会影响交互筹备的很多方面级联的获取数据的水流图(蕴含js,数据的网络申请等),会导致交互提早。目标是要缩小对级联数据获取的依赖。(缩小申请数)较大的内联数据能够节俭HTML的解析工夫,同时影响绘制图像和交互两种指标。目标是要缩小客户端后续解决对数据的依赖。(数据在内联曾经筹备好了,不须要额定申请)第三方脚本的执行可能会延后交互很多网站都蕴含第三方库的标签和统计代码,这些会导致网络阻塞,使得主线程长时间无奈响应,延后了交互。查找出必须加载的第三方代码。(例如:不滚动到指定地位不展现广告)有时候,第三方的脚本会领先于本站脚本加载,例如加载优先级和带宽限度。尝试着优先加载你感觉能够给用户提供最有价值的货色。应用 web worker主线程阻塞是导致输出提早的次要因素之一。web worker能够让你的代码在后盾过程中执行,把一些非UI的操作放在web worker中执行能够缩小主线程压力,改善 FID 指标。 能够应用以下的库,让你的站点更不便的集成web worker: ComlinkWorkwayWorkerize缩小JS执行工夫延后加载未应用的js最小化无用的polyfill延后加载未应用的js通过开发者工具中的coverage的tab页能够查看各资源的无效使用率。 为了缩小无用JS,能够: 把你的代码拆分成多个chunk,按需加载应用 async 或者 defer 延后加载非关键脚本,蕴含第三方脚本代码拆分指的是将一个大的单个JS拆分成多个小的,依据条件去加载对应的JS。古代浏览器曾经反对按需加载: import('module.js') .then((module) => { // Do something with the module. });除了罕用浏览器反对以外,一些构建零碎也反对: ...

August 18, 2020 · 1 min · jiezi

关于web:8种最佳开源Web服务器

自1991年公布第一台Web服务器以来,这是一段漫长的历程。长期以来,Apache是惟一值得一提的Web服务器。然而,随着工夫的流逝,其余开源Web服务器也越来越受欢迎。 在本指南中,咱们将介绍一些最佳的开源Web服务器。 1. Apache HTTP服务器Apache HTTP Server(在Red Hat发行版中俗称Apache或httpd)是由Apache Software Foundation依据Apache License版本2 开发的收费开源Web服务器。公布于1995年,Apache迅猛发展,已成为最受欢迎的服务器之一以及宽泛应用的网络服务器,为超过37%的网站提供反对。 Apache用C语言编写,并且因为其大量的模块扩大了Web服务器的性能,因而是高度可定制的Web服务器。其中包含用于缓存的mod_file_cache,为文件上传和下载提供FTP反对的mod_ftp以及容许反对SSL / TLS加密协议的mod_ssl等等。 此外,鉴于其丰盛的模块集,Apache提供了多协定反对,例如IPv4和IPv6反对以及罕用的HTTP,HTTP / 2和HTTPS协定。 Apache还提供了虚构托管反对,使您能够托管多个域或网站。通过配置虚拟主机,一台服务器能够轻松且无任何复杂性地托管多个域。您能够应用example.com,example.edu,example.info等。 2. Nginx Web服务器Nginx的发音为Engine-X,是一种开源的高性能鲁棒性Web服务器,它还能够兼用作负载均衡器,反向代理,IMAP / POP3代理服务器和API网关。Nginx最后由Igor Sysoev于2004年开发,现在已逐步遍及,以击败竞争对手并成为最稳固和牢靠的Web服务器之一。 Nginx因其低资源利用率,可伸缩性和高并发性而引人注目。实际上,如果进行适当的调整,Nginx 每秒能够解决多达500,000个申请,而CPU利用率却很低。因而,它是承载高流量网站的最现实的Web服务器,击败了Apache。(百度:113资讯网) 在Nginx上运行的风行站点包含Tencent,Taobao,JD,NetEase和SINA等。 Nginx依附配置使调整变得容易,就像Apache一样,它反对多种协定,SSL / TLS反对,根本HTTP身份验证,虚拟主机,负载平衡以及URL重写等。目前,Nginx占有所有托管网站的31%的市场份额。 3. Lighttpd Web服务器Lighttpd是一个收费的开源Web服务器,专门用于对速度有严格要求的应用程序。与Apache和Nginx不同,它的占用空间十分小(不到1 MB),并且在服务器资源(例如CPU利用率)方面十分经济。 Lighttpd在BSD许可下散发,在Linux / Unix零碎上本机运行,但也能够装置在Microsoft Windows中。它以其简略,易于设置,性能和模块反对而广受欢迎。 Lighttpd的体系结构通过优化,能够解决大量并行连贯,这对于高性能Web应用程序至关重要。Web服务器反对FastCGI,CGI和SCGI,用于将程序与Web服务器接口。它还反对以多种编程语言编写的Web应用程序,并特地留神PHP,Python,Perl和Ruby。 其余性能包含SSL / TLS反对,应用mod_compress模块的HTTP压缩,虚拟主机以及对各种模块的反对。 4. Apache TomcatApache Tomcat是Java Servlet引擎,Java Expression Language和Java Server网页的开源实现。对于正在构建和部署基于Java的应用程序的开发人员来说,它是现实的抉择。www.113p.cn 严格来说,Tomcat不是像Nginx或Apache这样的一般Web服务器。它是Java Servlet,具备与Java Servlet交互的扩大性能,同时实现了诸如JavaServer Pages(JSP)和Java Expression Language(Java EL)之类的技术规范。 什么套的Tomcat从其余Web服务器除了它,它的专门针对服务基于Java的内容。它最后是为提供Apache HTTP服务器所短少的JSP性能而开发的。 在解决同时蕴含PHP和Java内容的我的项目的状况下,能够将Apache Tomcat与Apache HTTP服务器一起运行。当Tomcat解决JSP性能时,Apache HTTP服务器能够解决动态和动静内容。 然而,Apache Tomcat自身并不是一个欠缺的Web服务器,并且效率不如Nginx和Apache等传统Web服务器。 ...

August 11, 2020 · 1 min · jiezi

关于web:页面加载性能之优化LCP

影响LCP的四个因素如下: 较慢的服务器响应工夫渲染阻塞的js和css较慢的资源加载工夫客户端渲染较慢的服务器响应工夫浏览器获取文档的工夫越长,用户看到页面的工夫也会越长。较快的服务器响应工夫,能够间接改善每一个页面加载相干的指标,包含LCP。 能够应用 TTFB(Time to First Byte) 来测试服务器响应工夫,你能够通过以下伎俩来优化 TTFB 这个指标。 优化服务器应用CDN缓存资源html页面优先应用缓存提前建设第三方连贯优化服务器你是否在服务器上运行一些低廉的查问,占用了服务器肯定的工夫?或者服务器上做了一些简单的操作,导致页面内容返回延后?剖析和晋升服务端代码的效率能够间接改善浏览器从服务端获取数据的工夫。 比起仅仅是提供动态页面而言,很多服务端的web框架都会动态创建页面。换句话说,比起间接返回一个现存的html文件,这些框架会执行一些逻辑来创立页面。这就取决于数据库查问工夫,或者UI框架创立组件的工夫(比方: React)。大部分web框架都有提供性能领导,开发者能够依据领导来晋升处理速度。 应用CDNCDN全称Content Delivery Network,是一个散布在不同地区的服务器集群。如果浏览器去申请数据,CDN会抉择就近的一个服务器给你返回,防止申请产生太长网络门路,甚至跨国。 缓存资源如果你的html是动态的,每一次申请都不会变,能够服务端缓存下来,不必每次从新创立页面。通过缓存一份生成好的html到硬盘,服务端缓存能够无效的升高TTFB,最小化资源的应用。 配置反向代理,在应用服务器之前配置一个缓存服务器,专门提供缓存内容。配置和治理云服务商提供的缓存个性应用CDN来提供内容缓存,这样用户能够更近的获取到内容html页面优先应用缓存service worker能够实现这样一个性能,优先应用缓存页面,如果页面有更新,会将新页面缓存下来,下次启动则应用新缓存。 下图是应用service worker的一个比照: 提前建设第三方连贯发往第三方服务的申请也会影响LCP,特地是当页面要害内容依赖它们的时候。应用 rel="preconnect" 告知浏览器你的资源连贯须要尽可能地快。 <link rel="preconnect" href="https://example.com">也能够应用 dns-prefetch 让dns解析更快。 <link rel="dns-prefetch" href="https://example.com">思考到浏览器兼容性, dns-prefetch 能够作为 preconnect 的一个fallback。 <head> <link rel="preconnect" href="https://example.com"> <link rel="dns-prefetch" href="https://example.com"></head>preconnect个别只配置一个,dns-prefetch能够配置多个,所以个别把最要害的资源配置成preconnect,比方js或者css所在的cdn域名渲染阻塞的js和css在浏览器渲染任何内容之前,须要解析html,并生成dom树。html解析器会被任何款式文件 <link rel="stylesheet"> 以及同步脚本 <script src="main.js"> 阻塞并暂停解析。 这个不仅影响FCP,也影响了LCP。提早加载非关键的js和css能够减速页面的主内容的加载。 缩小css阻塞工夫有以下三种办法: 最小化css延后加载非关键的css内联要害css最小化css移除css中不必要的字符、正文和空格等,个别打包工具都会自带相应的插件。 延后加载非关键的css应用开发者工具中的 Coverage 能够找到页面未应用的css。 优化计划: 移除无用的css,并将它们移到须要的页面用 rel="preload" 和 onload 异步加载对于首次渲染无用的css内联要害css将要害门路的css间接放在 <head> 中内联援用: 这样能够防止一次服务器申请,让css阻塞工夫更短。 如果你无奈手动增加内联款式,能够应用第三方库: Critical, CriticalCSS, 和 Penthouse 能够提取并内联css。Critters 是一个webpack插件,能够帮你内联要害css,其余css则懒加载。缩小js阻塞工夫有以下三种计划: 最小化并压缩js文件延后未应用的js尽量减少未应用的polyfills缩小资源加载工夫次要有以下几种元素会影响LCP: <img> 元素<svg> 中的 <image> 元素<video> 元素(如果定义了封面图,会影响LCP)带 url() 背景图的元素块级元素带有文本节点或者内联文本子元素有以下几种形式能够保障这些文件尽快的加载: ...

August 10, 2020 · 1 min · jiezi

关于web:页面加载性能之LCP

LCP (Largest Contentful Paint) 是一个以用户为核心的性能指标,能够测试用户感知到的页面加载速度,因为当页面次要内容可能加载实现的时候,它记录下了这个工夫点。一个疾速的LCP,能够让用户感触到这个页面的可用性。 以往,对开发者而言,要测试一个页面次要内容加载并出现给用户的速度是一个很大的挑战。 旧指标,像 load 和 DOMContentLoaded 并不是很好,因为它不肯定跟用户屏幕上看到的内容绝对应。然而新的以用户为核心的指标,比方 FCP (First Contentful Paint) 只是记录了加载体验的最开始。如果页面显示的是启动图片或者loading动画,这个时刻对用户而言没有意义。 在过来,咱们也有举荐的性能指标,如:FMP (First Meaningful Paint) 和 SI (Speed Index) 能够帮咱们捕捉更多的首次渲染之后的加载性能,但这些过于简单,而且很难解释,也常常出错,没方法确定次要内容什么时候加载完。 有时候越简略越好。通过W3C性能工作小组的探讨和谷歌的钻研,咱们发现了一个更准确的测量形式,当最大的内容块渲染完的时候,基本上主内容都加载完了。 什么是LCPLCP指标代表的是视窗最大可见图片或者文本块的渲染工夫。 一个好的LCP得分是多少?个别是至多75%用户可能在2.5秒内,包含挪动和桌面设施。 如何确定元素类型?跟 Largest Contentful Paint API 外面定义的统一,蕴含以下几种元素类型: <img> 标签<svg> 中的 <image> 标签<audio> 标签带 url() 背景图的元素块级元素带有文本节点或者内联文本子元素要留神的是,限度元素在这些范畴内只是为了一开始简略一点,当前可能会退出更多的元素。 如何确定元素的大小?LCP中元素尺寸的定义就是用户视窗所见到的尺寸。如果元素在视窗里面,或者如果元素被overflow裁剪了,这些局部不计算入LCP的元素尺寸。 对于曾经被设置过大小的图片元素而言,LCP的尺寸就是设置的尺寸,并非图片原始尺寸。对于文本元素而言,只有蕴含所有文本节点的最小矩形才是LCP的尺寸。对于其余元素而言,css款式里的margin、padding和border都不算。LCP什么时候上报?因为Web页面都是分阶段加载的,所以最大元素可能随时会发生变化。 为了捕捉这种变动,浏览器会派发一个类型是 largest-contentful-paint 的 PerformanceEntry 对象,示意浏览器绘制第一帧的时候最大的元素。在起初的渲染帧中,如果最大元素发生变化,会再次派发一个 PerformanceEntry 对象。 举个例子,一个页面蕴含一个文本题目和一张图片,首帧渲染的时候,文本是最大元素,随着图片加载实现,图片或成为最大元素。 很重要的一点是,只有元素曾经渲染,而且对用户可见,这个元素才能够被当成最大元素。未加载的图片未被渲染,所以不会被思考在内。如果用了自定义字体的文本,在字体文件加载之前,也不会被当成最大元素。 起初被JS增加到dom树上的节点,如果尺寸大于之前的最大元素,浏览器也会派发一个 PerformanceEntry 对象。 如果元素被移除,这个元素不会被当成最大元素。如果图片元素的src属性更改了,在新图片加载之前,这个元素也不会被当成最大元素。 将来,移除元素可能还会被当成最大元素,具体的须要期待google最新钻研如果用户产生了交互行为(如点击、滚动、按键等),浏览器会进行上报新的entry,因为用户的交互行为可能会导致页面元素的可见性变动。 对统计而言,你只须要统计最近上报的一次 PerformanceEntry 即可。 须要留神的是,如果用户关上页面之后,切换到后盾,等再次回到前台的时候,用户产生了交互行为,该埋点就不精确了,会比实在的工夫缩短一些。加载工夫 vs 渲染工夫因为平安的因素,如果跨域图片短少 Timing-Allow-Origin 的header,图片渲染的工夫无奈拿到,相应的,能够用图片加载工夫来代替。不过举荐还是尽可能的加上这个header。 ...

August 8, 2020 · 1 min · jiezi

关于web:PHP-码农的-go-语言密码本项目开发实战-实现前端界面

我是一名 PHP 程序员。最近对 go 语言有了趣味。所以我筹备从身边的一个我的项目动手,实际并学习一下 go 语言。目前已实现了我的项目性能梳理和 go 语言开发环境的搭建,有趣味的敌人能够翻看下后面的文章。明天将要开始实现前端界面。这个小我的项目次要波及三个页面:登录,明码项列表和编辑界面。上面将用线框图的形式别离介绍下这三个页面的性能。 首先是登录页面。 实践上说,这个页面是不须要账号项的,毕竟只是我本人一个人应用,间接输出主明码就能够了。但思考到会线上部署,还是把账号也加上,减少一下不怀好意者的暴力破解难度。 而后登录胜利后,会进入明码项列表页。这个页面会显示目前曾经保留的账号和明码项。并提供了查问性能和编辑入口。明码列显示星号,点击后主动复制到剪贴板。 编辑界面如下,在明码输入框的前面提供了主动生成按钮。 线框图画起来比拟快,能够让本人聚焦于性能。我画线框图的这个工具是 Draw.io,一个在线收费的绘图工具,除了画线框图还能够画流程图等,举荐各位尝试。通过线框图确定好性能和根本布局后,就能够开始做真正的基面了。Web 界面我集体比拟喜爱 Bootstrap,可能疾速的实现一个设计对立,好看的页面。以下是通过 Bootstrap 实现的界面。值得注意的是列表界面的明码星号列在做的过程中感觉显示的有点多余,所以砍掉了,间接变成了一个“复制明码”的按钮。 通过这次界面设计,我曾经实现了目前我的项目的后期筹备工作。界面设计对我来说是再一次性能梳理和做加减的过程,能让本人防止做多余的事件,聚焦在我的项目外围性能上。接下来将真正开始 go 语言的开发工作,下一步按计划要用 go 语言实现数据表的创立,欢送关注和交换,咱们下一篇见。

August 7, 2020 · 1 min · jiezi

关于web:Web-开发必须掌握的三个技术TokenCookieSession

在Web利用中,HTTP申请是无状态的。即:用户第一次发动申请,与服务器建设连贯并登录胜利后,为了防止每次关上一个页面都须要登录一下,就呈现了cookie,Session。 CookieCookie是客户端保留用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种形式。Cookie存储的数据量无限,且都是保留在客户端浏览器中。不同的浏览器有不同的存储大小,但个别不超过4KB。因而应用Cookie实际上只能存储一小段的文本信息。 例如:登录网站,今输出用户名明码登录了,第二天再关上很多状况下就间接关上了。这个时候用到的一个机制就是Cookie。 SessionSession是另一种记录客户状态的机制,它是在服务端保留的一个数据结构(次要存储的的SessionID和Session内容,同时也蕴含了很多自定义的内容如:用户根底信息、权限信息、用户机构信息、固定变量等),这个数据能够保留在集群、数据库、文件中,用于跟踪用户的状态。 客户端浏览器拜访服务器的时候,服务器把客户端信息以某种模式记录在服务器上。这就是Session。客户端浏览器再次拜访时只须要从该Session中查找该客户的状态就能够了。 用户第一次登录后,浏览器会将用户信息发送给服务器,服务器会为该用户创立一个SessionId,并在响应内容(Cookie)中将该SessionId一并返回给浏览器,浏览器将这些数据保留在本地。当用户再次发送申请时,浏览器会主动的把上次申请存储的Cookie数据主动的携带给服务器。 服务器接管到申请信息后,会通过浏览器申请的数据中的SessionId判断以后是哪个用户,而后依据SessionId在Session库中获取用户的Session数据返回给浏览器。 例如:购物车,增加了商品之后客户端处能够晓得增加了哪些商品,而服务器端如何判断呢,所以也须要存储一些信息就用到了Session。 如果说Cookie机制是通过查看客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过查看服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建设的一份客户档案,客户来访的时候只须要查问客户档案表就能够了。 Session生成后,只有用户持续拜访,服务器就会更新Session的最初拜访工夫,并保护该Session。为避免内存溢出,服务器会把长时间内没有沉闷的Session从内存删除。这个工夫就是Session的超时工夫。如果超过了超时工夫没拜访过服务器,Session就主动生效了。 TokenHTTP申请都是以无状态的模式对接。即HTTP服务器不晓得本次申请和上一次申请是否有关联。所以就有了Session的引入,即服务端和客户端都保留一段文本,客户端每次发动申请都带着,这样服务器就晓得客户端是否发动过申请。 这样,就导致客户端频繁向服务端发出请求数据,服务端频繁的去数据库查问用户名和明码并进行比照,判断用户名和明码正确与否。而Session的存储是须要空间的,频繁的查询数据库给服务器造成很大的压力。 在这种状况下,Token利用而生。 Token是服务端生成的一串字符串,以作客户端进行申请的一个令牌。当客户端第一次拜访服务端,服务端会依据传过来的惟一标识userId,使用一些算法,并加上密钥,生成一个Token,而后通过BASE64编码一下之后将这个Token返回给客户端,客户端将Token保存起来(能够通过数据库或文件模式保留本地)。下次申请时,客户端只须要带上Token,服务器收到申请后,会用雷同的算法和密钥去验证Token。 最简略的Token组成:uid(用户惟一的身份标识)、time(以后工夫的工夫戳)、sign(签名,由Token的前几位+盐以哈希算法压缩成肯定长的十六进制字符串,能够避免歹意第三方拼接Token申请服务器)。 应用基于 Token 的身份验证办法,在服务端不须要存储用户的登录记录。大略的流程是这样的: 客户端应用用户名跟明码申请登录服务端收到申请,去验证用户名与明码验证胜利后,服务端会签发一个 Token,再把这个 Token 发送给客户端客户端收到 Token 当前能够把它存储起来,比方放在 Cookie 里或者数据库里客户端每次向服务端申请资源的时候须要带着服务端签发的 Token服务端收到申请,而后去验证客户端申请外面带着的 Token,如果验证胜利,就向客户端返回申请的数据APP登录的时候发送加密的用户名和明码到服务器,服务器验证用户名和明码,如果胜利,以某种形式比方随机生成32位的字符串作为Token,存储到服务器中,并返回Token到APP,当前APP申请时,但凡须要验证的中央都要带上该Token,而后服务器端验证Token,胜利返回所须要的后果,失败返回错误信息,让他从新登录。 对于同一个APP同一个手机以后只有一个Token;手机APP会存储一个以后无效的Token。其中服务器上Token设置一个有效期,每次APP申请的时候都验证Token和有效期。 上面这个例子,能够很好的了解: 『给我来份煎饼(token我是你对面摊卖烤冷面的,scope赊账)』『好』 『鸡蛋(token我是你对面摊卖烤冷面的,scope赊账)』『好』 『再加个鸡蛋(token我是你对面摊卖烤冷面的,scope赊账)』『好』 最终失去一份一般煎饼,外加两个鸡蛋…… 如果服务器重启或者因为其余理由,服务器端已保留token失落。那么用户需 要从新登录和认证。 『给我来份煎饼(token我是你对面摊卖烤冷面的)』『那个……我没见过你』 点击关注,第一工夫理解华为云陈腐技术~

August 7, 2020 · 1 min · jiezi

关于web:Web-开发必须掌握的三个技术TokenCookieSession

在Web利用中,HTTP申请是无状态的。即:用户第一次发动申请,与服务器建设连贯并登录胜利后,为了防止每次关上一个页面都须要登录一下,就呈现了cookie,Session。 CookieCookie是客户端保留用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种形式。Cookie存储的数据量无限,且都是保留在客户端浏览器中。不同的浏览器有不同的存储大小,但个别不超过4KB。因而应用Cookie实际上只能存储一小段的文本信息。 例如:登录网站,今输出用户名明码登录了,第二天再关上很多状况下就间接关上了。这个时候用到的一个机制就是Cookie。 SessionSession是另一种记录客户状态的机制,它是在服务端保留的一个数据结构(次要存储的的SessionID和Session内容,同时也蕴含了很多自定义的内容如:用户根底信息、权限信息、用户机构信息、固定变量等),这个数据能够保留在集群、数据库、文件中,用于跟踪用户的状态。 客户端浏览器拜访服务器的时候,服务器把客户端信息以某种模式记录在服务器上。这就是Session。客户端浏览器再次拜访时只须要从该Session中查找该客户的状态就能够了。 用户第一次登录后,浏览器会将用户信息发送给服务器,服务器会为该用户创立一个SessionId,并在响应内容(Cookie)中将该SessionId一并返回给浏览器,浏览器将这些数据保留在本地。当用户再次发送申请时,浏览器会主动的把上次申请存储的Cookie数据主动的携带给服务器。 服务器接管到申请信息后,会通过浏览器申请的数据中的SessionId判断以后是哪个用户,而后依据SessionId在Session库中获取用户的Session数据返回给浏览器。 例如:购物车,增加了商品之后客户端处能够晓得增加了哪些商品,而服务器端如何判断呢,所以也须要存储一些信息就用到了Session。 如果说Cookie机制是通过查看客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过查看服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建设的一份客户档案,客户来访的时候只须要查问客户档案表就能够了。 Session生成后,只有用户持续拜访,服务器就会更新Session的最初拜访工夫,并保护该Session。为避免内存溢出,服务器会把长时间内没有沉闷的Session从内存删除。这个工夫就是Session的超时工夫。如果超过了超时工夫没拜访过服务器,Session就主动生效了。 TokenHTTP申请都是以无状态的模式对接。即HTTP服务器不晓得本次申请和上一次申请是否有关联。所以就有了Session的引入,即服务端和客户端都保留一段文本,客户端每次发动申请都带着,这样服务器就晓得客户端是否发动过申请。 这样,就导致客户端频繁向服务端发出请求数据,服务端频繁的去数据库查问用户名和明码并进行比照,判断用户名和明码正确与否。而Session的存储是须要空间的,频繁的查询数据库给服务器造成很大的压力。 在这种状况下,Token利用而生。 Token是服务端生成的一串字符串,以作客户端进行申请的一个令牌。当客户端第一次拜访服务端,服务端会依据传过来的惟一标识userId,使用一些算法,并加上密钥,生成一个Token,而后通过BASE64编码一下之后将这个Token返回给客户端,客户端将Token保存起来(能够通过数据库或文件模式保留本地)。下次申请时,客户端只须要带上Token,服务器收到申请后,会用雷同的算法和密钥去验证Token。 最简略的Token组成:uid(用户惟一的身份标识)、time(以后工夫的工夫戳)、sign(签名,由Token的前几位+盐以哈希算法压缩成肯定长的十六进制字符串,能够避免歹意第三方拼接Token申请服务器)。 应用基于 Token 的身份验证办法,在服务端不须要存储用户的登录记录。大略的流程是这样的: 客户端应用用户名跟明码申请登录服务端收到申请,去验证用户名与明码验证胜利后,服务端会签发一个 Token,再把这个 Token 发送给客户端客户端收到 Token 当前能够把它存储起来,比方放在 Cookie 里或者数据库里客户端每次向服务端申请资源的时候须要带着服务端签发的 Token服务端收到申请,而后去验证客户端申请外面带着的 Token,如果验证胜利,就向客户端返回申请的数据APP登录的时候发送加密的用户名和明码到服务器,服务器验证用户名和明码,如果胜利,以某种形式比方随机生成32位的字符串作为Token,存储到服务器中,并返回Token到APP,当前APP申请时,但凡须要验证的中央都要带上该Token,而后服务器端验证Token,胜利返回所须要的后果,失败返回错误信息,让他从新登录。 对于同一个APP同一个手机以后只有一个Token;手机APP会存储一个以后无效的Token。其中服务器上Token设置一个有效期,每次APP申请的时候都验证Token和有效期。 上面这个例子,能够很好的了解: 『给我来份煎饼(token我是你对面摊卖烤冷面的,scope赊账)』『好』 『鸡蛋(token我是你对面摊卖烤冷面的,scope赊账)』『好』 『再加个鸡蛋(token我是你对面摊卖烤冷面的,scope赊账)』『好』 最终失去一份一般煎饼,外加两个鸡蛋…… 如果服务器重启或者因为其余理由,服务器端已保留token失落。那么用户需 要从新登录和认证。 『给我来份煎饼(token我是你对面摊卖烤冷面的)』『那个……我没见过你』 点击关注,第一工夫理解华为云陈腐技术~

August 7, 2020 · 1 min · jiezi

关于web:用RShiny生态快速搭建交互Web网页APP应用

原文链接:http://tecdat.cn/用shiny生态疾速搭建交互网页利用/ 用Shiny生态疾速搭建交互网页利用 辞别html,CSS,JS 什么是Shiny? Shiny包能够疾速搭建基于R的交互网页利用。对于web的交互,之前曾经有一些相干的包,不过都须要开发者相熟网页编程语言(html,CSS,JS)。 Shiny包的特点在于不须要理解网页语言,用纯R来搭建。生成的网页利用是动静交互、即时更新的。Shiny还提供了现成组件不便疾速在网页上展现数据、图表和模型。 通过交互网页利用,你能够 1) 不须要装置任何程序, 携带数据, 只有有网的中央, 你就能演示。(近程) 2) 只有装置一次, 能够多人应用, 能够让他人试用。(多用户) 3) 不必放心软件或者代码泄密, 能够管制用户应用工夫和权限。 (服务) 4) 通过交互式操作,在数据分析中缩小反复的工作如调整参数等。(交互) 组成 Shiny利用蕴含连个根本的组成部分:一个是用户界面脚本(a user-interface ),另一个是服务器脚本(a server )。 Shiny还有很多有用的控件,如下图所示: 根本框架 案例一:智能电表数据交互网页利用 局部实现性能: 1,当输出用户ID之后, 显示此用户的一天的所有用电量数据。 2,当输出用户ID之后, 显示用户当月及上个月的用电量。 3,当输出用户ID当前,显示一年的用电量(分为四个节令)。 案例二:银行贷款数据交互网页利用 局部实现性能: 1,实现机构贷款数据的读取。 2,浏览数据的根本详情。 3,对数据进行条件筛选根本可视化及输入。

August 6, 2020 · 1 min · jiezi

关于web:前端兼容性

第一种兼容在设置宽度的时候,子级的宽度大于父级的宽度时。 规范浏览器下,子级的宽度不会撑开父级 IE浏览器下会撑开对应的宽度 第二种兼容IE6中不能用margin的办法让元素显示在一行, 必须应用float的办法,让内容显示在一行。 第三种兼容嵌套问题:P标签不能包div 就是说P标签不能蕴含块标签 第四种兼容元素的最小高度 IE6中会主动给高度增加为19。因为IE6认为最小高度为19px,如果有余,主动补全 如果想要设置高度小于19px的,做到浏览器兼容, 必须增加overflow:hidden; 第五种兼容边框:不反对1px的边框,两厘米以上就反对了 规范浏览器中双边距:里 中 外三个别离是n px; IE浏览器中反对3px以上,并且平分n px。 第六种兼容margin:如果想让margin在IE中失常显示,须要调用haslayout,在父级用zoom=1; 调用 .box{ background: #f00; / 规范浏览器下失常显示 / / border: 1px solid #f00; / overflow: hidden; /ie触发 须要应用zoom:1; 触发haslayout / zoom:1; } .div{ width: 200px; height: 200px; background: #00f; margin: 100px; } 第七种兼容IE的双边距 失常在IE中设置margin不会呈现双边距的问题 如果div设置了float,就会呈现双边距 如果解决双边距问题,增加:display:inline; (双边距的意思是margin:100px;的时候显示200px) .box{ width: 200px; height: 200px; background: red; float: left; margin: 100px; display: inline; } ...

August 6, 2020 · 1 min · jiezi

关于web:看了这篇关于浏览器缓存你还有哪些疑问

【转载请注明出处】:https://blog.csdn.net/huahao1989/article/details/107730210 整个 Web 零碎架构在HTTP 协定之上, 利用 HTTP 的缓存机制不仅能够极大地缩小服务器负载, 更重要的是减速页面的载入,以及缩小用户的流量耗费。 疾速达到和易于拜访是 Web 与生俱来的个性, 其缓存机制也早已被服务器和浏览器厂商宽泛地实现, 咱们作为 Web 内容的作者何乐而不为呢? HTTP 缓存简介谈起 HTTP 缓存你首先想到的肯定是磁盘缓存,以及 304 状态码。 这是浏览器解决缓存的两种状况: 浏览器询问服务器缓存是否无效,服务器返回 304 批示浏览器应用缓存。资源依然处于有效期时,浏览器会间接应用磁盘缓存(在刷新时稍有不同)。 每个状态的具体阐明如下: 1、Cache-ControlCache-Control 在 HTTP 响应头中,用于批示代理和 UA 应用何种缓存策略。比方: no-cache为本次响应不可间接用于后续申请(在没有向服务器进行校验的状况下)no-store为禁止缓存(不得存储到非易失性介质,如果有的话尽量移除,用于敏感信息)private为仅 UA 可缓存public为大家都能够缓存。当Cache-Control为可缓存时,同时可指定缓存工夫(比方public, max-age:86400)。 这意味着在 1 天(60x60x24=86400)工夫内,浏览器都能够间接应用该缓存。 当然浏览器也有权随时抛弃任何一项缓存,因而这里可能有一致性问题。 2、Etag如果资源自身的确会随时产生改变,还用 Cache-Control 就会使用户看到的页面得不到更新。 但如果还心愿利用 HTTP 缓存,这就须要有条件的(conditional)HTTP 申请。 HTTP协定规格阐明定义ETag为“被申请变量的实体标记”,弱实体只有内容语义没变即可,强实体指字节必须完全一致,倡议应用弱实体。 如果响应体蕴含Etag字段,则浏览器在下次发送申请时会带 If-None-Match 头字段, 来询问服务器该版本是否依然可用。如果服务器发现该版本依然是最新的, 就能够返回 304 状态码批示 UA 持续应用缓存。相似服务器端返回的格局:ETag: W/"3ae83efccfc543bad6866e325cd8bfb9" 客户端的查问更新格局是这样的:If-None-Match:W/"3ae83efccfc543bad6866e325cd8bfb9" 如果ETag没扭转,则返回状态304。 3、Last-Modified在浏览器第一次申请某一个URL时,服务器端的返回状态会是200,内容是申请的资源,同时有一个Last-Modified的属性标记(HttpReponse Header)此文件在服务期端最初被批改的工夫,格局相似这样:Last-Modified:Tue, 24 Feb 2009 08:01:04 GMT ...

August 1, 2020 · 1 min · jiezi

关于web:页面加载性能之禁用documentwrite

如果你在控制台看到了以下信息,那么这篇文章对你而言应该会有帮忙: (index):34 A Parser-blocking, cross-origin script,https://paul.kinlan.me/ad-inject.js, is invoked via document.write().This may be blocked by the browser if the device has poor network connectivity.对于当初的web的开发者而言,document.write 应该是入门级的DOM API,但理论我的项目开发中,却很少应用。如果面试官问你为什么不去应用它,你会怎么答复? 很多人可能会说这个性能低,那么为什么低呢?先看个例子: document.write('<script src="https://paul.kinlan.me/ad-inject.js"></script>');在浏览器渲染页面之前,会去依据HTML标签解析DOM树。如果解析器遇到了 <script> 标签,则会进行DOM的解析,优先执行脚本。如果这个脚本动静插入了另一个脚本,则解析器会期待另一个脚本下载实现到执行实现,延后了页面渲染的工夫。 对于网络环境差的,比方 2G 的用户,通过 document.write 写入的新的脚本,可能会导致页面渲染的工夫延后数十秒,用户可能就因而放弃了持续期待。基于Chrome的数据报告显示,那些通过 document.write 插入第三方脚本的页面在2G网络下比个别页面慢2倍。 Chrome从55版本开始就开始选择性的干涉这类写法,当同时满足以下条件的时候,会禁止脚本执行: 用户处于低速网络下,比方2G(今后可能会把该条件扩大成3G以及低速wifi)document.write 位于最高层级的document上(如果位于iframe中,因为不会阻止主页面渲染,所以不会干涉)document.write 中的脚本是解析阻塞型的(如果带了 async 或者 defer 属性,则不会干涉)脚本与页面不在同一个站点下,Chrome不会干涉eTLD+1级别的脚本,如: js.example.com 和 www.example.com脚本不在HTTP Cache中,如果在缓存中,仍然会执行,因为不会收回HTTP申请页面的申请不是重载。如果用户手动从新重载,Chrome还是会执行脚本个别第三方库会用这种写法来加载脚本,不过庆幸的是,大部分第三方库都反对async加载,这样就不会阻塞残余内容的展示了。 如何修复这类问题?禁用 document.write 插入新的脚本即可,没有比这更好的计划,如果必须应用,则加上 async 属性。 当你的站点受影响之后,如何检测?有6条之多的规定须要查看,对你来说可能太过简单,有没有更好的办法去检测? 检测用户是不是2G网络想要晓得多少用户受影响,只须要看看多少用户是2G网络,能够应用 Network Information API 来检测,而后将检测后果发到统计零碎或者RUM收集零碎: if(navigator.connection && navigator.connection.type === 'cellular' && navigator.connection.downlinkMax <= 0.115) { // Notify your service to indicate that you might be affected by this restriction.}捕捉开发者工具中的提醒如果在应用 document.write 的时候,只满足了2-5的条件,你会看到上面这种提醒: ...

July 30, 2020 · 1 min · jiezi

关于web:页面加载性能之禁用documentwrite

如果你在控制台看到了以下信息,那么这篇文章对你而言应该会有帮忙: (index):34 A Parser-blocking, cross-origin script,https://paul.kinlan.me/ad-inject.js, is invoked via document.write().This may be blocked by the browser if the device has poor network connectivity.对于当初的web的开发者而言,document.write 应该是入门级的DOM API,但理论我的项目开发中,却很少应用。如果面试官问你为什么不去应用它,你会怎么答复? 很多人可能会说这个性能低,那么为什么低呢?先看个例子: document.write('<script src="https://paul.kinlan.me/ad-inject.js"></script>');在浏览器渲染页面之前,会去依据HTML标签解析DOM树。如果解析器遇到了 <script> 标签,则会进行DOM的解析,优先执行脚本。如果这个脚本动静插入了另一个脚本,则解析器会期待另一个脚本下载实现到执行实现,延后了页面渲染的工夫。 对于网络环境差的,比方 2G 的用户,通过 document.write 写入的新的脚本,可能会导致页面渲染的工夫延后数十秒,用户可能就因而放弃了持续期待。基于Chrome的数据报告显示,那些通过 document.write 插入第三方脚本的页面在2G网络下比个别页面慢2倍。 Chrome从55版本开始就开始选择性的干涉这类写法,当同时满足以下条件的时候,会禁止脚本执行: 用户处于低速网络下,比方2G(今后可能会把该条件扩大成3G以及低速wifi)document.write 位于最高层级的document上(如果位于iframe中,因为不会阻止主页面渲染,所以不会干涉)document.write 中的脚本是解析阻塞型的(如果带了 async 或者 defer 属性,则不会干涉)脚本与页面不在同一个站点下,Chrome不会干涉eTLD+1级别的脚本,如: js.example.com 和 www.example.com脚本不在HTTP Cache中,如果在缓存中,仍然会执行,因为不会收回HTTP申请页面的申请不是重载。如果用户手动从新重载,Chrome还是会执行脚本个别第三方库会用这种写法来加载脚本,不过庆幸的是,大部分第三方库都反对async加载,这样就不会阻塞残余内容的展示了。 如何修复这类问题?禁用 document.write 插入新的脚本即可,没有比这更好的计划,如果必须应用,则加上 async 属性。 当你的站点受影响之后,如何检测?有6条之多的规定须要查看,对你来说可能太过简单,有没有更好的办法去检测? 检测用户是不是2G网络想要晓得多少用户受影响,只须要看看多少用户是2G网络,能够应用 Network Information API 来检测,而后将检测后果发到统计零碎或者RUM收集零碎: if(navigator.connection && navigator.connection.type === 'cellular' && navigator.connection.downlinkMax <= 0.115) { // Notify your service to indicate that you might be affected by this restriction.}捕捉开发者工具中的提醒如果在应用 document.write 的时候,只满足了2-5的条件,你会看到上面这种提醒: ...

July 30, 2020 · 1 min · jiezi

关于web:页面加载性能之PRPL模式

PRPL是一种让网页加载变得可交互、更疾速的模式,蕴含以下四个: Push (或者 preload): 给用户推送最重要的资源Render: 尽快的渲染最初始的路由Pre-cache: 提前缓存残余的资源Lazy load: 懒加载其余路由或者主要资源本文咱们将学习这些技术的综合使用,当然也能够独自应用。 预加载重要资源 (Preload)Preload 是一个申明性质的fetch request,告知浏览器要尽可能快的申请到该资源。能够通过以下形式预加载重要资源,应用 <link> 标签,带上 rel="preload" 的属性,放在 <head> 标签中。 <link rel="preload" as="style" href="css/style.css">浏览器会给这个资源分配更高的优先级,而且不影响 window.onload 的事件执行。 尽可能快的渲染初始路由 (Render)如果你的资源影响了你的 First Paint,Lighthouse会给你一个正告。 Lighthouse倡议,应用重要的资源应用inline的内嵌的形式,而其余资源能够采纳 async 的形式异步加载。这样能够无效地缩小与服务器的交互次数,防止渲染被阻塞,不过也有个毛病,就是这些代码无奈被独自缓存,也不利于开发保护。 另一种形式晋升首屏的速度就是服务端渲染 (server-side render) 你的初始路由。这样能够给你的用户立马展示内容,其余资源也仍然会下载、解析并执行。但这样会大大的加大HTML文件的无效负载 (payload),影响页面可交互的工夫 (Time to Interactive),因为用户看到的页面只是内容的展现,等js和css全副执行完,load事件回调结束,页面才能够交互。 没有一个繁多的正确的答案来缩小首屏工夫,抉择内联资源或者是服务端渲染,还是看对你的网页带来的收益与毛病的一个衡量。 提前缓存资源 (Pre-cache)通过激活一个代理,service worker 能够帮你优先从缓存中获取资源,这不仅仅是利用在离线上,用户第二次拜访的速度也能大大晋升。 能够应用google提供的三方库 workbox 来将 service worker 集成到你的我的项目中。想要理解更多相干的,能够参考:https://web.dev/service-worke... 。 懒加载 (Lazy load)如果你的网站加载了太多的资源,Lighthouse会提醒你: 这包含所有类型的资源,但特地大的 JavaScript 会耗费浏览器很多工夫去解析和执行,Lighthouse会有另一种提醒: 为了首次加载更小的JavaScript,能够尝试拆分bundle,按需加载剩下的资源。 如果你胜利的拆分了bundle,给重要的chunk加上preload,浏览器会进步下载的优先级。 在js都拆分了之后,懒加载也都加上了,你可能还会遇到上面的问题: 如果你的网页上有很多图片,请把屏幕之外的图片都延后加载。详情能够参考:https://web.dev/use-lazysizes... 总结你应该曾经对PRPL的模式有了肯定的理解,要记住的是并非所有技术都要去施行,以下任何方面的优化对性能都有显著的晋升: Push (或者 preload): 给用户推送最重要的资源Render: 尽快的渲染最初始的路由Pre-cache: 提前缓存残余的资源Lazy load: 懒加载其余路由或者主要资源参考https://developers.google.com...https://web.dev/apply-instant...

July 27, 2020 · 1 min · jiezi

关于web:页面加载性能之video替换GIF

当咱们的网站须要一张动态图的时候,大部分人脑海中第一印象是GIF,当然也有会想到CSS3,通过设置逐帧动画来实现,不过这样的动画在用户的眼里还是不够晦涩,所以个别开发还是会抉择GIF,但GIF自身过大,如下图: 这是加载性能的其中一项,咱们能够简略几个步骤就能让性能失去很大的晋升,通过将GIF转换成video,就能省去很大的带宽。 首先是检测Lighthouse 是咱们的最罕用的检测伎俩,如果你的页面呈现了这类GIF,检测报告会告知你倡议的优化项,如下: 创立MPEG格局video有不少办法能够将GIF转换成video,FFmpeg 是咱们用的比拟多的一款。以下命令能够将 my-animation.gif 转换成MPEG格局的video: ffmpeg -i my-animation.gif -b:v 0 -crf 25 -f mp4 -vcodec libx264 -pix_fmt yuv420p my-animation.mp4创立WebM格局的videoMP4自1999年就曾经存在了,而WebM是2010年才新呈现的一种video的格局,它比MP4体积更小,然而并非所有浏览器都反对。以下命令能够将 my-animation.gif 转换成WebM格局的video: ffmpeg -i my-animation.gif -c vp9 -b:v 0 -crf 41 my-animation.webm比拟差别下图是各种格局的大小比照: 在下面的例子中,GIF格局是3.7M,转换成MP4之后,只剩551K,转换成WebM之后,只剩341K。 用video替换GIFGIF较之于video,须要以下三个特色: 自动播放循环播放静音这些 <video> 也都反对,代码如下: <video autoplay loop muted playsinline></video>下面的这个 <video> 标签会自动播放、静音、内嵌播放(非全屏),体现的就跟GIF一样。 最初咱们给 <video> 配上 <source> 源,这样如果浏览器不反对WebM,就会fallback到MP4。 <video autoplay loop muted playsinline> <source src="my-animation.webm" type="video/webm"> <source src="my-animation.mp4" type="video/mp4"></video>总结平时我的项目中可能GIF用的不多,但一旦有应用场景,尽可能的优先思考video,因为能够极大的节俭带宽,晋升加载性能。 参考https://web.dev/replace-gifs-...

July 25, 2020 · 1 min · jiezi

关于web:页面加载性能之WebP在项目中的应用

我的项目中的动态图片,个别有两种应用形式: HTML中的 <img> 标签CSS中的 background-image 属性尽可能的应用CSS的形式去加载图片,当然如果你依赖图片自身的宽低等比缩放的个性,还是使HTML的形式。 框架本文将以vue-cli 3.0脚手架搭建的我的项目为例。 转换工具咱们抉择的是 Imagemin,版本抉择6.1.0,因为7.0.0之后的版本在windows上有兼容性问题,目前还未修复。 npm install imagemin@6.1.0 --save-devnpm install imagemin-webp --save-dev转换脚本咱们的转换脚本须要反对全量转换,单个目录转换,以及单文件转换三种模式,品质默认抉择75,理论测下来发现,75的品质跟100的品质肉眼根本看不出来区别,以下是脚本代码的实现: /** * 脚本位于tools目录,即 ./tools/webp.js * 我的项目的源码均位于src目录,即 ./src/ * 能够自行调整代码中的局部目录配置 */const imageMin = require('imagemin')const imageMinWebp = require('imagemin-webp')const path = require('path')const fs = require('fs')let quality = 75// 依据本身我的项目调整let rootDir = path.join(__dirname, '../src') async function loop (dir) { await imageMin([path.join(dir, '*.{jpg,png}')], dir, { plugins: [ imageMinWebp({ quality: quality }) ] }) console.log(dir) let res = fs.readdirSync(dir, { withFileTypes: true }) for (let i = 0, length = res.length; i < length; i++) { if (res[i].isDirectory()) { await loop(path.join(dir, res[i].name)) } }}if (process.argv.length >= 3) { if (process.argv[3]) { quality = process.argv[3] } // 依据本身我的项目调整 let dir = path.join(__dirname, '../', process.argv[2]) const stats = fs.statSync(dir) if (stats.isDirectory()) { rootDir = dir await loop(rootDir) console.log('completed!') } else if (stats.isFile()) { await imageMin([dir], path.dirname(dir), { plugins: [ imageMinWebp({ quality: quality }) ] }) console.log(dir) console.log('completed!') }} else { await loop(rootDir) console.log('completed!')}转换全副图片: ...

July 25, 2020 · 2 min · jiezi

关于web:页面加载性能之WebP在项目中的应用

我的项目中的动态图片,个别有两种应用形式: HTML中的 <img> 标签CSS中的 background-image 属性尽可能的应用CSS的形式去加载图片,当然如果你依赖图片自身的宽低等比缩放的个性,还是使HTML的形式。 框架本文将以vue-cli 3.0脚手架搭建的我的项目为例。 转换工具咱们抉择的是 Imagemin,版本抉择6.1.0,因为7.0.0之后的版本在windows上有兼容性问题,目前还未修复。 npm install imagemin@6.1.0 --save-devnpm install imagemin-webp --save-dev转换脚本咱们的转换脚本须要反对全量转换,单个目录转换,以及单文件转换三种模式,品质默认抉择75,理论测下来发现,75的品质跟100的品质肉眼根本看不出来区别,以下是脚本代码的实现: /** * 脚本位于tools目录,即 ./tools/webp.js * 我的项目的源码均位于src目录,即 ./src/ * 能够自行调整代码中的局部目录配置 */const imageMin = require('imagemin')const imageMinWebp = require('imagemin-webp')const path = require('path')const fs = require('fs')let quality = 75// 依据本身我的项目调整let rootDir = path.join(__dirname, '../src') async function loop (dir) { await imageMin([path.join(dir, '*.{jpg,png}')], dir, { plugins: [ imageMinWebp({ quality: quality }) ] }) console.log(dir) let res = fs.readdirSync(dir, { withFileTypes: true }) for (let i = 0, length = res.length; i < length; i++) { if (res[i].isDirectory()) { await loop(path.join(dir, res[i].name)) } }}if (process.argv.length >= 3) { if (process.argv[3]) { quality = process.argv[3] } // 依据本身我的项目调整 let dir = path.join(__dirname, '../', process.argv[2]) const stats = fs.statSync(dir) if (stats.isDirectory()) { rootDir = dir await loop(rootDir) console.log('completed!') } else if (stats.isFile()) { await imageMin([dir], path.dirname(dir), { plugins: [ imageMinWebp({ quality: quality }) ] }) console.log(dir) console.log('completed!') }} else { await loop(rootDir) console.log('completed!')}转换全副图片: ...

July 25, 2020 · 2 min · jiezi

关于web:页面加载性能之使用图片CDN

什么是图片CDN?与传统CDN的区别在于,它是专门为图片做优化的,通常蕴含缩放、格局转换等。你能够把它看成是一个API,通过传入尺寸、品质、格局等参数,获取到对应的图片内容。这也使得咱们在应用上十分不便,实用于多种不同的场景。 图片CDN不同于构建脚本,它不须要提前创立出多种不同格局的图片。和构建脚本相比,图片CDN更适宜大量的图片场景,而非固定数量的图片,比方你的站点是为摄影爱好者服务,用户上传的图片,就能够应用图片CDN了。 图片CDN的通用URL格局不同的图片CDN会有不同的URL格局,但其基本功能基本一致,大抵能够用下图来形容: 源(Origin)图片CDN能够用你本人的域名,当然个别也会提供收费的通用域名。最好还是应用本人的域名,这样今后如果要更换CDN服务商,也不必去批改URL地址了。 图片名(Image)通常也会应用残缺的URL地址作为图片名称,如:https://my-site.example-cdn.com/https://flowers.com/daisy.jpg/quality=auto,这个URL地址会去获取并优化原地址的图片 https://flowers.com/daisy.jpg。 当然你也能够通过调用API间接将图片上传到CDN服务器。 平安码(Security key)次要为了避免歹意用户任意批改参数,保障链接的唯一性。图片CDN也会帮你去跟踪这些歹意用户。 转换(Transformations)图片CDN会提供十种、甚至百种不同的图片转换形式,这些转换条件都定义在URL的GET参数里,多种形式同时应用也是能够的。通用的有大小、尺寸、格局和压缩比。 有些图片CDN会提供主动模式,能够主动抉择最优的转换,比方这个浏览器反对WebP,则主动转换成WebP格局,个别会判断以下的条件: 客户端指标(viewport宽度、DPR、图片宽)Save-Data 申请头User-Agent 申请头Network Information API如果你的网络不是很晦涩,图片CDN会主动调整返回的图片大小。 图片CDN分类个别分为两类:自营和第三方托管 自营CDN对于定制本人的技术架构的开发者而言,是个不错的抉择。 Thumbor 是目前惟一一个自营的图片CDN,开源而且收费,但性能相比于一些商业化的图片CDN要少一些,文档也无限。 Wikipedia、Square 和 99designs这三个网站目前应用的是 Thumbor。具体装置过程能够参考:https://web.dev/install-thumbor 。 第三方图片CDN个别都是云服务,免费,但功能强大,这些也都是商业秘密,非开源,对接也很不便。个别都是明码标价,也会提供收费试用。 如何抉择图片CDN?看本身的状况,如果不须要那些高级性能,自营的CDN就能够了,如果钱足够,抉择第三方是适合的,因为你没有那么多精力去保护这个。 总结图片CDN功能强大,能够帮咱们更好的治理图片和展现,相比于构建脚本,它能够服务于用户上传的图片,实用于后盾对图片的治理。对开发者而言,存储老本、带宽老本都能节俭一大笔。对用户而言,体验也是定制化的,十分不错的性能晋升。 参考https://web.dev/image-cdns/https://developer.mozilla.org...https://developer.mozilla.org...

July 23, 2020 · 1 min · jiezi

关于web:页面加载性能之使用正确的图片尺寸

咱们总是会遗记放大图片尺寸,间接利用到我的项目中。这种图片看上去很失常,但实际上既节约了用户的流量,也影响了页面性能。 找出不正确尺寸的图片Lighthouse是首选,执行一下Performance Audit,依据后果能够找到须要调整尺寸的图片列表。 确定正确的图片尺寸此处提供了2种策略:上策和上策。两者都能晋升性能,上策须要多花工夫去了解和施行,但带来的体验和性能的晋升是非常明显的。上策则是能够很快施行的计划。 略微理解下CSS的单位CSS给HTML元素的尺寸定义了两类单位: 相对单位: 在所有设施上展现的尺寸都是固定不变的,如: px等。绝对单位: 会有一个参照物,绝对于这个来设置的尺寸,如: em,rem,vw,vh等。上策依据图片尺寸的单位: 绝对单位: 调整图片大小至所有设施均可实用,如果是手机网页,个别以iphone6的屏幕大小为准,375的设施宽度,筹备图片的时候用750px的宽度。相对单位: 按图片的理论尺寸来调整,依据应用你的产品的用户高分屏的占比,如果3x的用户比拟多,就筹备3x图,如果2x比拟多,则筹备2x图。上策依据图片尺寸的单位: 绝对单位: 应用响应式图片,依据不同的屏幕尺寸,提供不同尺寸的图片,之后的文章会介绍。相对单位: 应用 srcset 和 sizes 属性,在不同DPI的屏幕上提供不同尺寸的图片,以保障高清度。调整图片大小ImageMagick 是首选的CLI工具,对开发而言,这个比GUI的工具效率要高很多。 以下命令能够将图片调整成原始大小的25%: convert flower.jpg -resize 25% flower_small.jpg以下命令能够将图片调整成200*100的固定大小: # macOS/Linuxconvert flower.jpg -resize 200x100 flower_small.jpg# Windowsmagick convert flower.jpg -resize 200x100 flower_small.jpg如果你要同时转换多个图片,能够写一个脚本来执行CLI。 验证成果每次调整完尺寸,都用Lighthouse来测试,防止脱漏。 总结偷懒的做法是,所有设施上都采纳2x图片,也就是上策,破费工夫不多,但这种优化还是会对一些3x的DPI手机屏幕造成稍微的含糊,如果是4x的DPI,则会特地含糊。如果有工夫的话,还是应用上策来保障对每一个用户都提供最优的性能和体验。 参考https://web.dev/serve-images-...https://web.dev/serve-respons...

July 22, 2020 · 1 min · jiezi

关于web:页面加载性能之选择正确的图片格式

首先要问一个问题,加载这一张图片是不是达到了你谋求的成果?好的设计往往是谋求简略,放弃最好的性能。对于一个要加载很多资源的页面来说,如果能去掉一个图片资源,对性能的晋升是很直观的。当然,有的图片胜过一言半语,是否应用图片还是取决于你本人。 而后你要思考的是,现有的技术是不是能够用更高效的形式满足你的要求。 CSS成果(如暗影、突变),以及CSS动画,是否能够发明出你想要的成果,用以取代图片。长处是:放大无损,体积小。自定义字体 能够让你应用一些很漂亮的字体,同时还能反对选中、搜寻、扭转字体大小,可用性更高。如果你发现你的图片内蕴含文本,请好好思考下用户体验,不能搜寻,不能选中,也不能放大,对于高分屏,更是难兼容。自定义字体能够很好地帮你解决这类问题。 抉择正确的图片格式如果图片的确是必须的,你要好好思考用何种格局的图片。 左图是矢量图,右图是光栅图。 矢量图 用线条、点、多边形绘制的图形光栅图 用一个个像素点拼接起来的图片每种格局的图片都有其特点。矢量图个别用于简略的几何图形,如logo、文本和图标,劣势是高清、缩放无损、体积小。 当图片的形态趋于简单,如照片,你用大量的svg标签堆砌进去,看上去也不实在,矢量图的局限性就在这。这时能够考虑一下光栅图,如png、jpg或者webp。 光栅图的毛病也很显著:缩放含糊、体积过大、针对不同分辨率须要提供不同的尺寸。 什么是高分屏?像素点分为两类:CSS像素和设施像素。一个CSS像素个别对应一个设施像素,也可能对应多个像素。设施像素越多,看上去更细腻,给用户的感觉是不一样的。 高DPI屏幕尽管展现的更好,但却须要提供的图片尺寸也更大。在这点上,矢量图占优,但矢量图的制作老本也绝对较高。 因为光栅图是基于像素的,也意味着图片尺寸越大,文件大小越大,如下表: 屏幕分辨率像素点个数未压缩的文件大小1x100 * 100 = 10000400002x100 100 4 = 400001600003x100 100 9 = 90000360000这不是直线增长,而是平方的增长。 有以下两种形式能够优化: 尽可能应用矢量图,只有能做到的状况如果切实是须要应用光栅图,则应用响应式的图片(待后续文章),针对不同分辨率利用不同尺寸不同类型的光栅图的特点格局透明度动画浏览器反对PNG是否所有JPEG否否所有WebP是是所有古代浏览器png和jpeg是两个比拟传统的图片格式,利用宽泛,古代浏览器有一种新的格局webp,领有更高的压缩比,提供了更丰盛的反对。 后续会独自一篇文章来讲述webp的理论利用。 在应用老的图片格式的时候,有以下几点要思考: 是否须要动画?用 video 标签替。 为什么不必 gif ?gif 只有最高256位色,实现同样的动画,比video要大得多。是否想在高分屏上保留细节?应用 png。 png 不反对任何有损压缩,能放弃最高品质,但同样的体积会更大,视状况而用。如果图片是一系列多边形的组合,思考用 svg 。如果图片上蕴含文本,思考应用自定义字体。如果你展现的是照片、截图或者相似的图片?应用 jpeg 。 jpeg 能够组合应用有损和无损压缩来缩小文件大小,能够尝试不同的品质压缩来抉择一个最小又最合适的。总结如果你是在webview中应用图片,尽可能的抉择webp。Facebook以及其余大厂在app和服务器之间的图片传输上,都会抉择webp,能够节俭很大一笔开销,存储老本和带宽老本。 参考https://web.dev/choose-the-ri...

July 20, 2020 · 1 min · jiezi

关于web:页面加载性能之LieFi

当你的设施处于有网络的状况下,拜访网页、关上App都很顺畅,能够随时获取到你想要的信息。 但有时候你还是会处于断网的状态,为了让App或者网站能在离线状态下应用,咱们常常会把一些数据存在设施本地,这样用户仍然能够体验良好。 介于 online 和 offline 之间,有这么一种状态: Lie-Fi。 Lie-Fi 中文能够翻译成欺骗性网络,你的设施的确连上了无线网,但你仍然不能关上网页,置信不少开发者被本人的领导这样吐槽过:"咱们网站怎么打不开了,我wifi都连着呢"。试想一下你的领导当初处于办公室的关闭环境、或者其余关闭环境,wifi的热点信号弱、或者的确是宽带网络出了问题,你会进入这样的一种状态,一张图就能了解: 的确有一些办法能够来应答这种状况 一些提醒1. 检测 Lie-Fi你的设施坑骗了你,尽管连上了网,但却上不了网。你会如何去检测?又会如何告知你的用户呢? 如果你在开发混合式App,能够尝试一下 Offline.js。为了检测断网的状况,它会定时的去ping服务器,检测连贯是否失常。 2. 设置短的超时工夫向服务器发送申请的时候,你不必设置10秒或者更长的超时工夫,个别用户期待3秒,就可能会来到页面了,依据本身业务状况,尽可能的设置短的超时工夫。如果超时了,也要给用户展现一些有意义的信息。不要 像上面这样: 3. 设置好空状态在你的设施与服务器交互的过程中,用户会看到什么?你要思考是让他看0或者空的列表,就太蹩脚了。 如果一个手机银行的App,此时遇到了 Lie-Fi,可能会展现成如下图所示: 我钱哪去了?钱并没有清空,只是被 Lie-Fi坑骗了。尝试一下去掉0,展现空的信息,用户的体验会更好: 宁愿留空,也不要展现错的信息一些教训1. 检测 Lie-Fi 节约钱服务器的带宽是无限的,如果破费大量的带宽让用户来ping服务器,只为了做检测,对服务器的带宽耗费是有点太大了。 思考下针对有钱人提供这样的服务,比方vip用户,或者某些带宽便宜的的地区,或者不做检测。 2. 给申请做优先级排序毫无意义有时候 Lie-Fi 的确是十分慢的连贯。如果你一个屏幕上展现了很多种信息,你可能会思考按信息的重要性来给发动的申请做排序,如下图: 看上去很不错,但实际上是没成果的。 扭转申请收回去的程序,并不意味着你收到响应的程序也是这样。 三种可能的起因: 申请到达服务器的程序不肯定是同样的排序每个申请的解决工夫不一样响应的数据大小也不一样如何在咱们的站点测试 Lie-Fi 的环境呢?chrome开发者工具提供了这个性能,容许你去模仿不同的网络环境,能够使低带宽,也能够是离线。 总结无效的利用工具,再联合咱们的站点进行多种网络的测试,确保给用户提供了最佳的体验,即便是这种很差的网络状况下。 参考https://www.outsystems.com/bl...https://developers.google.com...

July 19, 2020 · 1 min · jiezi

关于web:页面加载性能之感知真实世界

尽管咱们能够通过开发者工具以及lighthouse等工具来查看网站的加载状况,并按之前咱们说的那些计划做好了优化,但真正用户关上是否真的如预期个别快,咱们不得而知。始终以来咱们都以实验室数据为测试的根据,这些不能代表现场数据,即实在用户的体验。 RUM(Real User Monitoring)因而而诞生。RUM依赖于浏览器提供的API来收集实在用户的性能数据,次要蕴含2个规范文档,Navigation Timing API 和 Resource Timing API,这两个API都是基于 High Resolution Time 的标准定制的。 本文档将疏导你去意识这些API提供的数据,更好的把握RUM。 浏览器中的网络申请Navigation和Resource Timing之间有局部交加,但两者收集的数据指标还是不一样的。 Navigation Timing 收集了HTML文档的性能指标Resource Timing 收集了文档依赖的资源的性能指标,如:css,js,图片等等先在控制台尝试执行一下以下代码: // Get Navigation Timing entries:performance.getEntriesByType("navigation");// Get Resource Timing entries:performance.getEntriesByType("resource");getEntriesByType 接管一个字符串参数,示意你要获取的条目类型。想要获取Navigation Timing的条目,则传 navigation,另一个则是传 resource。以上代码执行后果,能够看到相似下方的对象构造: { "connectEnd": 152.20000001136214, "connectStart": 85.00000007916242, "decodedBodySize": 1270, "domComplete": 377.90000007953495, "domContentLoadedEventEnd": 236.4000000525266, "domContentLoadedEventStart": 236.4000000525266, "domInteractive": 236.2999999895692, "domainLookupEnd": 85.00000007916242, "domainLookupStart": 64.4000000320375, "duration": 377.90000007953495, "encodedBodySize": 606, "entryType": "navigation", "fetchStart": 61.600000015459955, "initiatorType": "navigation", "loadEventEnd": 377.90000007953495, "loadEventStart": 377.90000007953495, "name": "https://example.com/", "nextHopProtocol": "h2", "redirectCount": 0, "redirectEnd": 0, "redirectStart": 0, "requestStart": 152.50000008381903, "responseEnd": 197.80000008177012, "responseStart": 170.00000004190952, "secureConnectionStart": 105.80000001937151, "startTime": 0, "transferSize": 789, "type": "navigate", "unloadEventEnd": 0, "unloadEventStart": 0, "workerStart": 0}下面的数据看起来很晕,但只有记住一点:你在开发者工具中 Network 看到的 waterflow ,就是用这些数据画进去的。你也能够用这些数据绘制相似的图,用一些工具就能做到,Waterfall 或者 Performance-Bookmarklet 。 ...

July 18, 2020 · 3 min · jiezi

关于web:页面加载性能之HTTP缓存

当用户拜访一个站点的时候,所有的资源都必须有一个起源。所有的文本、图片、款式、脚本等资源都必须被浏览器接管到能力展示和执行。开发者能够给浏览器提供抉择,抉择是从哪里获取这些资源,这样能够极大地晋升页面加载速度。 页面第一次加载完之后,浏览器把这些资源存在了 HTTP Cache 中。第二次关上这个页面的时候,浏览器会优先从硬盘中查找这些资源的缓存,比从服务器去下载要更快一些。 尽管HTTP缓存是由 Internet Engineering Task Force (IETF) specifications 定制的标准,然而浏览器能够领有多种不同的缓存,它们在获取、存储、保留内容的形式上也各不相同。你能够浏览这篇文章来理解这些缓存的区别 A Tale of Four Caches。 当然第一次拜访站点没有缓存。第二次拜访也可能没有缓存,因为用户可能会手动革除了缓存,也可能是强制刷新。依然有很大一部分用户可能享受到缓存带来的飞速关上体验,最大化利用缓存能给让这批用户关上速度有质的飞跃。 开启缓存咱们能够依据资源的改变频率来决定缓存的形式。像站点logo可能基本上不会变动,而脚本可能隔几天就变一次。你须要去分辨哪些资源是动静的,哪些又是动态的,这样能力针对性的开启缓存,或者决定缓存的无效工夫。 缓存头(Cache Headers)目前有两种次要的缓存头,cache-control 和 expires,能够用来定义资源的缓存个性。cache-control可能会相对而言更现代化、更灵便。这两者也能够同时应用。 缓存头是服务器层设置的,nginx和apache都有本人的语法。 Cache-control以下是apache的.htaccess文件的配置: <filesMatch ".(ico|jpg|jpeg|png|gif)$"> Header set Cache-Control "max-age=2592000, public"</filesMatch>针对图片文件,咱们个别设置一个月的过期工夫 <filesMatch ".(css|js)$"> Header set Cache-Control "max-age=86400, public"</filesMatch>cache-control有一系列的配置项,也被称为指令,用来告知浏览器如何解决缓存。以下是局部罕用的指令,更多内容能够看 Mozilla Developer Network。 no-cache: 优先从服务器获取资源,如果服务器返回304,告知没有批改,则利用本地缓存no-store: 永远不缓存,罕用于一些敏感信息,常常变动public: 能够被浏览器和中间层服务器缓存private: 只能被浏览器缓存,中间层服务器不能缓存max-age: 定义了内容能够被缓存的无效工夫,秒级的整数,如:86400(一天)Expires Caching你能够针对不同类型的资源定义不同的过期工夫,以下是.htaccess文件的配置: ## EXPIRES CACHING ##ExpiresActive OnExpiresByType image/jpg "access plus 1 year"ExpiresByType image/jpeg "access plus 1 year"ExpiresByType image/gif "access plus 1 year"ExpiresByType image/png "access plus 1 year"ExpiresByType text/css "access plus 1 month"ExpiresByType application/pdf "access plus 1 month"ExpiresByType text/x-javascript "access plus 1 month"ExpiresByType application/x-shockwave-flash "access plus 1 month"ExpiresByType image/x-icon "access plus 1 year"ExpiresDefault "access plus 2 days"## EXPIRES CACHING ##注意事项Expire Caching最大不能超过1年,max-age也是一样,否则会造成永恒缓存。 ...

July 17, 2020 · 1 min · jiezi

页面加载性能之图片内容

图片占了网站大略60%-85%的一个带宽,本文档次要解决图片加载的耗时问题。 移除不必要的图片首先要思考的是,如果没有这个图片,是否会影响用户体验?如果不影响,放后续加载。 如果图片既不是为了烘托文本,也不是为了给用户带来视觉上的体验,对用户而言并非有意义的信息,则移除。 最快的图片加载,就是不去加载它。 抉择更优的图片类型PNG用来展现有透明度的图片。 JPG用来展现个别的图片。 GIP用来展现动画图片。 个别抉择更小的JPG。 移出图片摘要信息(Metadata)个别手机或者数码相机拍摄的图片,都会携带一些摘要信息,比方何时何地?用什么设施?曝光度如何? 这些信息有时候占据了10%的体积。 能够用以下工具对其进行移除: http://www.verexif.com/en/ 调整图片大小基于应用调整实际上用到的可能只有200 200,这时就不须要去加载一个1000 1000的图片。 只有在真正须要的时候,去加载对应尺寸的图片。 缩略图就该加载缩略图,而非原图。 裁剪图片,展现重点内容对一张图片来说,有重点和非重点的划分,重点是你想让用户看的区域,针对这部分区域能够裁剪进去。 升高图片品质一张图片原始大小是227k,此时如果将品质升高至80%,只剩60k的大小。 针对不须要高分辨率的图片,能够适当升高图片品质,来缩小图片体积,就如同你不会放大一个人的照片,来看他的毛孔粗细 相干工具:paint.netXNConvertImageOptimResizeItPicResizeGimp压缩图片放弃品质不变的状况下,用技术手段做图片压缩,罕用网站: https://tinypng.com/ 总结图片内容是次要优化空间,不仅容易施行,而且对网站的加载速度有显著晋升。 参考https://developers.google.com...

July 15, 2020 · 1 min · jiezi

页面加载性能之文本内容

文本内容次要蕴含:HTML,CSS,JavaScript。 在web页面里,每个字符都是要从服务器获取的,本文档次要讲述如何晋升文本内容的加载速度。 拆散开发和线上环境如果你为了减小资源大小采取了一些措施,而影响到可读性,肯定要记住当你间接批改线上代码的时候,之后可能无奈了解当初为什么这么改。 所以经常性,咱们会把开发和线上两个环境拆散,开发环境是可读性良好的代码,线上则是采取了优化措施之后的可读性差的代码。 放大代码体积一个简略无效的办法就是移出多余的空格和不必要的字符,尽管咱们读起来会吃力,但浏览器能看懂就行。 HTML,CSS,JavaScript都能够利用这种形式。 常见的工具Minifier: 在线压缩JavaScript和CSS,通过复制和黏贴的形式HTML Minifier: 同上Node module for GruntNode module for GulpNode module for HTML Minifier压缩文本资源罕用的是gzip的压缩,浏览器广泛支持,能够节俭近70%的体积。 即便是曾经压缩过的文件,gzip也可能进一步压缩。常见的做法是,先用工具压缩代码,再由服务器提供gzip压缩。 缩小不必要的库依赖为了应用某个性能,而引入一整个库,例如:想应用jQuery的toggleClass,能够间接引入单个办法,而不必要引入整个jQuery 总结尽管一些大体积的资源,如图片,字体等是咱们最关怀的优化项,但也不能疏忽了文本内容,毕竟文本内容才是网页的主体。 参考https://developers.google.com...

July 15, 2020 · 1 min · jiezi

粗读web框架之go-gin和python-django

为什么引入web框架   web应用的本质浏览器发送一个HTTP请求;服务器收到请求,生成一个HTML文档;服务器把HTML文档作为HTTP响应的Body发送给浏览器;浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示;   涉及的问题  解析http请求找到对应的处理函数生成并发送http响应*web框架工作流程 中间件中间件是请求或者应用开始和结束时注入代码的机制常见的web中间件: 鉴权、打印log、session、统计信息、处理数据库连接  等等=== golang http 服务端编程golang 的net/http包提供了http编程的相关接口,封装了内部TCP连接和报文解析的复杂琐碎的细节  go c.serve(ctx)最终会启动goroutine处理请求使用者只需要和http.request 和 http.ResponseWriter 两个对象交互就行(也就是一个struct 实现net/http包中的Handler interface中的 ServeHttp方法 )//E:\Go\src\net\http\server.go +82 type Handler interface { ServeHTTP(ResponseWriter, *Request)}//纯 net.http包的server方法package mainimport ( "io" "net/http")type helloHandler struct{}func (h *helloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, world!"))}func main() { http.Handle("/", &helloHandler{}) http.ListenAndServe(":12345", nil)}//////////////////////////////////////////////////////////////////import ( "net/http")type Handle struct{}func (h Handle) ServeHTTP(response http.ResponseWriter, request *http.Request) { switch request.URL.Path { case "/info": response.Write([]byte("info")) default: }}func main() { http.ListenAndServe(":8888", Handle{})} ...

July 7, 2020 · 11 min · jiezi

13万字-玩转前端二进制

本文阿宝哥将按照以下的流程来介绍前端如何进行图片处理,然后穿插介绍二进制、Blob、Blob URL、Base64、Data URL、ArrayBuffer、TypedArray、DataView 和图片压缩相关的知识点。 阅读完本文,小伙伴们将能轻松看懂以下转换关系图: 还在犹豫什么?跟上阿宝哥的脚步,让我们一起来玩转前端二进制。请小伙伴们原谅阿宝哥的 “自恋”,在后面的示例中,我们将使用阿宝哥的个人头像作为演示素材。 好的,现在我们开始来进入第一个环节:选择本地图片 -> 图片预览。 一、选择本地图片 -> 图片预览1.1 FileReader API在支持 FileReader API 的浏览器中,我们也可以利用该 API 方便实现图片本地预览功能。 (图片来源:https://caniuse.com/#search=f...) 由上图可知,该 API 兼容性较好,我们可以放心使用。这里阿宝哥就不展开详细介绍 FileReader API,我们直接来看一下利用它如何实现本地图片预览,具体代码如下: <!DOCTYPE html><html> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>图片本地预览示例</title> </head> <body> <h3>阿宝哥:图片本地预览示例</h3> <input type="file" accept="image/*" onchange="loadFile(event)" /> <img id="previewContainer" /> <script> const loadFile = function (event) { const reader = new FileReader(); reader.onload = function () { const output = document.querySelector("#previewContainer"); output.src = reader.result; }; reader.readAsDataURL(event.target.files[0]); }; </script> </body></html>在以上示例中,我们为 file 类型的输入框绑定 onchange 事件处理函数 loadFile,在该函数中,我们创建了一个 FileReader 对象并为该对象绑定 onload 相应的事件处理函数,然后调用 FileReader 对象的 readAsDataURL() 方法,把本地图片对应的 File 对象转换为 Data URL。 ...

July 6, 2020 · 11 min · jiezi

编程时间简史系列Web-Server-编年史

引言本文是继《编程时间简史系列》的第二篇文章。 全系列索引: 《编程时间简史系列》JavaScript 模块化的历史进程《编程时间简史系列》Web Server 编年史互联网今天已经广泛存在于人们的生活中,人们的衣食住行等方方面面早已离不开互联网的支撑,这其中离不开 Web 技术的发展。 Web 是一种典型的分布式应用架构。Web 应用中的每一次信息交换都要涉及到客户端和服务端两个层面。因此,Web 开发技术大体上也可以被分为客户端技术和服务端技术两大类。 本文将会讲述 Web 服务端技术的萌芽和演进过程,旨在使读者能更清晰地掌握 Web 服务端技术的发展脉络。 Web 服务端技术的发展与客户端技术的进步是相辅相成的,本文虽是讨论 Web 服务端,在讲述过程中却不可避免地会提及一些 Web 客户端的有关内容,但不会过多深入。对此感兴趣的读者,可以自行阅读最下方的参考链接。 同样的,不谈具体代码,只聊历史故事。 P.S. 下一篇的选题还没有敲定,如果有朋友想了解某一方面的历史又苦于没有资料,可以在文章下方给我留言。 正文广义上的 Web Server(Web 服务器),包含硬件和软件两方面。今天我们只谈及其中的软件部分,即能向客户端提供 Web 服务的程序。 现在大家耳熟能详的 Apache、IIS、Tomcat、Nginx 等等,都属于 Web Server。 那么它们之间究竟有何不同?又是由谁、在什么时间发明的?我们常说的静态网页、动态网页又是指什么?HTTPd 和 Web Server 有何不同?网上总提的 libuv,它是个啥? 让我们先带着这些疑问,回到 HTTP 协议尚未诞生的时代。 时代前夜:HTML、HTTP 与万维网1960 年,Theodor Holm Nelson 在哈佛计算机编程的选修课程上,使用了当时哈佛大学唯一可用的计算机 —— IBM 7090。在临近课程结束的时候,Theodor Holm Nelson 决定使用机器语言编写一个计算机程序,让他能够将自己的笔记和手稿存储在计算机中,可以以各种方式修改和编辑草稿,并生成可打印的最终版本。在他的项目进行到第 4 万行左右的代码时,他开始意识到,他对这项任务的完成难度最初估计得过于乐观。 1963 年,已经从哈佛大学毕业的 Theodor Holm Nelson 决定将自己大学时的想法继续进行下去。他首次提出了名为 “HyperText”(超文本)的概念,并找到了一些志同道合、痴迷算计的朋友,成立了 Project Xanadu,试图制订规范,并应用到实际的计算机程序中。 ...

June 29, 2020 · 8 min · jiezi

新手宝典一篇博文带萌新建站并了解建站体系流程和对萌新友好的便捷方式这篇博文很有可能是你的启蒙文

前言本片博文主要面向于还没接触过web开发的萌新,以及想知道整体流程并且完成建站的萌新;如果你是个大佬,就没必要看下去了。 本篇博文没有难啃的骨头,请各位萌新放心食用。本篇博文采用通俗易懂的方式讲解,轻松并且比较接地气!本篇博文涉及的专业名词将会讲解说明。 浏览一个网页的基本流程方式 萌新可理解在学习一门技术的时候,往往是了解整体体系架构才能更好的学习,不然在学习的过程中会出现不知道为什么这样做,做出这一部分是该整体部分的哪个区域,只会跟着做,但是并不了解这是在干啥。可能一些萌新体会颇深,就照着打,老师教怎么写,我就怎么写,反正做出来了。 本篇博文,就来用最接地气的方式对基本的web开发做一个整体的讲解,带各个萌新过一遍web开发的流程,好让各位萌新知道学习的时候学习了什么知识点,这个知识点能够干哈。 最开始,我们就以个人浏览网站的方式给大家说一下这一个过程是如何运作的。 我们访问网站,一般先打开浏览器(不要杠),输入一个网址,随后浏览器打开一个网页。在你在请求这一个网址数据的时候,已经发生了一系列的操作。 啥是IP地址假设你输入的是“csdn.net”,浏览器想要去访问你这个网站,首先需要的是获得你这个网站的IP地址。可能就有萌新问了“什么是IP地址?”。IP地址就是“指互联网协议地址,或者说网际协议地址”。又有萌新说了“你这么说我怎么懂?”,好了现在容我慢慢道来。 IP地址就是在网络中,定位你这台电脑,或者说是设备的一个标记,这个标记是人们指定好的标准协议而产生的(协议就是你和我说好了一件事,拉钩了,以后要这样做)。就像你家的门牌号例如叫做“CSDN市,CSDN区,CSDN街道的CSDN小区第CSDN栋的第CSDN号”...这是由有关机构制定的一套规范名称,不允许随意更改;我们换个例子,例如你家是“深圳市南山区深南大道某某小区第八栋808”,你写快递的收件地址肯定是写这个,难道你写“宇宙第一星球第一市第一栋第一号”?地址是由专门组织规范且制定的一套定位规范,遵循这个规范可以使遵循该规范的设备或者人之间相互通信,这个通信指可以传达交互,能够定位、找到。综上所述,IP地址就不要纠结为什么要这样写,只要知道这个IP地址是你要用的就行。 DNS现在IP地址知道是什么了,那么怎么获得IP地址?这个时候就需要用到DNS了,啥是DNS??!! DNS的英文全称是 Domain Name System,翻译过来就是域名系统。好了,这个时候问题又来了。 域名啥是域名?域名就是用来标识IP地址的一个标记,或者说是昵称。“为什么不直接用IP地址?”这个问题问得好,如果我们人不用名称,就用身份证号,我叫你的时候就会叫“450333333333333333...”。。。我觉得这样不是很好。。。当人们觉得使用IP地址不方便记忆后,就产生了域名地址,就像CSDN,我们就知道是CSDN就好了,难道还要去记她的IP地址吗?例如CSDN的地址是192.168.1.1,难不难受...以后可能你记网站名称就在记数字了,又不方便又崩溃。好了,回归正题,我们输入了网址后,按下Enter键后,浏览器将会去DNS请求这个域名对应的IP是什么,如果找到了,就返回一个IP地址。可能又有萌新问了,“浏览器会自动去找DNS?”,会是会,但是我们也会给它一个目标,在我们的网络连接里面,本地连接右键属性,里面有个IPV4,双击进去就可以查看自己配置的DNS了,一般别乱改,不然很难过的,有时候浏览器打不开网址,就是这个原因。记住,网络IP冲突可能会导致上不了网,这种情况在学校的机房里很常见,只要改成自动获取IP就ok了,会自动分配闲置的IP地址。 数据请求 当找到了IP地址,这个时候就会向该IP地址的设备去请求数据,请求数据的意思就是,这个设备或者说服务器就像一个大型的分发机构,就是送情报的一个部门,一共有65535个窗口,每个窗口送不同的情报;例如我们需要请求网站之类的数据,就通过第80个窗口请求,这个时候浏览器派来的小弟来到这个80号窗口,可能会排一下队,拿到数据后,回到浏览器,浏览器把拿到的数据显示给你看。 “ 渲染” 其实在这个时候,浏览器显示的数据会根据一些标记,进行排版,这些标记就称是HTML,HTML是 Hyper Text Markup Language 的缩写,中文名是超级文本标记语言,其实说那么深奥还不方便理解;简单来说就是通过特定的标签,把一段文本信息标记起来,表示这段文本信息要怎么样去进行显示,或者是这个文本信息是啥东西;例如 <title>CSDN-专业IT技术社区</title>是CSDN官网首页的标题,用了title这个标签把文本信息标记,标记好后,浏览器就知道这个文本要显示在哪里,要怎么进行显示,最终浏览器把这一段信息显示在了浏览器标题头位置:我们再看看另外的一个例子:这一段HTML语言所标记了一个博客的文本,整个标记的情况为了清晰的看清楚,我在这里列出:<a href="//blog.csdn.net/" class="toolbar_to_feed" title="博客">博客</a>,标记语言HTML那一些标记并不会进行显示,只显示了博客这个这个文本在网页上:那是因为浏览器是通过标记语言的内容去进行显示,标记语言的作用就是告诉浏览器这里你要怎么显示这个内容,或者说这个内容有什么功能。这里是博客的一个跳转,使用的是a标签,a标签是什么?a标签就是<a>这里是要显示的文本</a>,在a标签里面可以添加一些固定的操作,例如a标签的作用是跳转到指定的页面,那么这个页面肯定是有一个链接的,那么这个链接需要什么来指定呢? 答案就很简单了,使用href来指定,这个href呢就需要把要跳转到的页面的地址给加上,在我们查看到的HTML代码中是href="//blog.csdn.net/",这就表示会跳转到blog.csdn.net这个地址,有人点击就会跳转到博客了。 那 class="toolbar_to_feed" 是什么东西?在这里我们可以把它当做给定了一个样式,给定了一个style,要怎么样显示,你要显示的样子是什么?可能红色的底,绿色的字,俗话说,红配绿。。。这个样式的名称就叫做 toolbar_to_feed 。在这里并不会深入的讲解这个样式要让博客这个文本显示成啥样,大家只要通过例子知道这个html是用来告诉浏览器怎么样显示这个文本,或者这个文本有什么用就ok了。其实还有些动态的数据,但是在这里并不会讲解,基本的理解这样就没问题了。专业点的说法就是构件编排用户界面。 前端 通过以上描述就很清楚的知道,如果我们做web开发的话,做html相关的就是给页面制作布局,怎么样好看,甚至可以做特效,让页面显示多姿多彩;一般我们称做HTML这种,是为了数据的显示的排版工作,或者说是为了包装数据工作的这类职位叫做前端;不过前端是个相对概念,在web上可以这样理解是没问题的,不过现在的前端,如果不去大厂,基本上要做的不止是包装数据的排版那么简单,可能还会做得更多。如果我们去做前端工作的话,还要掌握跟服务器交互的一些操作,打个比方,用户点击了一个按钮,这个按钮的功能是获取到你们的用户人数,这个时候你需要编写一个逻辑,去服务器获取到这个用户想要的数据。不过这点只是作为一个提醒,当真正接触前端的话会了解的。 后端 有很多小问号的朋友可能会记得刚刚说的,前端可能要向服务器请求数据,那么这个数据,是不是就是传说中的后端做的?(听没听过后端某问题,反正就是后端) 后端可以理解为一些业务逻辑的代码编写实现,就是需要后端,什么是业务逻辑?简单的举个例子,就像你淘宝买东西,你点了这个物品,下单了,我要在代码上怎么实现这个下单这个背后的操作;因为下单后你还需要交易,交易要收钱,收钱你还要把这个记录记载到你存放数据的地方,我们可以叫做数据库,存进去后,用户查看自己的下单记录,你还需要把这个记录取出来,用代码实现这个取出来这个过程给用户看到,不然没有记录那就很尴尬了,只收钱不卖货!流批!所以一般是指的是数据库(因为要存储数据,例如你网站的用户数据,肯定要用东西来存储,这个东西就是数据库)进行交互以处理相应的业务逻辑。虽然后端要考虑很多东西,但是一般来说这样举例子就比较方便理解,就不过多的谈论其它东西了。 现在整个逻辑基本上就通了,简单的理解,后端就是实现一些数据操作,业务逻辑的实现(其实可能会运维),前端呢就是负责用户的页面数据的展示排版;嗯,大体这样理解问题不大。 建站 既然理解通了,我们就来说说一个网站搭建的流程是什么吧!首先我们需要租一个服务器,嗯...这个萌新不理解,那我们降一个档次,那就是我们在我们自己的本地电脑进行试验,这样就问题不大了,方便快捷。 搭建一个简单企业门户网站其实贼简单,不吹不黑,几年前的时候,做这个还是挺得钱的,接接外包,舒舒服服,现在就不行了,毕竟技术在更新,过时的技术也变得更加廉价了,但是依旧是基本。 以下我使用一个静态网站作为例子演示一个网站的搭建;“啥是静态网站?”。静态网站就是没有后端,好吧,简单来说就是这样,由于后端需要一些其它语言,本篇博文针对于普遍人群,为了方便理解就不用后端了,直接静态网站作为演示,列出html的代码,到时候萌新们可以直接复制代码拿去自己试验,舒舒服服,美滋滋。 集成环境 首先我们下载一个集成环境。“啥是集成环境?”。 集成环境打个比方,就像你做菜、需要火源、锅、锅铲,这种就是环境;我做网站也要一个环境,这个环境有人给你做好了,你直接拿过来用就好,就不需要自己搭建,有些初学者就喜欢自己搭建,然后发现一堆问题,搞着搞着发现太难就不学了,简直嘤嘤嘤!初学者我个人建议先别增加自己的难度,先学,不然没搞懂就上会一脸懵圈的。现在我们下载一个叫做phpstudy的软件,下载点这里去官网。然后进行傻瓜式安装。安装完后打开服务:Apache可能会有人问是什么,Apache是服务器软件,它就是你做菜需要的必要工具之一,开启了就对了,可能你只开启Apache只能做汤,那也没事,毕竟我现在演示的是静态网站。 首先我们把我们的资源文件带到网站根目录下:根目录不会找?没关系,我们打开网站,点击管理找到根目录就ok:找到后把资源文件放到根目录下,删除以前的根目录下的内容即可。然后在浏览器输入:http://127.0.0.1/ 或者输入 http://localhost/ 就可以访问我们本地电脑上的网站了!这个模版资源是我从网上下载的,网上很多资源各位都可以看一下。本博文使用的资源文件审核中,将会及时更新。 资源已更新,地址在csdn下载,不需要积分:点这里 这样你的个人网站就完成了,如果有服务器的小伙伴就直接可以下载精美的例子完成你的个人网站,美滋滋! 建议 一下分享几个简单搭建网站的技巧: 前端模板,也就是HTML怎么样才好看,感觉自己做不了那么好看!网上有很多模板,搜索即可,直接套用下来满足你的精美欲望!无限可能!我后端学了,但是感觉自己写好难! 没关系,使用开发框架,什么是开发框架?问题不大,这个东西是帮你开发的,我在刚毕业的时候教了同级一位同学,我们专业当时不学这个,我就直接教他每天2小时,然后学了半个月就就业去了,至今五年多了还在做这一行。所以开发框架很简单的,就是方便你开发,舒舒服服。感觉自己的网站不安全?动不动就被了!** 个人推荐使用框架,开启全局过滤,然后服务器尽量用大厂的,例如阿里云,直接开启白名单,这是最简单的防护方式了。我是前端,怎么做后端? 可以直接学习后端语言,想开发效率快当然是“天下第一语言PHP“,哈哈哈,不要喷我!PHP的开发效率是不错的,如果你是前端,你也可以学学nodejs,也可以的,当然还有其它都可以。最最萌新的话如果要租服务器,建议租用Windows的服务器,操作比较方便,不然命令行操作你可能吃不消。 其它建议 如果单纯想联系数据库,没必要单独装一个,直接使用集成环境,例如phpstudy,它集成了mysql,直接安装就可以用了,舒舒服服,躺着下载安装几分钟,自己单独装,死磕还不一定弄好。如有错误欢迎指出,有问题可以私信我哟,可以关注收藏一键三连!完美!有问题都可以问我,包括是否想学php、python、c/c++等,这段时间在筹划在CSDN学院上传教程,欢迎支持!

June 27, 2020 · 1 min · jiezi

Application-Session-Request-Page

Web交互的最基本单位为HTTP请求。每个用户从进入网站到离开网站这段过程称为一个HTTP会话,一个服务器的运行过程中会有多个用户访问,就是多个HTTP会话。 Application作用范围在服务器启动到服务器关闭为止。Application 的范围最大、停留的时间也最久,所以使用时要特别注意不然可能会造成服务器负载越来越重的情况。只要将数据存入Application对象,数据的范围 (Scope) 就为Application。 具有Application范围的对象被绑定到 javax.servlet.ServletContext 中。在Web应用程序运行期间,所有的页面都可以访问在这个范围内的对象。 Application对象的主要方法:getAttribute(String name)     return Object     getAttributeNames()             return EnumerationgetInitParameter(String name)getServletInfo()setAttribute(String name , Object object)Session(会话)HTTP会话开始到结束这段时间。Session 的作用范围为用户和服务器所连接的一段持续时间,与服务器断线,这个属性就无效了。 Session 的开始时刻比较容易判断,它从浏览器发出第一个HTTP请求即可认为会话开始。但结束时刻就不好判断了,因为浏览器关闭时并不会通知服务器,所以只能通过如下这种方法判断:如果一定的时间内客户端没有反应,则认为会话结束。Tomcat的默认值为120分钟,这个值也可以通过HttpSession的setMaxInactiveInterval()方法来设置。具有session范围的对象被绑定到 javax.servlet.http.HttpSession 对象中。 Session对象的主要方法:getAttribute(String name) return ObjectgetAttributeNames() return EnumerationgetCreationTime() return longgetId() return StringgetLastAccessedTime() return longgetMaxInactiveInterval() return intremoveAttribute(String name) voidsetAttribute(String name , java.lang.Object value) void RequsetHTTP请求开始到结束这段时间。Request 的范围是在一网页发出请求到另一个网页之间。一个HTTP请求的处理可能需要多个Servlet合作,这几个Servlet之间可以通过某种方式传递信息,这个信息在请求结束后就失效。具有Request范围的对象被绑定到javax.servlet.ServletRequest 对象中。Request对象对于每一个客户请求都是不同的,所以对于每一个新的请求,都要重新创建和删除这个范围内的对象。 Request对象的主要方法:getParameter(String name) return StringgetParameterNames() return EnumerationgetParameterValues(String name) return String[]Page作用范围:当前页面从打开到关闭这段时间,它只能在同一个页面中有效。 具有Page范围的对象被绑定到 javax.servlet.jsp.PageContext 对象中。 ...

June 24, 2020 · 1 min · jiezi

你不知道的-Web-Workers-上78K-字-多图预警

阅读完本文你将学到以下知识: 进程与线程的区别:进程与线程的概念及单线程与多线程;浏览器内核的相关知识:GUI 渲染线程、JavaScript 引擎线程、事件触发线程等;Web Workers 是什么:Web Workers 的限制与能力及主线程与 Web Workers 之间如何通信;Web Workers 的分类:Dedicated Worker、Shared Worker 和 Service Workers;Web Workers API:Worker 构造函数及如何观察 Dedicated Worker 等。下面我们开始步入正题,为了让大家能够更好地理解和掌握 Web Workers,在正式介绍 Web Workers 之前,我们先来介绍一些与 Web Workers 相关的基础知识。 一、进程与线程的区别在介绍进程与线程的概念前,我们先来看个进程与线程之间关系形象的比喻: 如上图所示,进程是一个工厂,它有独立的资源,线程是工厂中的工人,多个工人协作完成任务,工人之间共享工厂内的资源,比如工厂内的食堂或餐厅。此外,工厂(进程)与工厂(进程)之间是相互独立的。为了让大家能够更直观地理解进程与线程的区别,我们继续来看张图: 由上图可知,操作系统会为每个进程分配独立的内存空间,一个进程由一个或多个线程组成,同个进程下的各个线程之间共享程序的内存空间。相信通过前面两张图,小伙伴们对进程和线程之间的区别已经有了一定的了解,那么实际情况是不是这样呢?这里我们打开 macOS 操作系统下的活动监视器,来看一下写作本文时所有进程的状态: 通过上图可知,我们常用的软件,比如微信和搜狗输入法都是一个独立的进程,拥有不同的 PID(进程 ID),而且图中的每个进程都含有多个线程,以微信进程为例,它就含有 36 个线程。那么什么是进程和线程呢?下面我们来介绍进程和线程的概念。 1.1 进程的概念进程(英语:process),是指计算机中已运行的程序。进程曾经是分时系统的基本运作单位。在面向进程设计的系统(如早期的 UNIX,Linux 2.4 及更早的版本)中,进程是程序的基本执行实体;在面向线程设计的系统(如当代多数操作系统、Linux 2.6 及更新的版本)中,进程本身不是基本运行单位,而是线程的容器。 程序本身只是指令、数据及其组织形式的描述,进程才是程序的真正运行实例。若干进程有可能与同一个程序相关系,且每个进程皆可以同步或异步的方式独立运行。现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(或称时分复用),以在一个处理器上表现出同时运行的感觉。 1.2 线程的概念线程(英语:thread)是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如 Win32 线程;由用户进程自行调度的用户线程,如 Linux 平台的 POSIX Thread;或者由内核与用户进程,如 Windows 7 的线程,进行混合调度。 同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。 但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。一个进程可以有很多线程,每条线程并行执行不同的任务。 ...

June 24, 2020 · 6 min · jiezi

图片处理不用愁给你十个小帮手

本文阿宝哥会为小伙伴们隆重介绍用于图片处理的十个 “小帮手”,他们各个身怀绝技,拥有模糊、压缩、裁剪、旋转、合成、比对等技能。相信认识他们之后,你将能够轻松应对大多数的图片处理场景。 不过在介绍 “小帮手” 前,阿宝哥会先介绍一些图片相关的基础知识。此外,为了让小伙伴们能够学习更多图片相关的知识,阿宝哥精心准备了 “阿宝哥有话说” 章节。该章节你将会学到以下知识: 如何区分图片的类型(非文件后缀名);如何获取图片的尺寸(非右键查看图片信息);如何预览本地图片(非图片阅读器);如何实现图片压缩(非图片压缩工具);如何操作位图像素数据(非 PS 等图片处理软件);如何实现图片隐写(非肉眼可见)。十个图片处理 “小帮手” 已经已经迫不及待想与你见面,还在犹豫什么?赶紧出发吧! 一、基础知识1.1 位图位图图像(bitmap),亦称为点阵图像或栅格图像,是由称作像素(图片元素)的单个点组成的。 这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。扩大位图尺寸的效果是增大单个像素,从而使线条和形状显得参差不齐。 用数码相机拍摄的照片、扫描仪扫描的图片以及计算机截屏图等都属于位图。 位图的特点是可以表现色彩的变化和颜色的细微过渡,产生逼真的效果,缺点是在保存时需要记录每一个像素的位置和颜色值,占用较大的存储空间。常用的位图处理软件有 Photoshop、Painter 和 Windows 系统自带的画图工具等。 分辨率是位图不可逾越的壁垒,在对位图进行缩放、旋转等操作时,无法生产新的像素,因此会放大原有的像素填补空白,这样会让图片显得不清晰。 (图片来源:https://zh.wikipedia.org/wiki...) 图中的小方块被称为像素,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子。 可以将像素视为整个图像中不可分割的单位或者是元素。不可分割的意思是它不能够再切割成更小单位抑或是元素,它是以一个单一颜色的小格存在。 每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。 1.2 矢量图所谓矢量图,就是使用直线和曲线来描述的图形,构成这些图形的元素是一些点、线、矩形、多边形、圆和弧线等,它们都是通过数学公式计算获得的,具有编辑后不失真的特点。 例如一幅画的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定画显示出的颜色。 矢量图以几何图形居多,图形可以无限放大,不变色、不模糊。 常用于图案、标志、VI、文字等设计。常用软件有:CorelDraw、Illustrator、Freehand、XARA、CAD 等。 这里我们以 Web 开发者比较熟悉的 SVG(Scalable Vector Graphics —— 可缩放矢量图形)为例,来了解一下 SVG 的结构: 可缩放矢量图形(英语:Scalable Vector Graphics,SVG)是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。SVG 由 W3C 制定,是一个开放标准。 SVG 主要支持以下几种显示对象: 矢量显示对象,基本矢量显示对象包括矩形、圆、椭圆、多边形、直线、任意曲线等;嵌入式外部图像,包括 PNG、JPEG、SVG 等;文字对象。了解完位图与矢量图的区别,下面我们来介绍一下位图的数学表示。 1.3 位图的数学表示位图的像素都分配有特定的位置和颜色值。每个像素的颜色信息由 RGB 组合或者灰度值表示。 根据位深度,可将位图分为1、4、8、16、24 及 32 位图像等。每个像素使用的信息位数越多,可用的颜色就越多,颜色表现就越逼真,相应的数据量越大。 1.3.1 二值图像 位深度为 1 的像素位图只有两个可能的值(黑色和白色),所以又称为二值图像。二值图像的像素点只有黑白两种情况,因此每个像素点可以由 0 和 1 来表示。 ...

June 23, 2020 · 9 min · jiezi

前端进阶跟着开源项目学习插件化架构

一、微内核架构简介1. 1 微内核的概念微内核架构(Microkernel Architecture),有时也被称为插件化架构(Plug-in Architecture),是一种面向功能进行拆分的可扩展性架构,通常用于实现基于产品的应用。微内核架构模式允许你将其他应用程序功能作为插件添加到核心应用程序,从而提供可扩展性以及功能分离和隔离。 微内核架构模式包括两种类型的架构组件:核心系统(Core System)和插件模块(Plug-in modules)。应用逻辑被分割为独立的插件模块和核心系统,提供了可扩展性、灵活性、功能隔离和自定义处理逻辑的特性。 图中 Core System 的功能相对稳定,不会因为业务功能扩展而不断修改,而插件模块是可以根据实际业务功能的需要不断地调整或扩展。微内核架构的本质就是将可能需要不断变化的部分封装在插件中,从而达到快速灵活扩展的目的,而又不影响整体系统的稳定。 微内核架构的核心系统通常提供系统运行所需的最小功能集。许多操作系统使用的就是微内核架构,这也是它名字的由来。从商业应用程序的角度来看,核心系统一般是通用业务逻辑,没有特殊情况、特殊规则或复杂情形下的自定义代码。 插件模块是独立的模块,包含特定的处理、额外的功能和自定义代码,来向核心系统增强或扩展额外的业务能力。通常插件模块之间也是独立的,也有一些插件是依赖于若干其它插件的。重要的是,尽量减少插件之间的通信以避免依赖的问题。 1.2 微内核架构的优点灵活性高:整体灵活性是对环境变化快速响应的能力。由于插件之间的低耦合,改变通常是隔离的,可以快速实现。通常,核心系统是稳定且快速的,具有一定的健壮性,几乎不需要修改。可测试性:插件可以独立测试,也很容易被模拟,不需修改核心系统就可以演示或构建新特性的原型。性能高:虽然微内核架构本身不会使应用高性能,但通常使用微内核架构构建的应用性能都还不错,因为可以自定义或者裁剪掉不需要的功能。介绍完微内核架构相关的基础知识,接下来我们将以西瓜视频播放器为例,分析一下微内核架构在西瓜视频播放器中的应用。 二、西瓜视频播放器简介西瓜视频播放器一款带解析器、能节省流量的 HTML5 视频播放器。它从底层解析 MP4、HLS、FLV 探索更大的视频播放可控空间。 (图片来源 —— http://h5player.bytedance.com/) 它的功能特色是从底层解析 MP4、HLS、FLV 探索更大的视频播放可控控件并拥有以下特点: 易扩展:灵活的插件体系、PC/移动端自动切换、安全的白名单机制;更丰富:强大的 MP4 控制、点播的无缝切换、有效的带宽节省;较完整:完整的产品机制、错误的监控上报、自动的降级处理。上手西瓜视频播放器只需三步:安装、DOM 占位、实例化即可完成播放器的使用。 (图片来源 —— pingan8787) 西瓜视频播放器主张一切设计都是插件,小到一个播放按钮大到一项直播功能支持。 想更好的自定义播放器完成自己业务的契合,理解插件机制是非常重要的,播放器本身有很多内置插件,比如报错、loading、重播等,如果大家想自定义效果可以关闭内置插件,自己开发即可。 默认情况下插件是自启动的,如果自定义插件不想自启动或者不想改变播放器默认的执行机制,建议以继承播放器类的方式开发。为了实现 "一切设计都是插件" 的主张,西瓜视频播放器团队采用了微内核的架构,下面我们开始来分析一下西瓜视频播放器的微内核实践。 三、西瓜视频播放器微内核实践微内核架构模式包括两种类型的架构组件:核心系统和插件模块。在西瓜视频播放器中核心系统是由 Player 类来实现,该类对应的 UML 图如下所示: (https://github.com/bytedance/... 而插件模块主要就是西瓜视频播放器中的各种内置插件,比如控制条的音量控制组件、播放器贴图、播放器画中画和播放器下载控件等,除了上面提到的插件之外,目前西瓜视频播放器总共提供了 22 个插件,完整的内置插件如下图所示: (西瓜视频播放器内置插件) 对于微内核的核心系统设计来说,它涉及三个关键技术:插件管理、插件连接和插件通信。下面我们将围绕这三个关键点来逐步分析西瓜视频播放器是如何实现的。 3.1 插件管理核心系统需要知道当前有哪些插件可用,如何加载这些插件,什么时候加载插件。常见的实现方法是插件注册表机制。核心系统提供插件注册表(可以是配置文件,也可以是代码,还可以是数据库),插件注册表含有每个插件模块的信息,包括它的名字、位置、加载时机(启动就加载,或是按需加载)等。 在分析西瓜视频播放器插件管理机制前,我们先来看一下 xgplayer/packages/xgplayer/src 目录结构: ├── control│ ├── collect.js│ ├── cssFullscreen.js│ ├── danmu.js│ ├── ....│ └── volume.js├── error.js├── index.js├── player.js├── proxy.js├── style│ ├── index.scss│ ├── ...│ └── variable.scss└── utils ├── animation.js ├── database.js ├── ... └── util.js通过观察以上目录结构,我们可以发现西瓜视频播放器的插件都统一存放在 control 目录下。那么现在问题来了,这些插件是如何被加载的?什么时候被加载?要回答这个问题,我们从该项目的入口出发: ...

June 22, 2020 · 4 min · jiezi

前端存储除了-localStorage-还有啥

本文介绍一些与前端数据存储有关,有趣、好玩、有用的开源库。除此之外,还会让你掌握各种 Web 存储方案的特点,赶紧来了解一下。前端的数据存储方式,你除了用过 Cookies、localStorage 和 sessionStorage 外,还有用过其它的存储方式么?其实除了前面提到的 3 种存储方式,目前主流的浏览器还支持 Web SQL 和 IndexedDB。 目前市场上主流的浏览器有 Chrome 、Safari、Firefox、Opera、UC Browser 和 Internet Explorer 等,其中截止 2020 年 5 月,Chrome 的市场占有率为 63.93%,远远超过第二名 Safari 浏览(18.19%)。 (图片来源:https://gs.statcounter.com/) 这里我们以市场占有率第一的 Chrome 浏览器为例,来了解一下它支持的所有存储方案: (打开 Chrome 开发者工具,切换至 Application 栏位) 在介绍目前比较流行的一些开源的前端存储方案之前,阿宝哥先分享一些与存储有关,有趣好玩的开源库。 一、有趣好玩的开源库1.1 SharedbRealtime database backend based on Operational Transformation (OT)。https://github.com/share/sharedb ShareDB 是一个基于 JSON 文档操作转换(OT)的实时数据库后端。它是 DerbyJS Web 应用程序框架的实时后端。 示例1:实时数据同步 示例2:展示实时查询的排行榜应用程序 1.2 ImmortalDB???? A relentless key-value store for the browser。https://github.com/gruns/Immo... ...

June 16, 2020 · 4 min · jiezi

前端应该懂得初级Web分析指标

UV、PV、跳出率(bounce rate)这些词到底是什么意思?怎么计算?原文网址:https://hitmetrics.io/blog/st... 从事该行业足够长的时间的人们经常会忘记这些指标对于新人来说听起来很荒诞,所以您必须原谅他们。 要学习网络分析并了解它如何使您受益,最好先了解周围常见的术语,这是一个好主意。 在本文中,我们将介绍基本的网络分析指标以及一些有关如何利用这些指标来推动洞察力的花絮。 1. Unique Visitors唯一身份访问者是推断访问您网站的人数。 之所以推断出此关键字,是因为其对经常访问某个网站的个人(您和我)的真实人数的准确性取决于您配置分析工具的方式。 Google Analytics(分析)和Adobe Analytics(分析)等工具的大多数现成配置都通过Cookie来标识唯一身份访问者。 这种 cookie 的用途与存储权限的 cookie完全不同。 通常,cookie用于在浏览器中存储少量数据,其中包括一种识别您是10天前访问此网站的同一个人的方法。 如果您从笔记本电脑和手机上浏览一个网站,会发生什么? 尽管只有您,但报告的唯一身份访问者数量还是两个。 如果您要清除浏览器 Cookie 或以隐身模式访问网站,也是如此。 访问者在网站上进行身份验证后,更高级的分析配置将传递用户ID,以更准确地识别访问者。 此选项可能并不适用,也不适合所有人,因为它高度依赖于您所运行的网站的类型。 Bonus:考虑创建利用唯一身份访问者(例如回访者和单次访问者)的补充指标。 比较这两个指标可能会产生一些有趣的惊喜。 2. Visits/Sessions每个唯一的访问者在访问站点时都会进行浏览。 根据您使用的工具不同,此行程称为 Visits 或 Sessions。 在现实生活中,一次实际旅行可能只涉及一站或多站。 您可能只是在途中到当地咖啡馆短暂旅行,或者您可能正在下一次穿越落基山脉的大冒险。 同样,访问可以仅包含一个跟踪的整个访问活动,也可以包含许多活动,例如多个页面浏览量和转换事件。 拜访可能会很短,也可能会很长。 这完全取决于访问者在该访问中的行为。 在没有记录任何活动的持续时间之后,即结束访问。 尽管典型的超时持续时间为30分钟不活动,但实际时间会因分析工具或配置而异。 例如,如果我要早上访问此页面,一整天浏览这个页面和这个网站的其他页面,我将有两次访问关联到我的访问者配置文件。 Bonus:尝试对您的网站访问进行访问执行近期和频率分析。 这可以帮助您回答“转化者是否多次访问该网站?”这样的问题。 和“人们要等多久才能返回我的网站?”。 3. Page Views页面浏览量是查看或加载特定页面的次数。 如果您尚未注意到趋势,那么我们一直在探索度量的概念,其中唯一访问者是活动的最高集合,访问与访问者绑定在一起,而页面浏览与特定访问者的访问绑定在一起。 我们将使用下面的示例来说明这三个相互连接的方式。 鲍勃在国庆日访问了Hitmetrics.io 登陆页面。 然后,Bob继续阅读该站点上的两篇博客文章,并离开了该站点。 在我们的网络分析工具中,鲍勃被视为1位唯一身份访问者,具有1次访问和3次页面浏览。 如果鲍勃决定第二天回来,尽管他还没有从前一天晚上的庆祝活动中清醒过来,会发生什么呢?在他的宿醉状态下,Bob决定重读他上次访问网站时标记为书签的一篇关于谷歌Analytics备选方案的文章。Bob只是想确保他在选择分析工具时做出了明智的选择。 现在,鲍勃将被视为1个唯一身份访问者,其中1次访问和1次页面浏览。 实际上,如果鲍勃在网站上没有做任何其他事情,那么他将被视为反弹!。 如果我们要报告包含这两天的时间范围,则我们的数据将显示我们有1个唯一身份访问者,2个访问和4个页面浏览量。 Bonus:“每次访问的页面浏览量”指标是确定网站内容的受欢迎程度的好方法,也可以指示用户的痛点。 比率越高,表示单次访问中浏览的页面越多。 4. Bounce Rate一些传统的营销人员非常喜欢或讨厌跳出率指标。跳出率由访问期间的行为决定。用一行字来描述它就是网站上单页访问的百分比。另一方面,跳出是只有一个页面视图的访问。 如果Bob只是访问过我们的主页而没有做任何其他事情,则Bob会被视为跳出,我们的网站跳出率将为100%。 从表面上看,这看起来真的很糟糕,有人可能会因为这种看似糟糕的表面现象而陷入困境。 但是,我要提醒任何使用此指标的人,但要知道跳出率根据网站及其结构而有所不同。 完全由一个页面组成的网站,即使您网站的每个访问者从头到尾都阅读页面内容,其跳出率也会达到100%。 只要符合您网站的目标以及它如何影响您的业务底线,高跳出率就不一定是一件坏事。 ...

June 13, 2020 · 1 min · jiezi

2020年将出现的7种新兴自动化Web测试趋势你知道吗

在最近几年中,技术以多种形式发展。从开发到测试再到持续交付,我们已经看到了IT行业的许多变化。但是,软件测试过程遇到了最积极的变化,特别是在测试过程中引入自动化之后,测试人员可以轻松便捷地测试Web应用程序或网站。 如今,企业专注于在市场上提供优质的产品,以便扩大市场份额。而且,它需要使用左移测试方法进行强大的软件测试,以提供高质量的产品或应用程序。 此外,如果在整个软件开发生命周期中执行此操作,则可以为您提供更快的发行版和更高的ROI。这就是为什么大多数组织都倾向于通过投资于下一代软件测试工具来为其产品采用端到端的测试周期。 即使在最新的软件开发方法中,例如DevOps和Agile,软件测试也起着至关重要的作用。因此,应该对其进行相应的转换以满足组织和技术方法的要求,并提供更高质量的软件应用程序。此外,如果您涉及机器学习,人工智能,物联网,网络物理系统和云计算等技术,那么您就需要有效的测试策略和方法论。 尽管自动化软件测试过程不是那么简单,但是您可以使用一些最新的自动化测试趋势,这将为您提供所需的质量和投资回报。 这是您对2020年自动化测试的期望 在本文中,我们将重点介绍您应该在2020年寻找的七个新兴的自动化测试趋势。 1.自动化以提高质量和更快地交付随着采用敏捷和DevOps方法,业务的主要座右铭是提供其产品的更快和更高质量的版本。自动化测试是快速实现此目标的唯一方法,因为它可以提供快速的结果,并允许您将产品快速交付市场。 尽管它并不用于测试应用程序的每个部分,但仍然可以进行手动测试。但是,借助DevOps和Agile方法,自动化测试可能会引领测试领域。如果将SDLC中的自动化测试与LambdaTest等适当的自动化工具一起使用,您将能够获得更好的质量,更快的发布周期和更高的ROI。 2.人工智能与机器学习我们都已经看到了AI在各种技术进步领域如何出现的,并且它将不断发展。甚至预计到2020年底,人工智能将成为CIO的首要投资重点。我们可以预计,到2025年,对人工智能的投资将达到1,906亿美元。 此外,将AI与包括手势识别在内的机器学习结合使用,将在未来增加对AI应用程序的需求。毋庸置疑,基于ML算法和神经网络的技术视野已经完全改变。因此,这些应用程序将需要彻底的测试和验证。 因此,强烈建议质量检查团队采用与AI有关的技能,例如统计,数学和机载数据科学。拥有这些技能,您将能够改善自动化测试过程。此外,测试人员应将其AI技能和非传统技能相结合,以便获得更好的测试结果。 3.区块链测试–即将到来的技术如果您精通随着活跃发展而迅速增长的比特币货币,那么您可能知道这是区块链技术的结果。因此,很明显,区块链正在进入IT行业,并且很快它可能会统治它。 根据麦肯锡最近的一份报告,区块链是一项不断发展的技术,能够逐步发展银行和金融交易的实际改进。这是继AI和ML之后的下一件大事,它甚至可以帮助企业促进智能合约,同时确保欺诈的安全性。 4.为企业赋能的大数据测试大数据在行业的不同部门中发挥着至关重要的作用,例如技术,银行,媒体,医疗保健,零售,电信等等。每个小型或大型企业都处理大量的数据量和数据类型,并且它们更加专注于使用数据来细分和优化决策过程。 但是,提取任何数量的数据(无论是结构化数据还是非结构化数据)都需要进行适当的测试。大数据测试将无助于处理大量数据,但也将允许您通过准确的数据验证来做出更好的决策。此外,您将能够改善您的营销策略。 尽管已经在场景中进行了大数据测试,但由于一些企业正在朝着面向数据的方法发展,因此它将以指数级的速度发展。大数据测试由于其强大的流程而已被许多组织采用。因此,我们可以假设,到2020年,大数据将为企业提供切实有效的保证,例如有效处理,减少应用程序安装时间等。 5.物联网测试可促进智能手机市场连接设备的数量已经在增加,并且假设到2020年,其数量将比2016年超过200亿美元。即使在2019年,物联网测试的兴起也是显着的,这意味着它的增长肯定会在2020年。 如果您不了解IoT测试,则需要测试IoT设备,以提高安全性,可信赖性,编程项目的通用性,易用性,兼容性,可伸缩性,数据完整性评估和设备真实性。 在进行物联网测试时,涉及的质量保证面临许多与操作系统,监视通信协议以及物联网系统多个要素的不同组合有关的复杂任务。因此,对于QA来说,提高他们在安全性,可用性和性能IoT测试方面的知识和技能至关重要。 但是,这并不是让IoT测试人员担心的唯一事情,他们需要有效的IoT测试策略才能执行适当的测试。这就是为什么大多数企业已经开始寻找有效的IoT测试策略以启用高效且相关联的智能设备的原因。 6. QAOps –开发运营中的下一个重要事项您可能听说过DevOps –一组将IT运营与开发结合在一起的最佳软件开发实践。DevOps的主要目的是缩短软件开发生命周期,以便开发人员可以专注于开发改进的功能,修复错误并提供符合业务目标的持续更新。DevOps是业务运营人员和开发人员之间的协作桥梁。 同样,QAOps通过将软件测试过程集成到CI / CD管道中,改善了开发人员和测试人员之间的直接通信。通常,定义QAOps的因素有两个: 与测试有关的所有活动都应纳入CI / CD管道质量保证人员应与开发人员保持一致,以便他们参与整个CI / CD流程在许多组织中,Facebook是通过迁移到Facebook Graph API版本2.0而采用QAOps的组织。但这并不意味着QAOps可以应用于大型企业,即使中小型公司也可以采用QAOps以获得更好的质量和更快的交付。 7.对安全测试和合规性的需求增加伟大的创新带来更大的威胁。当我们朝着提高软件产品的质量和交付水平迈进时,我们简直不能忽略安全因素。每个部门的大多数公司已经意识到对其Web应用程序,网络和系统进行安全测试的重要性。他们已经将他们的团队投入到工作中,通过将网络安全防护提升到一个新的水平,使应用程序更能抵御威胁。 安全测试不仅有助于保护在线交易(无论是金钱还是数据)的安全,而且还可以保护您的最终用户数据免受任何类型的网络攻击。网络安全性和合规性对于企业至关重要,因为它可以通过确保品牌的完整性来防止财务损失。安全测试将成为来年最流行的主题之一。 为了提供更好的质量和持续交付的软件产品,企业需要采用最新的测试服务趋势。的确,自动化测试无法完全替代手动测试,但是,自动化已经取代了大部分手动测试,这也是事实。因此,对于企业而言,最好使用像LambdaTest这样的下一代测试服务提供商的帮助,这些提供商了解您产品的最佳测试实践。 结论软件测试是SDLC的关键阶段,不可忽视,尤其是在DevOps和Agile方法参与之后。执行测试过程有点复杂,但是如果您了解自动化测试的最新趋势,则可以使整个测试过程变得更容易。在本文中,我们讨论了2020年将出现的7大自动化测试趋势。因此,请从这些趋势中寻求帮助,并使整个测试过程有效。 好文推荐: 整整127页!这是一份阿里云内部超全K8s实战手册 这应该是最全的K8s-Pod调度策略了 牛x公司有一群牛x的人,鹅厂大佬如何玩转技术?内附腾讯技术合集 年薪50W的Linux云计算工程师学习路线图,让你少走80%的弯路

June 9, 2020 · 1 min · jiezi