1、解析URL:首先会对 URL 进行解析,分析所需要使用的传输协议和请求的资源的路径。如果输入的 URL 中的协议或者主机名不合法,将会把地址栏中输入的内容传递给搜索引擎。如果没有问题,浏览器会检查 URL 中是否出现了非法字符,如果存在非法字符,则对非法字符进行转义后再进行下一过程。
2、缓存判断:浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么就直接使用,否则向服务器发起新的请求。
3、DNS解析: 下一步首先需要获取的是输入的 URL 中的域名的 IP 地址,首先会判断本地是否有该域名的 IP 地址的缓存,如果有则使用,如果没有则向本地 DNS 服务器发起请求。本地 DNS 服务器也会先检查是否存在缓存,如果没有就会先向根域名服务器发起请求,获得负责的顶级域名服务器的地址后,再向顶级域名服务器请求,然后获得负责的权威域名服务器的地址后,再向权威域名服务器发起请求,最终获得域名的 IP 地址后,本地 DNS 服务器再将这个 IP 地址返回给请求的用户。用户向本地 DNS 服务器发起请求属于递归请求,本地 DNS 服务器向各级域名服务器发起请求属于迭代请求。
4、获取MAC地址: 当浏览器得到 IP 地址后,数据传输还需要知道目的主机 MAC 地址,因为应用层下发数据给传输层,TCP 协议会指定源端口号和目的端口号,然后下发给网络层。网络层会将本机地址作为源地址,获取的 IP 地址作为目的地址。然后将下发给数据链路层,数据链路层的发送需要加入通信双方的 MAC 地址,本机的 MAC 地址作为源 MAC 地址,目的 MAC 地址需要分情况处理。通过将 IP 地址与本机的子网掩码相与,可以判断是否与请求主机在同一个子网里,如果在同一个子网里,可以使用 APR 协议获取到目的主机的 MAC 地址,如果不在一个子网里,那么请求应该转发给网关,由它代为转发,此时同样可以通过 ARP 协议来获取网关的 MAC 地址,此时目的主机的 MAC 地址应该为网关的地址。
5、TCP三次握手: 下面是 TCP 建立连接的三次握手的过程,首先客户端向服务器发送一个 SYN 连接请求报文段和一个随机序号,服务端接收到请求后向客户端发送一个 SYN ACK报文段,确认连接请求,并且也向客户端发送一个随机序号。客户端接收服务器的确认应答后,进入连接建立的状态,同时向服务器也发送一个ACK 确认报文段,服务器端接收到确认后,也进入连接建立状态,此时双方的连接就建立起来了。
6、HTTPS握手: 如果使用的是 HTTPS 协议,在通信前还存在 TLS 的一个四次握手的过程。首先由客户端向服务器端发送使用的协议的版本号、一个随机数和可以使用的加密方法。服务器端收到后,确认加密的方法,也向客户端发送一个随机数和自己的数字证书。客户端收到后,首先检查数字证书是否有效,如果有效,则再生成一个随机数,并使用证书中的公钥对随机数加密,然后发送给服务器端,并且还会提供一个前面所有内容的 hash 值供服务器端检验。服务器端接收后,使用自己的私钥对数据解密,同时向客户端发送一个前面所有内容的 hash 值供客户端检验。这个时候双方都有了三个随机数,按照之前所约定的加密方法,使用这三个随机数生成一把秘钥,以后双方通信前,就使用这个秘钥对数据进行加密后再传输。
7、返回数据: 当页面请求发送到服务器端后,服务器端会返回一个 html 文件作为响应,浏览器接收到响应后,开始对 html 文件进行解析,开始页面的渲染过程。
8、页面渲染: 浏览器首先会根据 html 文件构建 DOM 树,根据解析到的 css 文件构建 CSSOM 树,如果遇到 script 标签,则判端是否含有 defer 或者 async 属性,要不然 script 的加载和执行会造成页面的渲染的阻塞。当 DOM 树和 CSSOM 树建立好后,根据它们来构建渲染树。渲染树构建好后,会根据渲染树来进行布局。布局完成后,最后使用浏览器的 UI 接口对页面进行绘制。这个时候整个页面就显示出来了。
9、TCP四次挥手: 最后一步是 TCP 断开连接的四次挥手过程。若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。但是因为 TCP 连接是双向的,所以服务端仍旧可以发送数据给客户端。服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态。客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,就进入 CLOSED 状态。当服务端收到确认应答后,也便进入 CLOSED 状态。
复制代码
另外说到“卷”,还是上进心导致的,对吧?真想躺的话,能躺的办法还是挺多的。如果想要进前端的领域,从学习的角度来讲,我推荐 hard way。也就是说,我们看起来最难的那条路反而是最简单的,那些看起来简单的路,它有可能反而是更绕。你想往山顶上走,肯定选择最陡峭的,你想走下坡路,肯定选择最远的那条路。这个道理是是我想今天传达给大家的,原因还是在于看到太多的同学们想走捷径,或者说想走简单的路,结果反而越走越远,最后绕回来的话反而消耗更大。- 程劭非(winter)❞
谷歌在 Fuchsia OS 上投入了数百人,经过五年多的发展,Fuchsia OS 已经开始引起其他行业巨头的关注。最近,三星开始与谷歌合作开发该项目。很多人猜测 Fuchsia OS 未来可能会全面取代 Android 与 Chrome OS,而三星可能会成为最先抛弃 Android 改用 Fuchsia OS 的手机厂商。
谷歌 Fuchsia OS 是什么?
Fuchsia 是一套全新的操作系统,其项目定位一直在发展变化。
作为一套新的操作系统,Fuchsia 最初于 2016 年首次亮相于谷歌代码库与 GitHub,该项目完全开源:https://fuchsia.googlesource.com/。更重要的是,Fuchsia 并非基于 Linux 内核,而 Linux 内核又恰恰是 Android(谷歌打造的移动操作系统)与 Chrome OS(谷歌台式机与笔记本电脑操作)的核心基础。很明显,Fuchsia 承载着谷歌更大的野心。
在 2021 年,我们将继续深入研究音视频的底层原理,探索更多在 Web 浏览器能得到应用的技术,持续性地优化诸如音视频体验、音视频质量以及测试与定位等能力。结合 wasm,将之前无法想象的功能逐个实践、逐个实现落地。明年将与终端播放器一起对外进行开源。如果你恰好是 Web 音视频技术的使用者,千万不要错过!
低代码的场景天然的靶场就是在 B 端业务中进行抽象和实现。而随着产业互联网的提出,整个行业进入了 ToB 的转型期,未来的低代码会越来越受到大厂的重视。当然,低代码还是要持续解决三大问题:基础平台的能力完善、开发质量更加可控,以及低代码产物的可维护性提升。可以遇见的未来低代码会火爆的表现,并且会在生产中绽放光彩。
vuex 的 store 是什么? vuex 就是一个仓库,仓库里放了很多对象。其中 state 就是数据源存放地,对应于一般 vue 对象里面的 datastate 里面存放的数据是响应式的,vue 组件从 store 读取数据,若是 store 中的数据发生改变,依赖这相数据的组件也会发生更新它通过 mapState 把全局的 state 和 getters 映射到当前组件的 computed 计算属性。
vuex 的 getter 是什么? getter 可以对 state 进行计算操作,它就是 store 的计算属性虽然在组件内也可以做计算属性,但是 getters 可以在多给件之间复用如果一个状态只在一个组件内使用,是可以不用 getters。
this.r o u t e r 是 V u e R o u t e r 的 实 例 方 法 , 当 导 航 到 不 同 u r l , 可 以 使 用 t h i s . router是VueRouter的实例方法,当导航到不同url,可以使用this.router是VueRouter的实例方法,当导航到不同url,可以使用this.router.push方法,这个方法则会向history里面添加一条记录,当点击浏览器回退按钮或者this.$router.back()就会回退之前的url。
r o u t e 是 route是route是router跳转到的当前一个对象,里面包含该对象的path、query、name 、params
4、在接收收数据的地方通过 o n 接 收 广 播 的 数 据 V u e E m i t . on接收广播的数据 VueEmit.on接收广播的数据VueEmit.on(‘名称’,function(){})
3.适用场景
适用于父子组件、兄弟组件间进行传值。
本地传值
本地传值方式对于Vue而言有两种,一种是JS的localStorage,另一种Vuex。
路由传值
1.父组件push使用this.r o u t e r . p u s h 2. 在 子 组 件 中 获 取 参 数 的 时 候 是 t h i s . router.push 2.在子组件中获取参数的时候是this.router.push2.在子组件中获取参数的时候是this.route.params
C 和 C++执行效率很高,但是他们“没有规则”,Ashley Hauck 说,他是斯德哥尔摩的一名 Rust 程序员(在社区中人称“Rustacean”)。例如,没有任何措施可以防止 C 或 C++程序员错误地访问已经释放回操作系统的内存,或者避免程序两次释放同一块内存。仅仅是导致程序崩溃还好,最糟糕的是,它还可能返回无意义的数据或暴露安全漏洞。据微软的研究人员称,该公司每年修复的漏洞中有 70%与内存安全有关。
遵守设计规则
Rust 的模型可以根据规则将每一块内存分配给单个所有者,并强制控制访问权限。违反这些规则的代码也不会导致崩溃,因为它们不会被编译到。马里兰大学帕克分校的计算生物学家 Rob Patro 解释说:“它们有一个基于生命周期概念的内存管理系统,该系统让编译器在编译时跟踪内存的分配、释放、谁拥有它、谁可以访问它。”“得益于语言的设计方式,大量的错误在编译阶段就会被消除。”
当时才刚刚流行做节日 Logo 没有多长时间,那段时间正好我们的设计师没空,这个时候我们的部门老板就说了,沉鱼你会画漫画对吧?那你要不要给我们画个中秋节 Logo 呀?我想来想去,那就画吧!画了之后这个 Logo 就真的上线了,被非常多的人看到。这个绝对是我在前端这个行业里面,做为设计师的一个高光时刻了。
于是 Web 研发技术又重新回到了历史的舞台。当然最核心的那些 App 以及最核心的那些页面还是会用原生的 iOS 跟 Android 来开发。
大家可以看到,这个页面下面还放了一个 PWA,不知道有多少同学见过它,或者对它有体感。它是一个希望能用 Web 技术做 Native 应用的解决方案,是 Google 家的产品。到目前为止还没有看到 PWA 特别大规模流行的趋势,但它其实已经出来蛮多年了,大家可以关注一下。这几个技术的此消彼长,其实是蛮有意思的事情。
4、2015 年
时间飞快地来到了 2015 年,由于之前“无线 All In”的事情,从很多团队调派了人手,集中人力去做了这么一件大事,所以作为团队留守的一些成员来说是比较伤的,因为业务被裁撤,人员也减少了。
大家可以从左到右看一下,最早的是大屏可视化数据分析类的产品,这个是跟着大数据的浪潮来发展起来的;然后到中间人工智能的这一波浪潮,Data Works 大数据开发以及 Pai 人工智能可视化开发;到第三列的支付宝小程序 IDE 和我们的 H5 & 小程序建站 IDE,最年轻的两个 IDE 是我们的 Cloud IDE 也就是云 IDE,以及云凤蝶企业级应用设计研发平台。
除了这些程序向的 IDE 之外,还有一些其他的复杂 Editor 的出现,即下面以语雀为例的富文本编辑器以及电子表格等。所以如果我们今天回头来看整个前端的发展,会发现实际上是非常迅猛的。很多工作年限比较短的同学,甚至都无法想象在 2008 年我们前端面临的是那样的一个场景。
所以业界不是有句名言嘛,说凡是能用 JavaScript 做的东西,最终都会用 JavaScript 做一遍,包括现在的 IDE 都是用 JavaScript 在写了,所以还挺神奇的。
6、2020 年
大家可能会说,你们前端这么牛,你们怎么不上天?其实确实上天了,大家可以看一下,2017 年 NASA 就已经上船 Node.js 了;在刚刚过去的 Space X 的发射中,大家也发现他们使用了前端的相关技术来做触控大屏。当然这条推文仅供大家娱乐一下,因为这条推文其实并不是 Space X 的工作人员发的,而是 Google 的一个程序员发的。
说到开放的组件体系,什么叫开放?意思是说凡是在 Pro Code 的世界里开发的组件,都可以通过简单的导入操作在云凤蝶里面使用。这个听起来非常的好,对不对?我们没有必要重复造轮子,所有在 Pro Code 世界里非常好的东西,我们都能拿过来用。
但实际上要让用户能够用得这么简单,难度是非常大的,因为一个小小的 npm 组件的导入,就有非常多的工作要做。比如说组件规范是什么?如何解析这个 npm 组件?解析后要不要做构建?构建!因为我们不可能像 Pro Code 里一样,在用户发布的时候说,等一等我跑个 10 分钟构建。
一般来说我们希望它是秒级发布的,所以我们需要提前把构建的工作做好。再比如一个 npm 组件的属性编辑怎么做?这些其实还都只解决了我们手工操作的问题。我们最终希望,一个 Pro Code 的同学,他每天写这些组件、发布这些组件,我们能不能让他发的时候就直接发到我们这个平台上来,这样的话无论是用 Pro Code 写代码,还是用云凤蝶做搭建,它都可以用,这是一个非常好的想法,所以我们最近也在做研发链路的打通。
在组件的世界里面,其实有一个最让大家头疼的事情就叫做版本升级,很多产品的版本碎片化非常严重,包括我们自己的 Pro Code 的很多组件库也是这样。
在云凤蝶中我们就定了一个原则,那就没有版本碎片,我们是强制用户升级的,我们用了一个 Codemod 技术,把所有的组件无缝升级了,用户看到提示的时候,只需要无脑点升级就可以。这其实是非常好的尝试,我们在这些尝试的过程当中,也跟 Pro Code 的同学有一些交流、沟通,甚至有一些反哺。
比如说后续 Pro Code 的同学可能也会尝试做版本的 Codemod,我们也能反推 Pro Code 的一些组件规范的提升。这个时候开放的组件体系就真正地把 Pro Code 跟 Low Code 融合在一起了,我们能够共享其中的产出。
所以我们就希望让机器去承担这一类重复劳动,包括设计。大家可以看一下我们现在在做的一个能力:这是一个表单,选择了一个 API 之后,你可以选择要填写的字段,然后它会根据 API 的元信息以及它的 API结 构自动生成这个表单。当然这是一个非常简单的演示,大家可以看到,该有的校验、排版之类的全部都是机器一键自动生成的。
第四点讲一讲 Pro Code 跟 Low Code 的混合研发。很多时候像云凤蝶这样的 Low Code 产品,虽然我们想了非常多的创新点,想了非常多的解决用户痛点的点,但无论怎样,“你就是个拼多多,我就爱用天猫,我就不用你拼多多”。怎么办?这就不是技术问题了,这是一个用户信心建立的过程。
我们就做了一套方案,基于微前端的架构,把 Pro Code 和 Low Code 的应用给联合起来,作为一个开发者,他只需要随心地去选择合适他自己的研发方式就可以了。
我们看到下面这个是云凤蝶自己的一个产品页面,左边是我们的 IDE,是用 Pro Code 研发的,右边代表了所有一系列除 IDE 的其他页面全部都是用云凤蝶自举的。这个时候确实也不适合用某种单一的研发方式来完成我们的研发工作,而两者混合可能确实是最好的解决方案。这个解决方案实际上也解决了用户信心的问题。
比较有趣的地方是,一开始用户对我们信心不足,然后我们做了这个混合研发的架构,一段时间之后我们发现云凤蝶的智能表单、表格太受欢迎了,Pro Code 的同学也不想自己写了,他们说云凤蝶能不能做组件级的混合呀,在云凤蝶上的某个组件,能够嵌到 Pro Code 的代码里面去,Pro Code 的 npm 包也能嵌到云凤蝶里面来?
那么对于未来的企业研发模式,我们认为它是怎么样的呢?就是右边这张图,上面是现状,有大量的 Pro Design、Pro Code。云凤蝶去年下半年发了第一个版本之后,去年大概有差一点不到 20% 的业务是由云凤蝶来承载的。
这对云凤蝶来说非常不容易,我刚刚讲了,我们上面有 OB 这样的业务在,所以要承载很多复杂应用的研发是很大的一个挑战。在去年数据里,有 40% 的产物是通过机器来做设计研发的,大概 60% 是人工。
我们希望未来大概是下面这张图的样子,首先 Pro Code 跟 Low Code 是能够进一步融合的,它们之间能产生实实在在的关联。
比如说能把 Pro Code 产出的组件放到云凤蝶里使用,同时云凤蝶也有非常多的天然优势,它能够非常精准地收集用户的需求以及用户的使用数据,能够给 Pro Code 的同学非常多的反馈,能促成一个良性循环。
慢慢地 Pro Design 和 Pro Code 的这些同学会去处理越来越复杂的场景,对于常规的研发工作来说,我们会慢慢收口到像云凤蝶这样的平台上面,并且未来在云凤蝶上可能有 70% 的工作是由机器去完成的,剩下的 30%,一部分是设计师来参与,一部分是工程师来参与。我们希望云凤蝶能够为中后台应用研发提效,让大家有更多的时间和机会去参与更加有挑战的事情。
大家自己想清楚自己要什么就好了,如果仅仅是因为觉得不带团队了可能就没有前途了之类的,其实并没有这个必要。我们团队就有非常多的高 P 的独立研发者在公司里面工作,工作得非常好、非常开心,他们也没有带团队,这其实是看个人的发展的。而且如果带团队让你感觉很痛苦的话,可能确实不带团队会比较好一些,这是第一点。
另外如果说,你实在觉得没有太多的发挥之处了,比如说你每天在家扫地,扫地机器人这玩意你要是能想到可能特别牛,如果要是想不到的话,可能还是在家每天扫地,觉得没有什么价值感,可能确实得停下来想想自己想做的这个事的价值到底是什么。最后如果觉得还是想不清楚,跟别人聊了也很迷茫的话,建议去看一看其他团队,那些你觉得做得特别好的、有活力的团队,他们是怎么做的,或者说换个环境也是 OK 的。
3、为什么是 API 到产物,而不是 UI 到产物?B 端跟 C 端的产品又有什么样的区别?
在我们公司内部有一个叫做 API 平台的东西,集合了公司所有能用的 API 以及一些 API 的元信息,这个元信息虽然说不全,但是在云凤蝶里面是能够补全的。元信息是什么?比如有一个叫做 userId 的字段,它可能是员工 id,当你有这样一些元信息的时候,你对 API 的理解就会更加丰富一些,你从这个 API 生成的产物,第一,它是集合了我们设计团队对整个设计规则的理解,也就是机器来做设计;第二,因为我们知道 API 上很多的元信息,所以更加能理解业务,能做出来直接可以做最后交付的东西。
B 端和 C 端的产品区别,笼统一点来说,我觉得 B 端的产品更多是完成功能性的需求,对于设计的特殊性要求是没有那么高的,但是并不意味着我们对品质的要求就低。因为你看我们有那么多对外的商业的 toB 的产品,那就必然意味着它的要求是很高的。
而且 B 端的逻辑可能复杂到难以想象,很多时候做 C 端的同学会觉得 B 端非常简单,就是做表单、表格,但是当你面临 800 个字段的表格、表单的时候,你要怎么搞?这个事情可能在 C 端是很难想象的。对于 C 端来说,它同样有非常多的挑战,比如说设计的新颖性、先进性,包括 C 端的体量非常大,这个体量可能是 B 端没有办法去比的,这就得具体问题具体看了。
4、身边的程序员是否都大部分都坚持了本行?有没有其他人转行的?转行的同学又是去做了什么?
我认识的大部分人可能都还是比较 Geek 的,所以很多人都还坚持在写代码的一线,包括一些高 P 的同学,也都在每天写代码。但是也有转行的,不是说程序员这条路一定要一条路走到黑,大家可以根据自己的规划去走。
由于是直播相关的 electron 项目,存在音视频流,和一些底层 OS 操作,那么我们是否可以以麦克风视图开关对于音频流的处理为例子,把 OS 的一些操作与数据做一个映射层,就像数据和视图存在映射关系一样,那么数据的流动就是 view -> 触发action -> 数据改变 -> 改变视图 -> 进行 os 操作
为了确保大脑的清醒和减肥,我采取的是轻食。尽量不吃高 GI 食物,如过度加工过的食物,米饭等等,尽量吃低 GI 食物。GI 其实是血糖指数(glycemic index, GI)的英文缩写,也译作血糖生成指数。主要原理是当人血糖过高或者过低时候,会容易犯困,大脑运转速度变慢。所以要保持血糖的一定稳定,就能减少疲惫感,使效率更高。顺便可以达到减肥效果。
我们可以直接在 HTML 代码中内联注册这些事件的事件监听器(<permission type="…" onpromptdismiss="alert('The prompt was dismissed');" />),或者在 <permission> 元素上使用 addEventListener():
<permission type="camera" />
<script>
const permission = document.querySelector('permission');
permission.addEventListener('promptdismiss', showCameraWarning);
function showCameraWarning() {
// Show warning that the app isn't fully usable
// unless the camera permission is granted.
}
const permissionStatus = await navigator.permissions.query({name: "camera"});
permissionStatus.addEventListener('change', () => {
// Run the check when the status changes.
if (permissionStatus.state === "granted") {
useCamera();
}
// Run the initial check.
if (permissionStatus.state === "granted") {
useCamera();
}
});
</script>
你觉得这个新html元素z