搬砖工程狮 1169430612
关注数: 145 粉丝数: 67 发帖数: 666 关注贴吧数: 186
《深入浅出vuejs》10 解析器的作用是将vue语法下的HTML转成AST,而优化器的作用是从AST中找出静态子树并且打上标记。(静态子树指的AST中永远都不会发生变化的节点),这样做的好处是为了减少不必要的计算: 每次对比VNODE重新渲染时,不需要为静态子树创建新的节点,只有首次需要创建,后面只是clone即可 在虚拟DOM中打补丁的过程可以跳过:如果两个节点都是静态树,就不需要再对比了,直接跳过 优化器内部分为2个步骤: 在AST中找出所有静态节点并打上标记 在AST中找出所有静态根节点并打上标记 要从根节点开始,先判断根节点是不是静态根节点, 再用相同的方式处理子节点,接着用同样的方式去处理子节点的子节点,直到所有节点都被处理 之后程序结束,这个过程叫作递归: 如果节点类型是1,说明是元素节点,那么循环该节点的子节点 如果type 等于2,说明节点是带变量的文本节点,那它不可能是静态 节点,所以返回 false 如果type是3,说明是不带变量的纯文本节点,那么一定是静态节点,返回true 标记完静态节点之后需要标记静态根节点,其标记方式也是使用递归的方式从上向下寻找, 在寻找的过程中遇到的第 一个静态节点就为静态根节点,同时不再向下继续查找。但有两种情况比较特殊:一种是如果 一个静态根节点的子节点只有 一个文本节点,那么不会 将它标记成静态根节点,即便它也属于静态根节点;另一种是如果找到的静态根节点是一个没有 子节点的静态节点,那么也不会将它标记为静态根节点。因为这两种情况下,优化成本大于收益。
《深入浅出vuejs》9.3.8-9.5 纯文本内容:s c r i p t 、 s t y l e 和 t e x t a r e a 这 三种 元 素 叫 作 纯 文 本 内 容 元 素 。 解析它们的时候,会把这 三种标签内包含的所有内容都 当作文本处理。也就是这些内容在解析的时候不用特殊处理,当成字符串即可。由于纯文本 内容元素都被视作文本处理,所以我们的处理逻辑就变得很简单,只需要把这些 文本截取出来并 触发钩子函数chars,然后再将结束标签截取出来并触发钩子函数end。 DOM的层级关系,并没有单独的数据结构来维护,而是通过栈来维护,就是每解析到开始标签,就向栈中推进去一个;每解析到标签结束,就弹出一个。 因此 , 想取到父元素并不难 , 只需要拿到栈中的最后一项即可 。 文本解析器是对HTML 解析器解析出来的文本进行二次加工。文 本 其 实 分 两 种 类 型 , 一 种 是 纯 文 本 , 另 一 种 是 带 变 量 的 文本 。如 果 是 纯文 本, 不 需要进 行 任 何 处 理 ; 但 如 果 是带 变量 的 文本, 那么需要使用文本解析器进 一步解析 。因为带变量的文本在使用虚拟DOM进行渲染时,需要将 变量替换成变量中的值,一 个解决思路是使用正则表达式匹配出文本中的 变量,先把变量左边的文本添加到数组中, 然后把变量改成_s(x)这样的形式也添加到数组中。如果变量后面还有变量,则重复以上动作, 直到所有变量都添加到数组中。如果最后一个变量的后面有文本,就将它添加到数组中。
《深入浅出vuejs》9.3.2-9.3.3 如果模板以<开头,那么它有可能是以开始标签开头的模板,同时它也有可能是以结束标签 开 头 的 模 板 , 还 有 可 能 是 注 释 等 其 他 标 签 , 因 为这 些类 型 的 片 段 都 以 < 开 头 。 那 么, 要 进 一 步 确 定模板是不是以开始标签开头,还需要借助正则表达式来分辨模板的开始位置是否符合开始标签 的特征。 const ncname = '[a-zA-Z_][\\w||-|\-]*' const qnameCapture = ((?: ${ncname}|(:)?$(ncname}) ' const startTagOpen = new RegExp(*^<${qnameCapture)*) 当HTML解析器解析到标签开始时,会触发钩子函数st ant ,同时 会 给 出 三 个 参 数 , 分 别 是 标 签 名 ( t a g N a m e )、 属 性 ( a t t r s ) 以 及 自 闭 合 标 识 ( unary )。因此,在分辨出模板以开始标签开始之后,需要将标签名、属性以及自闭合标识解析出来。在分辨出模板以开始标签开始之后,就可以得到标签名,而属性和自闭合标识则需要进一步 解析。通 常 , 标 签 属 性 是 可 选 的 , 一 个 标 签 的 属 性 有 可 能 存 在 , 也有 可 能 不 存 在 , 所 以 需 要 判 断 标 签是否存在属性,如果存在,对它进行截取。 const startTagClose = /^\s*(\/?)>/ const attribute = /^15*([^|s''<>V=]+)(?:15*(=)\s*(?:"([^"]*)"+|*([^']*)'+|<[^\s"^=<>"]+)))?/ let html = ' class="box" id="el"></div›' 结 束 标 签 的 截 取 要 比 开 始 标 签 简 单 得 多 , 因 为 它 不 需 要 解析 什 么 , 只 需 要 分 辨 出 当 前 是 否 已 经截取到结束标签,如果是,那么触发钩子函数就 可以了。如果HTML模板的第一个字符不是<,那么一定不是结束标签。只有HTMIL模板的第一个字 9 符是<时,我们才需要进一步确认它到底是不是结束标签。
《深入浅出vuejs》7.5 更新子节点大概可以分为4种操作:更新节点、新增节点、删除节点、移动节点位 置。因此,更新子节点更多的是在讨论什么情况 下需要更新节点,什么情况下新增节点等对 比 两 个 子 节 点 列 表 ( c h i l d r e n ), 首 先 需 要 做 的 事 情 是 循 环 。循 环 n e w C h i l d n e n ( 新 子 节 点 列 表 ), 每 循 环 到 一 个 新 子 节 点 , 就 去 o l d c h i l d r e n ( 旧 子 节 点 列 表 ) 中 找 到 和 当 前 节 点 相 同 的那个旧子节点。 如果在ol dchi l dr en 中找不到,说明当前子节点是由于状态变化而新增的节 点,我们要进行创建节点并插入视图的操作;如果找到了,就做更新操作;如果找到的旧子节点 的位置和新子节点不同,则需要移动节点等。 如果在oldChildren 中没有找到与本次循环所指向的新子节点相同的节点,那么说明本次 循环所指向的新子节点是 一个新增节点。对于新增节点,我们需要执行创建节点的操作,并将新 创建的节点插入到oldChil dren 中所有未处理节点(未处理就是没有进行任何更新操作的节点) 的前面。当节点成功插入D OM 后,这一轮的循环就结束了。 移动节点通常发生在newChildren 中的某个节点和oldChi ldren 中的某个节点是同一个节 点,但是位置不同,所以在真实的DOM 中需要 将这个节点的位置以新虚拟节点的位置 基准进 行移动。通过Node.insertBefore()方法,我们可以成功地将一个已有节点移动到一个指定的位置 当newChildren 中的所有节点都被循环了一遍后,也就是循环结束后,如 果oldchi l dr en 中还有剩余的没有被处理的节点,那么这些节点就是被废弃、需要删除的节点。 通过优化策略算法,提升新旧节点对比的性能
《深入浅出vuejs》7 虚拟DOM最核心的部分是patch,它可以将vnode渲染成真实的DOMpatch 也可以叫作pat ching 算法,通过它渲染真实D OM时,并不是暴力覆盖原有D OM,而 是比对新旧日两个vnode之间有哪些不同,然后根据对比结果找出需要更新的节点进行更新。这 一 点从名字就可以看出,patch 本身就有补丁、修补等意思,其实际作用是在现有DOM上进行修改 来实现更新视图的目的。对 现 有 D O M 进 行 修 改 需 要 做 三件 事 : 创建新增的节点; 删除已经废弃的节点; 修改需要更新的节点。 事实上,只有三种类型的节点会被创建并插入到DOM 中:元素节点、注释节点和文本节点要判断vnode是否是元素节点,只需要判断它是否具有tag属性即可。接着,我们就可以调用当前环境下的createElement 方法 (在浏览器环境下就是document .createElement)来创建真实的元素节点。将元素渲染到视图的过程非常简单。只需要调用当前环境下的ap pen dch i l d 方法(在浏览 器 环 境 下 就 是 调 用 parentNode.appendChild ), 就 可以 将 一个 元 素 插 入 到 指 定 的 父 节 点 中。创建子节点的过程是一个递归过程。v ode中 的chi ldren 属性保存了当前节点的所有子虚 拟节点(childvirtualnode),所以只需要将vnode中的children属性循环一遍,将每个子虚拟节 7 点都执行一遍创建元素的逻辑,就可以 实现我们想要 的功能。在 第 6 章 中 介 绍 V N o d e 时 , 我 们 介 绍 过 注 释 节 点 有 一 个唯 一 的 标 识 属 性 i s C o m m e n t 。 在 所 有 类型的vnode中,只有注释节点的isComment 属性是true,所以通过is Comment 属性就可以判 断 一个vnode是否是注释节点。当发现一个vnode的tag属性不存在时,我们可以用isComent 属性来判断它是注释节点 还是文本节点。如果是文本节点,则调用当前环境下的createTextNode 方法(浏览器环境下调 用document .createTextNode )来创建真实的文本节点并将其插入到指定的父节点中;如果是 注 释 节 点 , 则 调 用 当 前 环 境 下 的 c r e a t e c o m m e n t 方 法 (浏 览 器 环 境 下 调 用 d o c u m e n t . createComent 方法)来创建真实的注释节点并将其插入到指定的父节点中静态节点指的是那些一旦渲染到界面上之后,无论日后 状态如何变化,都不会发生任何变化 的节点。当新旧两个虚拟节点(vnode和oldVnode)不是 静态节点,并且有不同的属性时,要以新虚 拟节点(vnode)为准来更新视图。根据新节点(vnode)是否有text 属性,更新节点可以分为 两种不同的情况。
《深入浅出vuejs》6 在Vue.js中存在一个VNode 类,使用它可以实例化不同类型的vnode实例,而不同类型的 vnode实例各自表示不同类型的DOM元素。DOM元素有元素节点、文本节点和注释节点等,vnode 实例也会对应着有元素节点、 文本节点和注释节点等。vnode只是一个名字,本质上其实是JavaScript 中一个普通的对象, 是 从 v N o d e 类 实例 化 的 对 象 。 我 们 用 这 个 J a v a S c r i p t 对 象 来 描 述 一 个 真 实 D OM 元 素 的 话 , 那 么 该DOM元素上的所有属性在VNode这个对象上都存在对应的属性。每次渲染视图时都是先创建vnode,然后使用它创建真实DOM插入到页面中,所以可 以将上一次渲染视图时所创建的vnode缓存起来,之后每当需要重新渲染视图时,将新创建的 v n o d e 和 上 一 次 缓 存 的 v n o d e 进 行 对 比 , 查 看 它 们 之 间 有 哪 些 不 一 样 的 地 方 , 找 出 这 些 不 一样 的 地方并基于此去修改真实的DOM。v n o d e 有 很 多 种 不 同 的 类 型 , 接 下 来 我 们介 绍 不 同 类 型 之 间 有 什 么 区 别 。 v n o d e 的 类 型 有 以 下几种: 1. 注 释 节点 2. 文本节点 3. 元素节点:通常会存在以下4种有效属性。 tag:顾名思义,tag就是一个节点的名称,例如p 、u1、1i和div等。 data:该属性包含了一些节点上的数据,比如attrs、class 和style等。 c h i l d r e n : 当前 节 点 的 子 节 点 列 表 。 context :它是当前组件的Vue.js实例。 4. 组件节点 c o m p o n e n t O p t i o n s : 顾 名 思 义 , 就 是 组 件 节 点 的 选项 参 数 , 其 中 包 含 p r o p s D a t a 、 t a g 和chil dren 等信息。 comp onent Inst ance:组件的实例,也是Vue.j s的实例。事实上,在Vue.js中,每个组件 都是一个Vue.js 实例。 5. 函数式组件 6. 克隆节点:将现有节点的属性复制到新节点中,让新创建的节点和被克隆节点的属性保持 一 致,从而实现克隆效果。它的作用是优化静态节点和插槽节 点(slotnode)
《深入浅出vuejs》5.1-5.4 当 状 态 变 得 越 来越 多 , D O M 操 作 越 来 越 频 繁 时 , 我 们 就 会 发 现 如 果 像 之 前 那 样 使 用 j Q u e r y 来开发页面,那么代码中会有相当多的代码是在操作DOM,程序中的状态也很难管理,代码中 的逻辑也很混乱。我们的关注,点应该聚焦在状态维护上,而D OM 操作其实是可以省略掉的。本质上,我们将状态作 输入,并生成DOM输出到页面上显示出来,这个过程叫作渲染 在这种情况下,最简单粗暴的解决方式是,既不需要关心状态发生了什么变化,也不需要关 心在哪里更新DOM,我们只需要把所有DOM 全删了,然后使用状态重新生成一份DOM,并将 其输出到页面上显示出来就好了。但是访问DOM是非常昂贵的。按照上面说的方式做,会造成相当多的性能浪费。状态变化 通常只有有限的几个节点需要重新渲染,所以我们不仅需要找出哪里需要更新,还需要尽可能少 地访问 DOM。虚拟D OM的解决方式是通过状态生成一个虚拟节点树,然后使用虚拟节点树进行渲染。 在渲染之前, 会使用新生成的 虚拟节点树和上一 次生成的虚拟节点树进行对比, 只渲 染不同 的 部分。为了避免不必要的D OM操作,虚拟DOM在虚拟节点映射到视图的过程中,将虚拟节点与 上 一次 渲 染 视 图 所 使 用 的 旧 虚 拟 节 点 (o l d V n o d e ) 做 对 比 , 找 出 真 正 需 要 更 新 的 节 点 来 进 行 D O M 操作,从而避免操作其他无任何改动的DOM。 可以看出,虚拟DOM在Vue.js中所 做的事情其实并没有想象中那么复杂,它主要做了两 件事。 * 提 供 与 真 实 D O M 节 点 所 对 应 的 虚拟 节 点 v n o d e 。 * 将虚拟节点vnode 和旧虚拟节点oldVn ode进行比对,然后更新视图。 两 个 虚 拟 节 点 进 行 比 对 是 虚 拟 D O M 中 最 核 心 的 算 法 ( 即 p a t c h ), 它 可 以 判 断 出 哪 些 节 点 发 生 了 变 化 , 从 而 只 对 发 生 了 变 化 的 节 点进 行 更新 操 作 。
《深入浅出vuejs》3.8-3.13 Ar r a y 在 g e t t e r 中收集依赖,在拦截器中触发依赖。这个依赖保存的 位置就很关键,它必须在getter 和拦截器中都可以访问到。 我们在Observer 中新增了一段代码,它可以在value 上新增一个不可校 举 的 属 性 _ 0 b _ , 这 个 属 性 的值 就 是 当 前 o b s e r v e r 的 实 例。这样我们就可以通过数组数据的__ob_ 属性拿到observer 实例,然后就可以拿到 _b_ 上的 d e p _b_ 的作用不仅仅是为了在拦截器中访问observer 实例这么简单,还可以用来标 记 当 前 v a l u e 是 否 已 经 被 O b s e r v e r 转 换 成 了 响应 式 数 据 。 如何侦测数据中元素的变化:新增observeArray方法,其作用是循环Array中的每一项,执行observe函数来侦测变化,其实就是将数组中的每个元素都执行一遍newobserver, 这很明显是 一个递归的过程。 如何侦测新增元素的变化:想要获取新增元素,我们需要在拦截器中对数组方法的类型进行判断。如果操作数组的方法 是push、unshift 和splice(可以新增数组元素的方法),则把参数中新增的元素拿过来,用 Observer 来侦测。 从this._ _ob_ 上拿到observer 实例后,如果有新增元素,则使用 o b . o b s e r v e Ar r a y 来侦测这些 新 增元素的 变化。 前面介绍过,对Arr ay的变化侦测是通过拦截原型的方式实现的。正是因为这种实现方式, 其实有些数组操作Vue.js 是拦截不到的 总结:Array 追踪变化的方式和object 不一样。因为它是通过方法来改变内容的 ,所以我们通过 创建拦截器去覆盖数组原型的方式来追踪 变化
《深入浅出vuejs》3.1-3.7 O b j e c t 的 变 化 是 靠 s e t t e r 来 追 踪 的 , 只 要 一 个 数 据 发 生 了 变 化 , 一定 会 触 发 s e t t e r 。 我们可以用 一个拦截器覆盖Arr ay.prototype。之后,每当使用Array原型 上的方法操作数组时,其实执行的都是拦截器中提供的方法,比如push 方法。然后,在拦截器中使用原生Anr ay 的原型方法去操作数组。 有 了拦截器 之后,想要让它 生效,就需要 使用它去 覆盖Ar r a y . p r ot o t y p e 。但是我们 又不能 直接覆盖,因为这样会污染全局的Array,这并不是我们希望看到的结果。我们希望拦截操作只 针对那些被侦测了变化的数据生效,也就是说希望拦截器只覆盖那些响应式数组的原型。 value._proto_ = arrayMethods 它的作用是将拦截器(加工后具备拦截功能的arrayMethods) 赋值给value._proto_ ,通过 _proto_可以很巧妙地实现覆盖value原型的功能 虽然绝大多数浏览器都支持这种非标准的属性(在ES6之前并不是标准)来访问原型,但并 不是所有浏览器都支持!因此,我们需要处理不能使用_ prot_ 的情况。 数 组 在 哪 里 收 集 依 赖 呢 ? 其 实数 组 也 是 在 g e t t e r 中 收集 依 赖 的 。其实不管value是什么,要想在一个object 中得到某个属性的数据,肯定要通 过key 来读取value。因此,在读取list 的时候,肯定会先触发这个名字叫作list 的属性的getter
《CSS世界》4.4-4.4.5 border-width属性:不支持百分比,主要原因是业务场景中不需要,一般无论是在多大的屏幕上,border的宽度都是相对固定的,不会有border等比缩放的场景。 border-width的默认值是medium,约等于3px,并不是1px border-style属性:border-style的默认值是none,并不是solid,所以我们如果想让边框展示出来,必须有明确的border-style属性设置才可以。 * solid:最常用 * dashed:虚线颜色区的宽高比和透明区的宽度比在不同浏览器下是有差异的 * dotted:虽然规范上是个圆点,但在不同浏览器中是不同的,在IE上是圆点,在firefox是小方点 * double:两条线的边框,这也就是为什么border-width是3px的原因,只有3px的时候才能满足两条线边框。分配原则是:两条线的宽度永远相等,中间间隔等于宽度+1或者-1 border-color属性:border-color的默认值是color的默认值,这一点有个应用,比如上传图片的+号,都用border-color设置颜色,当hover的时候就只需要修改一个color即可,不需要修改其他的地方 border-color的transparent属性有非常强大的功能,可以用该值来画不同形状的三角形,需要理解各个border的实现机制 同样,border-color:transparent也可以用来扩大热区的场景。前面提到padding也可以增加热区,但如果我们使用雪碧图的场景,修改padding可能影响background-position的定位,所以这时候可以用border-color来实现效果
《CSS世界》第五读 给行内元素设置padding看起来似乎没有生效,并没有影响页面的布局,但其实并不是没有生效,只是没有影响布局而已。这种不影响其他元素布局而是出现层叠效果的现象,分位两类:一类是纯视觉层叠,不影响外部尺寸,另一类会影响外部尺寸(注意只是影响外部元素尺寸,并不是影响布局)。内联元素的padding会改变父元素的高度,超出时会有滚动条效果。 padding的妙用: 1. padding不会影响布局,但是却可以实实在在的影响元素的热区,如果我们想扩大超链接的热区,可以通过padding来调大热区,这时候既不影响布局,又可以加大响应区域 2. 进入到页面锚点的时候,如果顶部有导航栏占位,那么实际的锚点会被导航栏遮挡,这时候可以在需要锚点的位置增加一个行内元素,并且设置其padding-top,这样在锚点的时候就会直接卡到padding-top的区域,将顶部导航栏空出来,这个非常重要,我们的业务代码中经常有这种场景,现在用js处理的比较多 3. padding的百分比都是相对于宽度的,这一点很重要,比如需要实现一个16:9的图片,或者正方向,就可以利用这一点做好布局 margin属性同样可以改变元素的可视尺寸,只要元素的尺寸表现符合“充分利用可用空间”这一原则,无论是垂直方向还是水平方向,都可以通过margin来改变尺寸,特别是当margin设置为负值时,会扩大元素尺寸
《CSS世界》第二读 对于块状元素,width设置成auto,则元素就会如水流般充满整个容器,而一旦设定了width具体数值,则元素的流动性就会被阻断。这世界上任何事物,一旦限制死了,就丧失了灵活性,而“无宽度准则”就会让布局更灵活,容错性更强。 都知道盒模型有content-box和border-box,其实一共有4个 1. content-box:默认值 2. padding-box:firefox 3. border-box:全部支持 4. margin-box:从未支持过,没有必要 box-sizing的发明初衷,是为了替换元素,因为替换元素的特性之一就是尺寸由内部元素决定,无论其display属性值是inline还是block,其宽度不受display属性的影响。 关于height:100%:如果父元素height:auto,只要子元素还在文档流中(不是绝对定位的),其百分比值就完全被忽略了。绝对定位的元素,其高度会默认撑满,但同时会脱离文档流 需要注意,绝对定位元素的百分比是相对于父元素的padding box而言的,也就是说会把padding计算在内,而非绝对定位元素则是相对于content box计算的。 min-width/height和max-height/width的作用:超越!important,超越最大 超越!important:是指max-width会超过!important定义的宽度 超越最大:min-width会超过max-width 所以,综上就是min-width > max-wdith > !important 任意高度元素的展开动画:使用height:auto属性无动画效果,但是使用max-height有效果,但动画过程是相对于max-height而言的,所以max-height也不宜过大,否则会导致动画卡顿、丢失 幽灵空白节点:任何一个行框盒子前面都有一个空白节点,这个空白节点永远透明,不占据任何宽度,看不见也无法通过脚本获取,就好像幽灵一样,又确确实实存在,我们认为在span元素前面有一个宽度为0的空白字符,会影响父级元素的高度,这一点在后面的布局中非常重要
《CSS世界》第一读 CSS中文层叠样式表,重点在于层叠,层叠的意思是指,其样式可以不断的被层叠、覆盖,直到最后一层的样式生效 CSS本身就是为了展示图文内容而生的,在发展的过程中不断演化升级,所以在这里要从头开始,构造一个CSS世界。 流式布局并不等同于自适应布局,其实要比自适应布局狭窄的多。 在css之前是table布局,table并不适用流的概念,因此一些css属性的表现,如单元格的vertical-align和普通元素也不一样 长度单位分位相对长度单位和绝对长度单位: * 相对长度单位:一是相对于字体长度单位,如em和ex,二是相对于视区的长度单位,如vh、vw * 绝对长度单位:包括px、pt、cm等 选择器的种类包括:id选择器、类选择器、标签栓择期、属性选择器、伪元素选择器、伪类选择器 关系选择器包括:后代选择器、相邻后代选择器、兄弟选择器、相邻兄弟选择器 块级元素:一个水平流上只能单独显示一个元素,多个块级元素换行显示 块级元素包括div、li和table,需要注意块级元素并不等于display:block的元素 将块级元素和内联元素考虑成容器盒子 + 内容盒子,那么: *display: block其实就是block-block,容器盒子和内容盒子都是block * display:inline-block,容器盒子是inline,内容盒子是block * display: inline-inline,容器盒子是inline,内容盒子是inline * display:inline-table,容器盒子是inline,内容盒子是table width和height是实际的尺寸,影响的是内容盒子 外部尺寸:元素宽度由外部元素决定 内部尺寸:元素宽度由内部元素决定 无宽度的布局:注意不要轻易定宽,定宽会让元素失去自适应的特性,要利用好元素的自适应性,实现更加灵活布局
《uni-app多端跨平台开发》第9.11~9.17章 textarea用于多行文本输入,需要注意以下问题: 1. 在textarea中实际输入时,换行符是/r/n,而如果在rich-text组件展示时要用/br,所以需要一轮转换 2. textarea组件不能改顶起键盘之后的确认按钮文案 3. 顶起键盘交互时与input相比有一些diff,实际使用时需要慎重 webview组件有一些限制: 1. 一定要有原生导航栏 2. 一定是全屏的:所以frs的某个tab用H5来实现是不可行的 3. 能打开的网页需要配置白名单 4. 最终在H5中转换成iframe image标签直接支持lazyload,使用起来比较方便,需要注意当页面结构比较复杂的时候,使用image可能导致样式生效变慢,出现闪一下的情况,此时设置will-change: transform可以优化此问题。will-change会告诉浏览器该元素会有哪些变化,这样浏览器可以在元素属性真正发生变化之前做好对应的优化准备工作 switch在不同小程序平台颜色是不一样的,如果修改需要用color属性,如果需要改变大小需要用scale方法调节 uniapp提供audio组件,相比之下更推荐用uni.createInnerAudioContext方法,UI样式可以全部自定义。这一点在评分贴的语音组件中有体会,直接用audio组件导致一些事件无法触发,比如语音的倒计时只能通过setTimeout来模拟,后面可以试下uni.createInnerAudioContext方法,从兼容性考虑格式用mp3 video组件支持mp4、webm和ogg。在H5中如果需要使用三方video,可以通过条件编译来区分。从组件来看,video组件的功能非常强大,但实际使用效果需要实战
《架构即未来》16-18章读书笔记 风险是客观存在的,某种程度上风险是一个累积的过程,那些成功企业要么是风险管理很有效,要么是迄今为止非常幸运。 测量风险的方法,一是直觉法,这种方法的缺点是很少可以复制。二是交通灯法,通过将行动分解成最小的组件,并用绿色、黄色或者红色来表明其风险等级。三是故障模式及影响分析法,方法与交通灯方法类似,系统被分解成最小的组成部分进行风险评估,选择使用1/3/9作为打分的范围。 风险评估完成后必须进行管理,这一步可以分解为管理急性风险和管理整体风险。急性风险针对单一行动,而整体风险针对一段时间的变更所带来的风险。 17章讨论性能测试和压力测试,性能测试分位7个步骤: 1. 确定应用的标准 2. 简历适当的测试环境 3. 选择合适的测试服务 4. 执行测试 5. 分析数据 6. 向工程师报告 7. 必要的重复 压力测试分位8个步骤: 1. 确定测试的目标 2. 选择要测试的关键服务 3. 确定需要产生多少负载 4. 建立适当的测试环境 5. 确定必需的检视点 6. 产生实际的测试负载 7. 执行测试 8. 分析数据 性能测试和压力测试对可扩展性的影响可通过预留空间、变更控制以及风险管理实现 18张介绍障碍条件与回滚,主要是为了确保一旦事故发生可以快速恢复。主要分位3个部分: 1. 障碍条件:在开发的过程中早期发现并消除对未来的可扩展性有影响的风险 2. 回滚能力允许立刻消除任何与可扩展性相关的威胁 3. 服务降级和禁用功能允许当问题发生时,可以暂时关闭影响可扩展性的功能
1 下一页