2019-2021 美团技术年货 前端篇715 让 Flutter 在鸿蒙系统上跑起来 作者:杨超 前言 鸿蒙系统 (HarmonyOS)是华为推出的一款面向未来、面向全场景的分布式操作系 统。在传统单设备系统能力的基础上,鸿蒙提出了基于同一套系统能力、适配多种终 端形态的分布式理念。自 2020 年 9 月 HarmonyOS 2.0 发布以来,华为加快了鸿 蒙系统大规模落地的步伐,预计 2021 年底,鸿蒙系统会覆盖包括手机、平板、智能 为迎接鸿蒙系统后续的大规模推广也提前做好了技术储备。 当然,故事到这里并没有结束。在最基本的运行和交互能力之上,我们更需要关注 Flutter 与鸿蒙自身生态的结合:如何优雅地适配鸿蒙的分布式技术?如何用 Flutter 实现设备之间的快速连接、资源共享?现有的众多 Flutter 插件如何应用到鸿蒙系统 上?未来 MTFlutter 团队将在这些方面做更深入的探索,因为解决好这些问题,才是 js(1.1M),各页面的业务代码 xxx.part.js(使用 FutureBuilder 后)、图片文 件。直接应用这些资源到项目中,会遇到以下问题: ● 功能无法及时更新:浏览器对同名文件的缓存,可能导致程序代码不被及时更 新或者出现执行错乱。 26 > 2021年美团技术年货 ● 首屏渲染性能差:main.dart.js 文件过大,单一文件加载、解析时间过长,势 必会影响首屏的渲染时间。0 码力 | 738 页 | 50.29 MB | 1 年前3
阮一峰 《ECMAScript 6入门》 第三版Symbol 239 上面代码将导致其他脚本都无法引用 FOO_KEY 。但这样也有一个问题,就是如果 多次执行这个脚本,每次得到的 FOO_KEY 都是不一样的。虽然Node会将脚本的执 行结果缓存,一般情况下,不会多次执行同一个脚本,但是用户可以手动清除缓 存,所以也不是完全可靠。 内置的Symbol值 除了定义自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语 foo = 'baz', 500); 上面代码输出变量 foo ,值为 bar ,500毫秒之后变成 baz 。 这一点与 CommonJS 规范完全不同。CommonJS 模块输出的是值的缓存,不存在 动态更新,详见下文《Module 的加载实现》一节。 最后, export 命令可以出现在模块的任何位置,只要处于模块顶层就可以。如果 处于块级作用域内,就会报错,下一节的 import Module 的加载实现 587 上面代码说明, lib.js 模块加载以后,它的内部变化就影响不到输出 的 mod.counter 了。这是因为 mod.counter 是一个原始类型的值,会被缓存。 除非写成一个函数,才能得到内部变动后的值。 // lib.js var counter = 3; function incCounter() { counter++; } module0 码力 | 679 页 | 2.66 MB | 1 年前3
新语⾔,新思维 解读⼀个并发问题的多种实现 - 陶召胜关键点 1 JavaScript 不不再有回调地狱,变异步为顺序化思维,程序更更加可读 2 Go ⾼高并发调度,通道让异步编程更更简单 3 Scala (1)简洁的异步编程 (2)AKKA:分布式计算框架 4 Java (1)fork/join (2)CompletableFuture (3)反应式编程(Reactive Programming ) next: JavaScript (2)AKKA:分布式计算框架 2014年年 Scala2.11 2016年年 Scala2.12 2017年年 Scala2.12.4 创建异步任务就是这么简洁 异步任务之间的连续处理理也是这么简洁 例例⼦子Scala实现 对⽐比:Java8 CompletableFuture实现 AKKA分布式计算框架 • 核⼼心概念:Actor,是⾏行行为和状态的容器器 CalculateActor request request 路路由 result 最终结果 结果汇聚 Dispatcher,线程池 计算 例例⼦子AKKA实现 例例⼦子AKKA实现(续) AKKA的分布式 节点1 节点2 节点3 节点4 节点5 节点6 next: Java 2011年年 2014年年 2017年年 Java 7:fork/join Java 8:CompletableFuture0 码力 | 42 页 | 9.85 MB | 1 年前3
Hello 算法 1.1.0 JavaScript版3 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.4 内存与缓存 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 4.5 小结 . . . . . 序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 Tip 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉及地址 空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则无法被其他程序同时使用了。因此在数据结 构与算法的设计中,内存资源是一个重要的考虑因素。比如,算法所占用的内存峰值不应超过系统剩余空闲 优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。0 码力 | 379 页 | 18.46 MB | 1 年前3
Hello 算法 1.2.0 简体中文 JavaScript 版3 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.4 内存与缓存 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 4.5 小结 . . . . . 序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 Tip 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉及地址 空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则通常无法被其他程序同时使用了。因此在数 据结构与算法的设计中,内存资源是一个重要的考虑因素。比如,算法所占用的内存峰值不应超过系统剩余 优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。0 码力 | 379 页 | 18.47 MB | 10 月前3
Hello 算法 1.0.0 JavaScript版3 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.4 内存与缓存 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 4.5 小结 . . . . . ,程序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 � 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉 及地址空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则无法被其他程序同时使用了。因此在数据结 构与算法的设计中,内存资源是一个重要的考虑因素。比如,算法所占用的内存峰值不应超过系统剩余空闲 优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。0 码力 | 376 页 | 17.57 MB | 1 年前3
Hello 算法 1.0.0b1 JavaScript版长度不可变 长度可变 内存使用率 占用内存少、缓存局部性好 占用内存多 优势操作 随机访问 插入、删除 � 缓存局部性的简单解释 在计算机中,数据读写速度排序是“硬盘 < 内存 < CPU 缓存”。当我们访问数组元素时,计算 机不仅会加载它,还会缓存其周围的其它数据,从而借助高速缓存来提升后续操作的执行速度。 链表则不然,计算机只能挨个地缓存各个结点,这样的多次“搬运”降低了整体效率。 两种实现都支持栈定义中的各项操作,数组实现额外支持随机访问,但这已经超出栈的定义范畴,一般不会用 到。 时间效率 在数组(列表)实现中,入栈与出栈操作都是在预先分配好的连续内存中操作,具有很好的缓存本地性,效率 很好。然而,如果入栈时超出数组容量,则会触发扩容机制,那么该次入栈操作的时间复杂度为 ?(?) 。 在链表实现中,链表的扩容非常灵活,不存在上述数组扩容时变慢的问题。然而,入栈操作需要初始化结点对 效率更高,这是因为: ‧ 出现最差情况的概率很低:虽然快速排序的最差时间复杂度为 ?(?2) ,不如归并排序,但绝大部分情况 下,快速排序可以达到 ?(? log ?) 的复杂度。 ‧ 缓存使用效率高:哨兵划分操作时,将整个子数组加载入缓存中,访问元素效率很高。而诸如「堆排序」 需要跳跃式访问元素,因此不具有此特性。 ‧ 复杂度的常数系数低:在提及的三种算法中,快速排序的 比较、赋值、交换 三种操作的总体数量最少0 码力 | 185 页 | 14.70 MB | 1 年前3
前端开发者指南(2017)可供使用。以下是一张关于所 有在开发网站或者网络应用时可以使用的公共接口的表。 — Mozilla 相关文档: Web API 公共接口 超文本传输协议 (HTTP) 超文本传输协议(HTTP)是一个为分布式的、协作的、多媒体的信息系统指定的应用协 议。HTTP 是万维网数据交流的基础。 — 维基百科 相关规范: 超文本传输协议 -- HTTP/1.1 HTTP/2 统一资源定位符 (URL) 建议: 我建议使用Chrome,因为它的开发者工具在持续改进,并且包含了最强大的功能。 1 1 学习 Web 浏览器 44 学习域名系统(又叫 DNS) 域名系统(DNS)是按层级划分的分布式命名系统,用以访问连接到互联网或私有网络中的 计算机、服务、资源。它通过域名关联各种信息,这些域名被分配至每个参与实体 (participating entities)上。它最突出的特点在于:将便于人们记忆的域名解析成数字表示的 学习域名系统(又叫 DNS) 45 学习域名系统(又叫 DNS) 46 学习 HTTP/Networks(包括 CORS 和 WebSockets) HTTP - 超文本传输协议(HTTP)是分布式、协作、超媒体信息系统的应用协议。HTTP 是万维网数据通信的基础。 — Wikipedia CORS - 跨域资源共享(CORS)是一种机制,允许网页向非本域下的资源提供者请求受 限制的资源(比如字体)。0 码力 | 164 页 | 6.43 MB | 1 年前3
Hello 算法 1.0.0b5 JavaScript版优化数据结构的操作效率。 ‧ 空间效率高: 数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问: 数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性: 当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下缺点。 ‧ 插入与删除效率低: 当数组中元素较多时,插入与删除操作需要移动大量的元素。 此各种性质和 操作效率也呈现对立的特点。 表 4‑1 数组与链表的效率对比 第 4 章 数组与链表 hello‑algo.com 73 数组 链表 存储方式 连续内存空间 离散内存空间 缓存局部性 友好 不友好 容量扩展 长度不可变 可灵活扩展 内存效率 占用内存少、浪费部分空间 占用内存多 访问元素 ?(1) ?(?) 添加元素 ?(?) ?(1) 删除元素 ?(?) ?(1) 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 后一个网页。双向链表的特性使得这种操作变得简单。 ‧ LRU 算法:在缓存淘汰算法(LRU)中,我们需要快速找到最近最少使用的数据,以及支持快速地添 加和删除节点。这时候使用双向链表就非常合适。 循环链表常被用于需要周期性操作的场景,比如操作系统的资源调度。 ‧ 时0 码力 | 375 页 | 30.68 MB | 1 年前3
[试读]15天学会JavaScript - 第 2 章
ECMAScript语法基础 二者作用的重要性。从 数据结构上理解,“栈”是一种“先进后出、后进先出”的存储结构;“堆”是一种树形存储结 构。从计算机操作系统原理上理解,“栈”一般位于一级缓存中;而“堆”一般位于二级缓存 中,一级缓存的存取速度自然是快于二级缓存的。 “栈”与“堆”的结构关系到变量的存储机制。由于 ECMAScript 引用值的大小会改变, 因此不能将其存储在“栈”中,否则会降低变量查找访问的速度。而指向引用值的指针(pointer)0 码力 | 52 页 | 3.83 MB | 1 年前3
共 15 条
- 1
- 2













