SegmentFault 最新的文章 |
- Windows 11 官宣,首次支持安卓 APP,全新应用商店机制抗衡苹果
- 中科院发布国产 RISC-V 处理器“香山”:已成功运行 Linux/Debian
- 阿里腾讯面试梳理&个人成长经历分享
- 2021年,让我们手写一个mini版本的vue2.x和vue3.x框架
- 我陪伴一起思否成长的日子 | 思否的九周年
- 如何平衡兴趣与收入 —— 听尤雨溪访谈有感
- 开源项目的 5 年长跑,runc v1.0 终于正式发布!
Windows 11 官宣,首次支持安卓 APP,全新应用商店机制抗衡苹果 Posted: 24 Jun 2021 08:17 PM PDT 在 5 月底举办的微软 Build 2021 大会上,微软 CEO 萨提亚 · 纳德拉表示正在测试 Windows 系统,这将是过去十年 Windows 最重要的一次更新。 6 月 24 日晚,Windows 11 正式官宣。除了前不久被泄露的界面更新外,Windows 11 还集成了 Microsoft Team、发布全新的 Microsoft Store,更重要的是首次将 Android 应用程序引入 Windows。 纳德拉表示,Windows 不只是一个操作系统,它还是平台创建者的平台 (platform for platform creators)。微软的野心一览无余。 UI 界面重新设计Windows 11 简化了界面设计和用户操作,使用全新的 "开始" 键和任务栏,图标居中。 此外,新一代 Windows 系统还推出了全新的贴靠布局、贴靠群组和虚拟桌面功能,帮助用户轻松访问所有应用以及进行多任务处理。用户可以更轻松地整理窗口和优化屏幕空间,在干净整洁的布局中按需查看内容,还可以单独创建虚拟桌面,并根据自己的喜好进行定制。 集成 Microsoft Teams,Widgets 回归Windows 11 将基于 Microsoft Teams 技术的 Chat 整合到任务栏中,提供新的人际连接方式。使用 Microsoft Teams,用户可以直接从桌面连接到想要联系的人。无论是在 Windows、Android 或 iOS 平台,用户都可以通过打字、聊天、语音或视频与所有的联系人,在任何地点、任何平台或设备上进行实时互联。 Windows 11 还展示了小工具的回归。其新推出的 Windows Widgets 是一项个性化提示功能,由 AI 及性能卓群的 Microsoft Edge 浏览器驱动。用户可以借助 Microsoft Edge 和众多小组件,快速及时地了解资讯、信息和娱乐内容。 全新 Microsoft Store,支持安卓应用Windows 11 推出了全新的 Microsoft Store,速度更快。用户可以更便捷地探索和发现应用程序、游戏、视频节目、电影等内容。 但微软的野心不止于此。 其全新的支付机制允许开发者绕过微软的支付机制,即微软零抽成。开发者也可以使用微软的支付机制在 Microsoft Store 上架应用和游戏,微软的抽成分别为 15% 和 12%,远低于苹果 APP Store。 此外,微软宣布将 Android 应用程序引入 Windows。今年晚些时候,用户能够在 Microsoft Store 中找到 Android 应用程序,并通过亚马逊应用商店下载。 纳德拉表示:平台只有在允许基础创新和类别创造的情况下,才能服务社会。正因为此,微软引入了新的 store 商业模式和策略,在 Windows 上支持更多 app,包括安卓 app。 免费升级,今年晚些时候推出除了以上介绍的亮点,Windows 11 还针对触屏进行了一系列优化,并对 Windows PC 游戏体验进行了改进,支持用户喜爱的 PC 游戏配件和外设。通过 Xbox Game Pass for PC 或 Xbox Game Pass Ultimate,玩家可以随时访问超过百款优秀的 PC 游戏,以及其它不断加入的新游戏。 微软称,Windows 11 支持免费升级,但对电脑系统有一定要求,最低系统要求见下图: 目前,Windows 11 尚未发布,将于今年稍晚些时候推出。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
中科院发布国产 RISC-V 处理器“香山”:已成功运行 Linux/Debian Posted: 24 Jun 2021 01:03 PM PDT 本周,首届 RISC-V 中国峰会在上海科技大学举办。这是 RISC-V 第一次在北美以外地区举办同等规模的峰会。在本届大会上,中科院大学教授、中科院计算所研究员包云岗公布了国产开源高性能 RISC-V 处理器核心——香山,其核心以"湖"来命名架构代号,第一代叫做"雁栖湖","雁栖湖"RTL代码于今年4月完成,计划于7月基于台积电28nm工艺流片。第二代架构叫做"南湖",将采用中芯国际14nm工艺,预计今年年底流片。北京微核芯参与了第一期的设计工作,目前团队正招募香山处理器二期联合开发合作伙伴,加入的企业已有字节跳动等公司。 作者 | 包云岗,2003年本科毕业于南京大学,2008年获中科院计算所博士学位,2010-2012年普林斯顿大学博士后,现为中科院计算所研究员,所长助理,先进计算机系统研究中心主任,中国科学院大学岗位教授,博士生导师,中国开放指令生态(RISC-V)联盟秘书长。 22号下午关于香山的报告,因为Zoom直播出现了技术故障,导致大家未能听到完整的报告,稍有些遗憾。考虑了一下,这里就把报告PPT直接贴出来,再加上我们在香山开发过程中的一些考虑和想法,跟大家分享。 这个报告主要回答四个问题:
一、为什么要做香山?2010年RISC-V诞生,迄今已有11年。如今,在RISC-V国际基金会网站上登记的各类商业或开源的RISC-V处理器核就有上百个(如下链接),为什么还要做一个开源的高性能RISC-V核? RISC-V Exchange: Cores & SoCs - RISC-V International 对于这个问题,我们和很多业界企业交流过,也做了很多调研与分析,这都让我们判断认为业界需要一个开源的高性能RISC-V核。另一方面,我们也在思考一个问题——为什么CPU领域还没有一个像Linux那样的开源主线?1991年开源的Linux诞生,到今天正好30年。如今,Linux不仅被工业界广泛应用,也成为学术界开展操作系统研究的创新平台。 RISC-V是开放开源的指令集,允许全世界任何人免费实现一个RISC-V处理器,可以是商用,也可以开源,这是和公司私有的X86/ARM指令集相比最大的区别之一。但是,十年过去了,到现在还未能形成一个像Linux那样的开源主线。Berkeley的BOOM目标是一个高性能开源RISC-V核,但是BOOM代码仓库相对不开放,官方建议其他人实现任何功能都要事先和他们沟通,以确保不要与他们的计划产生冲突。根据GitHub官方的统计页面显示,从2014年1月至今,为BOOM提交过超过100行代码修改的仅有8人。由此可见,一定程度上因为BOOM严格的外部贡献政策,开源社区对BOOM的参与度并不高。 所以,团队的唐丹博士和我一直认为要建立一个像Linux那样的开源RISC-V核主线,既能被工业界广泛应用,又能支持学术界试验创新想法。最关键的是,一定要让它像Linux那样至少存活30年! 于是,"香山"诞生了。 我们做了一年多的准备工作——申请经费,启动"一生一芯"计划培养人才,建立团队,寻找合作伙伴……这期间得到了太多太多人的支持和帮助:计算所孙凝晖院士帮我们多处找经费,国科大全力支持"一生一芯"计划,鹏城实验室支持我们建立起后端物理设计团队,多位计算所老所友毅然决定参与开源主线等等,就不一一列举了。 终于,香山正式启动了——2020年6月11日,香山在GitHub上建立了代码仓库。 短短的的一年时间里,25位同学和老师参与了香山的开发。821次主分支代码合并,3296次代码提交(commit),5万余行代码,400多个文档,记录了香山的成长过程。我们的理念是代码开源、流程开放、文档公开。这期间,有企业直接参与开发,也有企业表达参与意向,都因为认同开源理念,愿意一起来共建开源的香山。这些来自工业界的积极反馈,给予我们极大的鼓舞和信心,让我们更坚定地去践行"科研重工业模式"。 "科研重工业模式",是 2020年1月我为《中国计算机学会通讯(CCCF)》写了一篇卷首语《伯克利科研模式的启发》中提出的: 袁岚峰:CCCF卷首语 :伯克利科研模式的启发 | 包云岗 回顾伯克利的科研历程,可以发现他们在过去几十年研制了大量的原型系统,不仅推动了技术进步甚至颠覆产业,也培养了一代代杰出人才(其中多位获得图灵奖):1950年代CALDIC系统(Doug Englebart),1960年代Project Genie系统(Butler Lampson与Chuck Thacker),1970年代BSD Unix操作系统与INGRES数据库系统(Michael Stonebraker),1980年代RISC处理器(David Patterson),1990年代RAID存储系统与NOW机群系统……如果用一句话来总结伯克利的科研模式,那就是——热衷于研制真正能改变现状的原型系统,哪怕需要大量工程投入。国重主任孙凝晖院士称之为"科研重工业模式"。 "科研重工业模式",我们不想纸上谈兵,我们要用行动去实践。 二、香山什么水平?香山是一款开源RISC-V处理器核,它的架构代号以湖命名。第一版架构代号是"雁栖湖",这是带有浓重国科大情节的同学们起的名字,因为他们研一都在怀柔雁栖湖待了一年。"雁栖湖"RTL代码于2021年4月完成,计划于7月基于TSMC 28nm工艺流片,目前频率为1.3GHz。 第二版架构代号是"南湖",这是向建党100周年致敬。"南湖"计划在今年年底流片,将采用中芯国际14nm工艺,目标频率是2GHz。 香山选择什么开源许可证?这个问题纠结了我们好一阵子。后来,我们专门向北京大学周明辉教授请教,小伙伴们制定了4种开源许可证方案。在反复对比权衡后,最终选择了如下表格中的方案①——木兰宽松版许可证(MulanPSLv2)。在此,特别感谢北大周明辉老师的专业指导! 开源许可证方案对比(徐易难整理) "雁栖湖"架构是一个**11级流水、6发射、4个访存部件的乱序处理器核。**在发射宽度上已经可以和一些ARM高端处理器核相当,但还未进行充分优化,因此实际性能还有不小的差距。我们希望未来通过持续迭代优化("南湖"-->"X湖"-->"Y湖"-->……),性能达到ARM A76的水平。 我们基于GitHub CI构建了一套流程化的自动回归测试框架,并在过去大半年不断增加测试负载,从cputest,risc-tests到Linux,到SPECCPU workload。这套自动回归测试框架在保障和验证芯片的正确性。 每个大项目总会有一些激动人心的时刻,这段30秒的小视频记录了香山在FPGA上启动Linux/Debian的时刻,略带喜感。 三、香山怎么做的?香山开发初期速度非常快:6月11日建立代码仓库,7月6日乱序流水线便已完成,能正确运行CoreMark,不到一个月时间;9月12日,Linux正确启动;10月22日,Debian正确启动。 接下来便是大半年的结构优化、性能调优、时序优化工作,香山架构几乎相当于重构了一遍。一个典型的例子,香山的第一版分支预测器(BPU)参考了BOOM的BPU,但后端评估频率只能达到800MHz(TSMC 28nm)。于是负责BPU设计的勾凌睿在几位老师的指导下,不断优化BPU结构,最终将频率提升到了1.4GHz。 这期间,小伙伴们纷纷自己动手,开发了各种各样的优化和调试工具,大大地加速了优化和验证环节。这让我真心佩服这批90后——他们真是充满了创造力,从工作到生活,而主要驱动力之一就是"省(tou)时(lan)"。比如宁可自己写个程序自动点外卖,也懒得打开手机看菜单点。 香山的开发至少有两个重要的决策,第一个便是选择敏捷设计语言Chisel。很多人质疑Chisel,排斥Chisel,但是我们在充分评估后,还是决定使用Chisel。 我们团队是在2016年开始使用Chisel,一开始组里也充满质疑。2018年,我们设计了两组定量的对比实验,找了2位同学用Chisel、1位工程师用Verilog分别设计一个L2 Cache模块。通过一系列量化对比,得出了如下三个结论:
后来将实验结果发表在2019年1月的《计算机研究与发展》。最近去华为交流,才知道这些对比结果也推动了华为内部组建了Chisel开发团队,如今华为也是Chisel的支持者。 2020年,我们又基于Chisel完成了一款8核标签化RISC-V处理器的流片,这是基于Rocket处理器核进行了标签化体系结构改造,采用TSMC 28nm工艺流片。虽然因为时间紧张,并没有进行细致的后端优化,但芯片返回后也还能正常运行在1.2GHz。这是一颗有一定复杂度的8核SoC芯片,但Chisel能应对。所以,我们相信Chisel可用来开发复杂芯片。 在开发香山的过程中,我们团队积累了丰富Chisel开发经验。小伙伴们(徐易难、王凯帆、蔺嘉炜、余子濠、金越)准备了6个报告,将会在6月25日的CCC Workshop上和大家分享。 另一个重要决策就是高度重视构建支持敏捷设计的流程与工具。 我们在开发香山的过程中,一直在强调流程、平台、基础设施的重要性。我更多是扮演了啦啦队队长的角色,而小伙伴们则真正将理念落实到了具体行动。 为了更好地支持Chisel开发与调试,为了更快地捕捉、复现和定位bug,为了更准确地评估优化技术的性能收益,小伙伴们开发十余种各具特色的工具。这些工具支撑起了一套处理器芯片敏捷开发的流程。当然,这套流程还比较初级,尚不系统化。我们也期待更多的开源开发者加入,一起完善这套敏捷设计流程。 下面举几个工具的例子。NEMU是由余子濠在南大本科时便开始开发的一款教学模拟器。在计算所读博期间,他凭借一人之力一直在持续改进和优化NEMU,使NEMU成为一个效率接近QEMU的高性能解释器——启动Debian甚至比QEMU还要快18.2%(9.87s vs. 12.07s)。 更重要的是NEMU是指令解释器,可以针对每一条指令进行动态分析;相比而言,QEMU的翻译粒度是基本块,无法跟踪每一条指令。事实上,NEMU的这种指令解释器机制,成为了香山开发中正确性验证框架Difftest的基础。(余子濠将会在6月23日下午介绍NEMU) Cache是处理器中非常核心的模块,尤其是要支持一致性协议的Cache更为复杂。为此,小伙伴们开发了一套专门验证支持TileLink一致性协议的Cache模块测试框架Agent Faker,发现了好几个Cache模块的bug。(张传奇将会在6月25日上午介绍这个工作) Difftest是一个基于NEMU的指令集在线差分验证框架。它的一端是模拟器,提供处理器执行的黄金标准;另一端是运行RTL的仿真器,在仿真过程中会将指令数、中断、MMIO、微结构状态等信息发送给NEMU进行比对,从而判断RTL实现的正确性。 Difftest最早是由余子濠实现,后来王凯帆进行优化,其中一个最重要的改进就是SMP-Difftest,支持多核SMP的全系统仿真,并且支持Cache一致性、内存一致性等需要软硬件协同的问题。(王凯帆将会在6月24日下午介绍Difftest) 如何快速捕捉、复现、定位bug是调试过程中非常关键的步骤,很多时间都是消耗在这个阶段。小伙伴们提出了一种创新的轻量级仿真快照技术——把整个仿真程序看成是一个进程,利用fork机制创建子进程。然后父进程继续执行,子进程暂停。当父进程出错时,则可以恢复到子进程进行调试。LightSSS这个机制和Verilator仿真器自带的Savable机制相比,单次快照时间缩短了近7000倍!(余子濠将会在6月23日下午介绍LightSSS) 很多人质疑Chisel不方便调试。小伙伴们则充分利用了Chisel的可以自定义Firrtl Transform的特点,设计了一套新型的硬件敏捷调试栈,可将基于波形的调试转换为基于事件的调试。我们设计了一套工具,可以直接将高层语义新型从波形中提取出来,并进行可视化。为此,还专门设计了一个Xiang语言。(蔺嘉炜将在6月23日下午介绍该工作) 处理器性能优化环节最关键是要快速准确地评估优化技术带来的性能收益。如果评估过程需要几天时间,那将会严重影响迭代优化效率。小伙伴们设计了一个敏捷性能评估框架BetaPoint,它利用了三个机制——Sampling机制、Generic Full System Checkpoint机制和Functional Warmup机制,实现了可以在10个小时内估算出处理器的SPEC分数。(周耀阳将会在6月23日傍晚介绍BetaPoint) 整个香山开发团队将在这次峰会上和大家分享22个技术报告。这些报告都是清一色的90后,很多都是95后:勾凌睿、胡博涵、金越、李昕、刘志刚、蔺嘉炜、王华强、王诲喆、王凯帆、徐易难、余子濠、张传奇、张发旺、张林隽、张紫飞、张梓悦、周耀阳、周意可、邹江瑞;此外还有多位参与香山开发的同学这次并没有投稿。这些小伙伴们在香山的开发过程中做出了不可替代的贡献。 四、香山未来如何发展?目前香山正在进行下一代架构"南湖"的开发,目标是今年年底流片,基于中芯国际的14nm工艺频率达到2GHz,SPECCPU分值达到10分/GHz。这是一个很有挑战的目标,需要对架构进行大幅度的优化改进。 前几天,小伙伴们专门去了一趟嘉兴南湖,研讨香山未来的发展。除了技术,我们再一次聚焦到流程与平台。此前构建的敏捷设计流程与平台支撑了20多人的开发团队,这远远不够。现在我们需要考虑的是该如何构建一套开源、开放、规范的开放流程,能支撑2000人的开源社区一起开发。 支持成千上万人一起开发开源软件,这已经有成功的经验。但是如何支持数千人一起开发开源处理器,目前还没有可以参考的案例,只能靠我们自己摸索。也期待各界专家给我们更多的指导和建议。 我们有一个愿望——希望"香山"能存活30年;我们有一个约定——30年后再一起聚聚,到时再看看香山会变成什么样。但是,要实现这个愿望,还有很多很多问题和挑战需要去解决。 真诚地期待有更多伙伴加入香山的开发队伍! 香山是在中科院计算所、鹏城实验室的支持下,通过中国开放指令生态(RISC-V)联盟联合业界企业一起开发一款开源高性能RISC-V处理器核,也得到了北京智源人工智能研究院的支持。在此,要特别感谢北京微核芯公司的资深专家给予香山的开发强力的支持,他们非常认同开源理念,也是第一家与香山联合开发的企业。很高兴"南湖"架构的开发有了更多的合作伙伴,感谢对香山的支持。 欢迎联系我们一起加入香山开源社区! 五、花絮
最后几句有幸和阿里巴巴的戚总(戚肖宁)一起担任首届RISC-V中国峰会的联席大会主席,但其实幕后是中科院软件所和上海科技大学的老师们为这次峰会的筹备和保障工作付出了巨大的努力。 由于疫情带来极大的不确定性,组委会始终保持高度紧张状态:一开始只开放了大约1500位线下参会名额,但很快就报满了;后来又开放了两次补报机会,但每次也只开放了200个名额,最后一共是2600人次(有的同时报名参加主会和分会)。 但即使如此,最后因为广东那边的疫情原因,不得不安排大家远程参会。在此,对未能报上名的朋友说声抱歉,对报上名但因为疫情而选择放弃现场参会的朋友道声感谢。不过这次峰会提供了4个直播渠道,全程直播101个报告,并在后续会有视频回放。很抱歉直播中间也遇到了一些技术问题(有些上午调试好了下午还出错),在此再说声抱歉。 特别感谢中科院软件所的吴伟老师和武延军老师,他们为筹备这次峰会而殚精竭虑,真的付出太多了。感谢上海科技大学信息学院周平强院长,协调上海本地各方资源,全力支持和保障峰会的顺利召开。也要感谢所有为峰会默默付出的筹备组成员和志愿者们! 大家因RISC-V而汇聚到一起,正是因为RISC-V所带来的开源、开放、共享、共治是大家的共识,也是因为RISC-V为我们带来了无限的想象空间。如今,RISC-V已在中国蓬勃发展,中国也在RISC-V生态中贡献越来越多的力量——首届RISC-V中国峰会就是最好的写照。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 03 Apr 2021 11:35 PM PDT 前言好久没有更新了,最近忙着面试,写毕业设计和论文。 不过不想停下记笔记的习惯,所以偷偷的发面经,然后"惊艳"老铁们。 校招面经,面试难度中等,看官老爷们看个热闹就行。 历经一个月战线,投了阿里和腾讯,具体部门这里不展开了,都是核心部门,提供的舞台很大,至于最后选择去哪一家公司,可以关注文末。 接下来复盘一下这一个月来的面试感受吧。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2021年,让我们手写一个mini版本的vue2.x和vue3.x框架 Posted: 24 Jun 2021 07:15 AM PDT mini版本的vue.js2.X版本框架模板代码首先我们看一下我们要实现的模板代码:
逻辑代码然后就是我们要编写的javascript代码。
运行效果我们来看一下实际运行效果如下所示: 思考一下,我们要实现如上的功能应该怎么做呢?你也可以单独打开以上示例: 点击此处。 源码实现-2.xminiVue类首先,不管三七二十一,既然是实例化一个
现在,让我们先初始化一些属性,比如data,methods,options等等。
初始化完了之后,我们再来思考一个问题,我们是不是可以通过在vue内部使用this访问到vue定义的数据对象呢?那么我们应该如何实现这一个功能呢?这个功能有一个专业的名词,叫做代理(proxy)。 代理数据因此我们来实现一下这个功能,很明显在这个miniVue类的内部定义一个proxy方法。如下:
接下来,我们需要知道一个api,即
接下来,我们来看一下这个
定义好了之后,我们只需要在miniVue类的构造函数中调用一次即可。如下:
代理就这样完成了,让我们继续下一步。 数据响应式观察者observer类我们需要对数据的每一个属性都定义一个响应式对象,用来监听数据的改变,所以我们需要一个类来管理它,我们就给它取个名字叫
我们需要给每一个数据都添加响应式对象,并且转换成getter和setter函数,这里我们又用到了
接下来我们来看
好的,让我们继续下一步。 依赖类
接下来,我们来思考一下,依赖类里面,我们需要做什么,首先根据
接下来,就需要实现
Dep类算是完了,接下来我们就需要另一个类。 Watcher类那就是为了管理每一个组件实例的类,确保每个组件实例可以由这个类来发送视图更新以及状态流转的操作。这个类,我们把它叫做
再次思考一下,我们的Watcher类需要做哪些事情呢?我们先来思考一下
ok,知道了使用方式之后,我们就可以在构造函数内部初始化一些东西了。如下:
然后Watcher类就多了一个update方法,接下来让我们来看一下这个方法的实现吧。如下:
编译类compiler类初始化到了这一步,我们就算是完全脱离vue源码了,因为vue源码的编译十分复杂,涉及到diff算法以及虚拟节点vNode,而我们这里致力于将其最简化,所以单独写一个Compiler类来编译。如下:
注意:这里的编译是我们自己根据流程来实现的,与vue源码并没有任何关联,vue也有compiler,但是与我们实现的完全不同。 定义好了之后,我们在miniVue类的构造函数中实例化一下这个编译类即可。如下:
好的,我们也看到了使用方式,所以接下来我们来完善这个编译类的构造函数内部的一些初始化操作。如下:
compile方法初始化操作算是完成了,接下来我们来看compile方法的内部。思考一下,在这个方法的内部,我们是不是需要拿到所有的节点,然后对比是文本还是元素节点去分别进行编译呢?如下:
这里,我们需要2个辅助方法,判断是文本节点还是元素节点,其实我们可以使用节点的nodeType属性来进行判断,由于文本节点的nodeType值为3,而元素节点的nodeType值为1。所以这2个辅助方法我们就可以实现如下:
编译文本节点接下来,我们下来看
接下来,让我们思考一下,我们编译文本节点,无非就是把文本节点中的
编译文本节点到此为止了,接下来我们来看编译元素节点的方法。 编译元素节点指令首先,让我们想一下,我们编译元素节点无非是想要根据元素节点上的指令来分别执行不同的操作,所以我们编译元素节点就只需要判断是否含有相关指令即可,这里我们只考虑了
这里又涉及到了一个
接下来,我们来看最后的
最后,让我们来思考一下,我们update里面需要做什么。很显然,我们是不是需要判断是哪种指令来执行不同的操作?如下:
v-text指令好的,我们知道,根据前面的编译文本元素节点的方法,我们就知道这个指令的用法同前面编译文本元素节点。所以这个判断里面就好写了,如下:
v-model指令v-model指令实现的是双向绑定,我们都知道双向绑定是更改输入框的value值,并且通过监听input事件来实现。所以这个判断,我们也很好写了,如下:
v-on:click指令v-on:click指令就是将事件绑定到methods内定义的函数,为了确保this指向当前组件实例,我们需要通过bind方法改变一下this指向。如下:
到此为止,我们一个mini版本的vue2.x就算是实现了。继续下一节,学习vue3.x版本的mini实现吧。 mini版本的vue.js3.x框架模板代码首先我们看一下我们要实现的模板代码:
逻辑代码然后就是我们要编写的javascript代码。
运行效果我们来看一下实际运行效果如下所示: 思考一下,我们要实现如上的功能应该怎么做呢?你也可以单独打开以上示例: 点击此处。 源码实现-3.x与vue2.x做比较事实上,vue3.x的实现思想与vue2.x差不多,只不过vue3.x的实现方式有些不同,在vue3.x,把收集依赖的方法称作是副作用 reactive方法首先,我们来看一下vue3.x的响应式方法,在这里,我们仍然只考虑处理对象。如下:
接下来我们需要使用到es6的proxyAPI,我们需要熟悉这个API的用法,如果不熟悉,请点击此处查看。 我们还是在getter中收集依赖,setter中触发依赖,收集依赖与触发依赖,我们都分别定义为2个方法,即track和trigger方法。如下:
track方法track方法就是用来收集依赖的。我们用es6的weakMap数据结构来存储依赖,然后为了简便化用一个全局变量来表示依赖。如下:
收集依赖就这么简单,需要注意的是,这里涉及到了es6的三种数据结构即WeakMap,Map,Set。下一步我们就来看如何触发依赖。 trigger方法trigger方法很明显就是拿出所有依赖,每一个依赖就是一个副作用函数,所以直接调用即可。
接下来,我们来实现一下这个副作用函数,也即effect。 effect方法副作用函数的作用也很简单,就是执行每一个回调函数。所以该方法有2个参数,第一个是回调函数,第二个则是一个配置对象。如下:
副作用函数就是如此简单的实现了,接下来我们来看一下computed的实现。 computed的实现既然谈到了计算属性,所以我们就定义了一个computed函数。我们来看一下:
到此为止,vue3.x的响应式算是基本实现了,接下来要实现vue3.x的mount以及compile。还有一点,我们以上只是处理了引用类型的响应式,但实际上vue3.x还提供了一个ref方法用来处理基本类型的响应式。因此,我们仍然可以实现基本类型的响应式。 ref方法那么,我们应该如何来实现基本类型的响应式呢?试想一下,为什么vue3.x中定义基本类型,如果修改值,需要修改xxx.value来完成。如下:
从以上代码,我们不难得出基本类型的封装原理,实际上就是将基本类型包装成一个对象。因此,我们很快可以写出如下代码:
这就是基本类型的响应式实现原理,接下来我们来看一下mount方法的实现。 mount方法mount方法实现挂载,而我们的副作用函数就是在这里执行。它有2个参数,第一个参数即一个vue组件,第二个参数则是挂载的DOM根元素。所以,我们可以很快写出以下代码:
这样就是实现了一个简单的挂载,接下来我们来看一下编译函数的实现。 update编译函数这里为了简便化,我们实现的编译函数就比较简单,直接就将定义在组件上的render函数给赋值给根元素的
如此一来,一个简单的mini-vue3.x就这样实现了,怎么样,不到100行代码就搞定了,还是比较简单的。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 24 Jun 2021 02:56 AM PDT 故事的开始
初见思否
这段日子,给我养成了一个好习惯,遇到工作上不懂的点,我一定会去了解他的原理,为什么会这样,所以这么久的沉淀,我可以这样说,现在公司的
首次爆发
渐入佳境
如影随形
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Jun 2021 07:05 PM PDT
采访尤雨溪的这期标题是如何从一个想法发展成整个JS社区生态。 主要讲述了尤雨溪的成长历程, 这次访谈最让我印象深刻的是:尤雨溪在人生的几个关键节点上是如何做出选择的。 一句话总结:尤从求学到工作的每个关键节点,都是平衡兴趣与收益后的利益最大化选择。 如果你正面临选择或身处迷茫,这篇文章或许可以为你提供一些有趣的视角。 大佬也是被爸"逼"的尤高中毕业就赴美求学,本科就读于 曾几何时,他也想将艺术作为职业方向。但是父亲指出了一个很现实的问题: 作为外国人,在艺术领域你很难找到提供工作签证的工作 就这个问题他与父亲发生了激烈的争吵,但最终不得不承认父亲是对的。 于是,硕士阶段,尤选择了 这是其结合兴趣与收益做出的第一个重要抉择,完成了从冷门的艺术专业向软件领域的靠拢。 错位竞争作为一个本科、硕士都是艺术相关专业,会编程的学生。在面临毕业时,如何才能找到好工作? 换做是你,会怎么做?思考十秒。 如果你能想到的,只是刷面经,投简历。那么以下内容值得你好好思考一下。 当时市面上正流行一款以流畅交互体验著称的 他的丝滑交互体验,使其在短时间内收获大量关注。 尤在看到这款 在研究了几天 注意接下来他做的事: 我制作了一个视频并发布到网上,大家为 不管是应届生还是在职求职,很多低学历或非本专业的朋友都在抱怨:大公司学历歧视、专业歧视。 但是,站在公司的视角,每天这么多人投简历,如何区分能力强弱? 显然学历、专业、工作年限是最简单粗暴的筛选方式。 但如果你能以某种方式证明自己的能力,并广而告之,那么在求职时就能跳出简单粗暴的筛选方式。 这也是为什么很多人升职、求职、创业前会写书的原因。 君不见, 探索兴趣导向的人生说回主题,凭借错位竞争,尤成功获得大公司关注,并在毕业后入职Google Creative Lab。 在这一时期,尤的工作主要是做各种试验性 随着在大公司的新鲜感减退,尤逐渐发现这份工作的局限性:只做项目原型,就无法参与项目的生产落地。 不面向终端用户的产品,始终是空中楼阁。 于是,尤决定独立开发一个项目。 这个项目的契机是:为了快速开发原型,需要提效的框架工具。 彼时 于是,一款以简单好用为目标的视图层框架被构思出来。几经辗转,最终命名为 从艺术到计算机的跨度,再到入职Google Creative Lab。兴趣导向加上错位竞争的理念为尤不断带来正反馈。 很自然的,尤开始思考:我可不可以全职从事 理想主义实干者很多人都有不上班,全职做自己感兴趣的事的美好愿望。 尤与他们不同的是,尤认真评估了可行性后,做出了实际的努力。 摆在面前的困难起码有三条:
让我们看看尤是如何步步规划,最终解决这三个问题的。 能否适应全职做开源的生活节奏从谷歌离职后,尤没有立刻全职开发 做远程工作不仅能提前适应全职搞开源的节奏(在家办公),也能为 正是在这一期间, 全职开源能否养活自己收入是最现实的问题。 当通过 Patreon是一家为艺术家和创作者募资的公司,其理论基础来源于Kevin Kelly的1000粉丝理论: 从事创作和艺术工作的人,如作家、摄影师只要能获得1000忠实粉丝就能维持生活。这1000位粉丝是那种认可你价值观,被你的内容吸引,愿意为你做口碑传播和知识付费的,你要做的就是找到、维护好他们 与此同时,尤还从一个朋友公司的开源基金会获得捐赠。 当他决定全职开发 如果失败了能否重回大公司当以上两个问题都解决后,第三个问题也不攻自破 —— 如果你能独立开发如此成功的项目( 启示当我知道尤雨溪时,他已经是大神了。 这就给我一种幻觉:大神一直是大神。我之所以不能全职做感兴趣的事,是因为我不是大神。 然而,剖析他的成长经历,我们看到的是一个有冒险精神的理想主义实干者,一个头脑清醒、规划清晰的普通人。 我始终觉得《The Pursuit of Happyness》翻译为《当幸福来敲门》并不妥当。 幸福不会自己来敲门,幸福需要审慎规划、大胆求证。 在此过程中,还需要平衡兴趣与收益、需要有错位竞争的意识、需要一点点与众不同的小勇气,需要有失败后的 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 22 Jun 2021 07:47 PM PDT 本文我来分享下与我们(搞容器化/K8S 从业者)息息相关的一个基础项目 runc 是如何自 2016 年发布了 v1.0.0-rc1 到现在历经 5 年长跑,从 rc1 一直到 rc95 ,如今终于正式发布 v1.0 版本的过程,及这中间的故事。 大家好,我是张晋涛。 在 2018 年 11 月底时,我写了一篇文章 《runc 1.0-rc6 发布之际》 , 那应该是我第一次公开介绍 runc。如果你还不了解 runc 是什么,以及如何使用它,请参考我那篇文章。本文中不再对其概念和用法等进行说明。 在 2019 年 3 月底时,我写了另一篇文章 《runc 1.0-rc7 发布之际》,介绍 runc 1.0-rc7 发布的原因,及那个版本中最主要的修复 关注我的朋友们,应该也在 K8S 生态周报 中多次看到过我对 runc 的介绍,包括其特性及安全漏洞等方面。 在 2015 年 6 月, Docker ,CoreOS 和其他一些公司共同成立了 OCI (开放容器计划) 组织,其最主要的内容有两个:
Docker 将其运行时捐赠给了 OCI ,作为容器运行时规范的基础实现,托管在了 https://github.com/opencontai... 也就是现在大家看到的 runc 了。 发布历程我们来看看 runc 版本发布的历程,以便了解它为何长跑 5 年。
我在上面的表格中,专门增加了一列 runtime-spec version ,表示 OCI 组织中的容器运行时规范的版本。我们来总结下这个发布进程:
从这里看到的三个主要耗时的点如下:
规范未发布 v1.0 耗时的部分这里就不多说了,这也是个依赖项,对于大多数的项目/软件开发都会有类似的情况,只能去推动规范的发布了; 至于特性,bug 和安全漏洞等的耗时,这其实跟 runc 项目的功能和其定位有关。runc 偏底层了一些,这就需要有更多相关领域的知识来支撑。就拿我在 runc v1.0-rc 91 中发现的那个bug 来说,对 Linux 内核源码不太了解的人,确实会花费比较多时间的。
有趣的是 runc v1.0 版本 Release 的标题是 "A wizard is never late, nor is he early, he arrives precisely when he means to." 这大概也很符合 runc 的发布历程了吧 :) 但无论如何,runc 经过 5 年长跑,终于发布了 v1.0 版本!感谢每一个为之付出过的小伙伴! 欢迎大家下载更新! https://github.com/opencontai... 欢迎订阅我的文章公众号【MoeLove】 |
You are subscribed to email updates from SegmentFault 最新的文章. To stop receiving these emails, you may unsubscribe now. | Email delivery powered by Google |
Google, 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States |
No comments:
Post a Comment