2019-2021 美团技术年货 前端篇在适配开始之前,我们要明确好先做哪些事情。先来回顾一下 Flutter 的三层结构: 在 Flutter 的架构设计中,最上层为框架层,使用 Dart 语言开发,面向 Flutter 业务 的开发者;中间层为引擎层,使用 C/C++ 开发,实现了 Flutter 的渲染管线和 Dart 运行时等基础能力;最下层为嵌入层,负责与平台相关的能力实现。显然我们要做的 是将嵌入层移植到鸿蒙上,确切地说,我们要通过鸿蒙原生提供的平台能力,重新实 的平台能力,重新实 前端 < 3 现一遍 Flutter 嵌入层。 对于 Flutter 嵌入层的适配,Flutter 官方有一份不算详细的指南,实际操作起来成本 很高。由于鸿蒙的业务开发语言仍然可用 Java,在很多基础概念上与 Android 也有 相似之处(如下表所示),我们可以从 Android 的实现入手,完成对鸿蒙的移植。 Flutter 在鸿蒙上的适配 如前文所述,要完成 如前文所述,要完成 Flutter 在新系统上的移植,我们需要完整实现 Flutter 嵌入层 要求的所有子模块,而从能力支持角度,渲染、交互以及其他必要的原生平台能力 是保证 Flutter 应用能够运行起来的最基本的要素,需要优先支持。接下来会依次进 行介绍。 1. 渲染流程打通 我们再来回顾一下 Flutter 的图像渲染流程。如图所示,设备发起垂直同步(VSync) 信号之后,先经过 UI 线0 码力 | 738 页 | 50.29 MB | 1 年前3
阮一峰 JavaScript 教程《阮一峰 JavaScript 教程》 由 进击的皇虫 使用 书栈(BookStack.CN) 进行构建,生成于 2018-02-26。 书栈(BookStack.CN) 仅提供文档编写、整理、归类等功能,以 及对文档内容的生成和导出工具。 文档内容由网友们编写和整理,书栈(BookStack.CN) 难以确认 文档内容知识点是否错漏。如果您在阅读文档获取知识的时候,发现文 档内容有不恰当的 - 9 - 本文档使用 书栈(BookStack.CN) 构建 从语法角度看,JavaScript 语言是一种“对象模型”语言。各种宿主 环境通过这个模型,描述自己的功能和操作接口,从而通过 JavaScript 控制这些功能。但是,JavaScript 并不是纯粹的“面 向对象语言”,还支持其他编程范式(比如函数式编程)。这导致几乎 任何一个问题,JavaScript 都有多种解决方法。阅读本书的过程 法构造(比如操作符、控制结构、语句)和标准库(就是一系列具有各 种功能的对象比如 Array 、 Date 、 Math 等)。除此之外,各种宿 主环境提供额外的 API(即只能在该环境使用的接口),以便 JavaScript 调用。以浏览器为例,它提供的额外 API 可以分成三 大类。 浏览器控制类:操作浏览器 DOM 类:操作网页的各种元素 Web 类:实现互联网的各种功能 如果宿主环境是服务器,则会提供各种操作系统的0 码力 | 540 页 | 3.32 MB | 10 月前3
Hello 算法 1.1.0 JavaScript版”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归: 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量: function algorithm(n) { let a = 1; // +0(技巧0 码力 | 379 页 | 18.46 MB | 1 年前3
Hello 算法 1.2.0 简体中文 JavaScript 版”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归: 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量: function algorithm(n) { let a = 1; // +0(技巧0 码力 | 379 页 | 18.47 MB | 10 月前3
Hello 算法 1.0.0 JavaScript版”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归: 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量: function algorithm(n) { let a = 1; // +0(技巧0 码力 | 376 页 | 17.57 MB | 1 年前3
Hello 算法 1.0.0b5 JavaScript版”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无需继续执行其他 操作,因此系统无需保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归。 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量。 function algorithm(n) { let a = 1; // +0(技巧0 码力 | 375 页 | 30.68 MB | 1 年前3
Hello 算法 1.0.0b1 JavaScript版省略所有系数。例如,循环 2? 次、5? + 1 次、⋯⋯,都可以化简记为 ? 次,因为 ? 前面的系数对时间 复杂度也不产生影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别套 用上述 1. 和 2. 技巧。 以下示例展示了使用上述技巧前、后的统计结果。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = logRecur(n) { if (n <= 1) return 0; return logRecur(n / 2) + 1; } 线性对数阶 ?(? log ?) 线性对数阶常出现于嵌套循环中,两层循环的时间复杂度分别为 ?(log ?) 和 ?(?) 。 主流排序算法的时间复杂度都是 ?(? log ?) ,例如快速排序、归并排序、堆排序等。 // === File: time_complexity 个互不重复的元素,求其所有可能的排列方案,则方案数量为 ?! = ? × (? − 1) × (? − 2) × ⋯ × 2 × 1 阶乘常使用递归实现。例如以下代码,第一层分裂出 ? 个,第二层分裂出 ? − 1 个,⋯⋯,直至到第 ? 层时 终止分裂。 // === File: time_complexity.js === /* 阶乘阶(递归实现) */ function factorialRecur(n)0 码力 | 185 页 | 14.70 MB | 1 年前3
阮一峰 《ECMAScript 6入门》 第三版1版发布后,就开始制定6.0版了。因此,ES6 这个词的原 意,就是指 JavaScript 语言的下一个版本。 但是,因为这个版本引入的语法功能太多,而且制定过程当中,还有很多组织和个 人不断提交新功能。事情很快就变得清楚了,不可能在一个版本里面包括所有将要 引入的功能。常规的做法是先发布6.0版,过一段时间再发6.1版,然后是6.2版、 ECMAScript 6简介 7 6.3版等等。 但是 JavaScript 创造 者Brendan Eich为首的Mozilla公司,则坚持当前的草案。 2008年7月,由于对于下一个版本应该包括哪些功能,各方分歧太大,争论过于激 烈,ECMA 开会决定,中止 ECMAScript 4.0 的开发,将其中涉及现有功能改善的 一小部分,发布为 ECMAScript 3.1,而将其他激进的设想扩大范围,放入以后的版 本,由于会议的气氛,该版本的项目代号起名为 是很成熟的设想,则被视为 JavaScript.next.next,在更远的将来再考虑推出。 ECMAScript 6简介 9 TC39 委员会的总体考虑是,ES5 与 ES3 基本保持兼容,较大的语法修正和新功能 加入,将由 JavaScript.next 完成。当时,JavaScript.next 指的是ES6,第六版发布 以后,就指 ES7。TC39 的判断是,ES5 会在2013年的年中成为 JavaScript0 码力 | 679 页 | 2.66 MB | 1 年前3
前端开发者指南(2017)Safari 无头浏览器(Headless Browsers) 无头浏览器是一种没有用户图形界面的 WEB 浏览器,我们可以用命令行界面编程控制该浏览 器,达到自动化运行 Web 页面(比如功能测试、网站检索、单元测试等)的目的。可将无头 浏览器看作网页浏览器,不过你用命令行来检索、遍历网页。 最常见的无头浏览器: PhantomJS slimerjs trifleJS Webviews JSX,而如今他们已经享受其中。 一种可用的 CSS 模块模式(CSS encapsulation)已经实现并投入使用,因此对许多人 来说,CSS in JS 成为一种切实可行的解决方案。 越来越多人着手进行 UI 的功能性、整合性测试,其中包含例如可视化 CSS 和 RWD(译 注:响应式网页设计,全称 Responsive web design)回归测试的概念。 得益于老版本 IE 使用、开发程度的大幅度降低,为浏览器 成为企业级开发者的明智之选(也就是说受到支持!)。 Webpack 采取措施并巩固了优势地位,更胜一筹的 JSPM 解决方案暂居其下。 HTTPS,嗯,这个我们很重视 BASH 在 windows 系统上展露头脚。 通知功能 API 可以被使用了,并在 chrome 上有些滥用,但这只会发生在你授予它权限 之后。 FireBug 调试工具退出历史舞台。 2016年,CSS 20 岁了。 Immutability0 码力 | 164 页 | 6.43 MB | 1 年前3
JavaScript Promise迷你书(中文版)Promises,即JavaScript的标准规范为基础 的、Promise的相关知识为主要讲解内容。 在Firefox和Chrome这样技术比较超前的浏览器上,不需要安装额外的插件就能使用 Promise功能,此外ES6 Promises的规范来源于Promises/A+社区,它有很多版本的实 现。 我们将会从基础API开始介绍可以在浏览器的原生支持或者通过插件支持的Promise功 能。 也希望各位 而不会像回调函数方式那样可以自己自由的定义回调函数的参数,而必须严格 遵守固定、统一的编程方式来编写代码。 这样,基于Promise的统一接口的做法, 就可以形成基于接口的各种各样的异步处理模 式。 所以,promise的功能是可以将复杂的异步处理轻松地进行模式化, 这也可以说得上是 使用promise的理由之一。 接下来,让我们在实践中来学习JavaScript的Promise吧。 JavaScript Promise 该异常原因(Error对 象)会作为 .catch 方法的参数被调用。 其实 .catch 只是 promise.then(undefined, onRejected) 的别名而已, 如下代码也可以完 成同样的功能。 getURL(URL).then(onFulfilled, onRejected); onFulfilled, onRejected 是和刚才相同的函数 一般说来,使用 .catch 来将r0 码力 | 112 页 | 1010.02 KB | 1 年前3
共 18 条
- 1
- 2













