Tuateam技术周刊-45期

263 阅读7分钟

一、 Firefox 66: The Sound of Silence

  • 用户决定页面的音视频是否自动播放
  • 滚动锚定 火狐现在实现了滚动锚定,让视口内容不再因视口上方 DOM 元素的高度变化而产生跳动。
  • Touch Bar支持
  • Tab Search - 支持tab搜索
  • 新DOM API:getDisplayMediaAPI 新的getDisplayMediaAPI支持Web上的屏幕共享,类似于getUserMedia提供对网络摄像头的访问。生成的流可以在本地处理或通过WebRTC在网络上共享。
  • Firefox 66 将使用 indexedDB 作为数据存储方式,放弃使用传统的 JSON 文件。 扩展的数据将会自动从 JSON 文件迁移到 indexedDB,开发人员不需要做任何操作,整个过程在 Firefox 66 安装过程中进行。使用 storage.local() API 的扩展会体会到其优点,特别当存储大结构的小更改时。
  • 更快的浏览速度,减少内存占用。 对于普通的用户来说,这种变化意味着扩展将会网页加载得更快,同时减少 Firefox 内存占用量。因为当你打开更多的标签时,浏览器会消耗越来越多的内存,例如 Google Chrome。

二、 1、Chrome 73中的新功能

中文文档

  • 支持硬件多媒体按钮 用户将能够通过键盘上的多媒体键控制 Chrome 中播放的音视频内容,指令包括跳过播放列表、播放、暂停、前一曲目、下一曲目、前后向滚动等。
  • 可跟随系统的黑暗主题
  • 自动画中画功能 自动画中画(Automatic Picture-in-Picture)适用于已经安装到系统上的PWA应用程序。Chrome 70版本中引入了在Windows 10平台安装PWA应用的功能,从网页应用的交互体验接近于原生应用,可以将其固定到开始菜单,并且通过Action Center来获得原生通知。不过在此前只有用户手动方式才能将视频切换至画中画模式。启用自动画中画功能之后,应用中嵌入的视频元素可以自动激活,并且会根据用户焦点自动离开画中画状态。

Chrome 73 开发者工具新特性

  • Inspect 模式下的样式属性 在 Inspecting (审视/检查/检视。不同浏览器叫法不一样——译注) 一个元素节点时,开发者工具将展示出一个包含了常见的比较重要的样式属性,如 font、margin、padding。
  • 导出代码覆盖报告数据 分析页面加载过程中有多少代码被用到并导出这些数据为JSON文件

三、ES10 功能完全指南

目前ES10仍然只是一个草案,但它确实添加了一些有趣的东西。

1. BigInt - 任意精度整数

BigInt是第7种原始类型

typeof 10;
⇨ 'number'
typeof 10n;
⇨ 'bigint'

2. string.prototype.matchAll()

+它返回一个迭代器而不是数组,迭代器本身很有用。

+可以使用扩展运算符...将迭代器转为数组。

+它避免使用带 /g标志的正则表达式...当从数据库或外部源检索未知的正则表达式并与古老的RegEx对象一起使用时非常有用。

3. 动态 import

element.addEventListener('click', async () => {
    const module = await import('./api-scripts/button-click.js')
    module.clickEvent()
})

4. Array.flat() - 扁平化多维数组

let multi = [1,2,3,[4,5,6,[7,8,9,[10,11,12]]]];
multi.flat();               // [1,2,3,4,5,6,Array(4)]
multi.flat().flat();        // [1,2,3,4,5,6,7,8,9,Array(3)]
multi.flat().flat().flat(); // [1,2,3,4,5,6,7,8,9,10,11,12]
multi.flat(Infinity);       // [1,2,3,4,5,6,7,8,9,10,11,12]

5. Array.flatMap() - map后扁平化

array.flatMap(v => [v, v * 2])
[1, 2, 2, 4, 3, 6, 4, 8, 5, 10]

6. Object.fromEntries() - 将键值对列表转换为对象

let obj = { apple : 10, orange : 20, banana : 30 };
let entries = Object.entries(obj);
entries;
(3) [Array(2), Array(2), Array(2)]
 0: (2) ["apple", 10]
 1: (2) ["orange", 20]
 2: (2) ["banana", 30]
let fromEntries = Object.fromEntries(entries);
{ apple: 10, orange: 20, banana: 30 }

7. String.trimStart() & String.trimEnd() - 删除字符串头部和尾部空格

let greeting = "     Space around     ";
greeting.trimEnd();   // "     Space around";
greeting.trimStart(); // "Space around     ";

8. New Function.toString() - 标准化所有对象和内置函数的字符串表示

function () { console.log('Hello there.'); }.toString();

⇨ function () { console.log('Hello there.'); }

9. 可选的Catch Binding

在ES10中,Catch Error Binding是可选的 你现在可以跳过 error变量:

try {
    JSON.parse(text);
    return true;
}
catch
{
    return false;
}

10. 标准化的 globalThis 对象

ES10之前全局 this没有标准化。

生产代码中,你必须手动添加如下代码来标准化多个平台的全局对象。

var getGlobal = function () {
    if (typeof self !== 'undefined') { return self; }
    if (typeof window !== 'undefined') { return window; }
    if (typeof global !== 'undefined') { return global; }
    throw new Error('unable to locate global object');
};

但即使这样也并不总是奏效。所以 ES10添加了 globalThis对象,从现在开始应该在任何平台上访问全局作用域:

// Access global array constructor
globalThis.Array(0, 1, 2);
⇨ [0, 1, 2]

// Similar to window.v = { flag: true } in <= ES5
globalThis.v = { flag: true };

console.log(globalThis.v);
⇨ { flag: true }

11. Hashbang 语法

基本上统一了JavaScript在服务器端的执行方式。

$ ./index.js

代替:

$ node index.js

12. ES10 Classes: private, static & public members

新的语法字符#(hash tag)现在直接在类主体作用域以及 constructor和类方法里被用来定义 variables, functions, getters和 setters

个人认为可读性差,但是语法类C++

class Raven extends Bird {
    #state = { eggs: 10};
    // getter
    get #eggs() {
        return state.eggs;
    }
    // setter
    set #eggs(value) {
        this.#state.eggs = value;
    }
    #lay() {
        this.#eggs++;
    }
    constructor() {
        super();
        this.#lay.bind(this);
    }
    #render() {
        /* paint UI */
    }
}

四、 2019年大前端技术趋势深度解读

三大框架标准化

2014 年到 2018混战后, React/Vue/Angular三足鼎立。无论 React 发布 v16,增加 Fiber 和 Hooks,还是 Vue 3.0 发布,支持原生 Class 的写法,AngularJS 又发布了 v6 和 v7 两个版本,三大框架从写法上越来越像,其实最终都是朝着 W3C WebComponents 标准走。

点评:标准化一直是技术发展的大趋势。

应用层封装进入爆发期

框架和工程化基本探索稳定后,大家就开始思考如何更好的用,更简单的用。目前,各家大厂都在前端技术栈思考如何选型和降低成本,统一技术栈。比如我们团队的tua等

  • 零配置就是默认选型都给你做好了。
  • 开箱即用就是技术栈都固化了。
  • 约定大于配置,开发模式也固化好了。

点评:降低成本,统一技术栈带来的好处很多,适合业务发展。

PWA 进入稳定期 - (Progressive web apps,渐进式Web 应用)运用现代的Web API 以及传统的渐进式增强策略来创建跨平台Web 应用程序。

PWA 和 native app(移动应用)的核心区别在于以下几点:

  • 安装:PWA 是一个不需要下载安装即可使用的应用。
  • 缓存使用:native app 主要是对 sqlite 缓存,以及文件读写操作,而 PWA 对缓存数据库操作支持的非常好,足以应对各种场景。
  • 基本能力补齐,比如推送。

PWA 的一些关键点。

  • 通用本地存储的解决方案 Workbox,Workbox 背后则是 Service Worker 和 Cache API 等技术和标准在驱动。
  • PWA 桌面版,2018 年 Google IO 大会上,微软宣布 win10 全力拥抱 PWA,通过爬虫爬取 PWA 页面,并将其转换为 Appx,继而在其应用商店里提供应用,体验和原生 Native 应用非常相近。

点评: 5G时代的到来,web离线获取是趋势

小程序火爆

点评:野蛮发展期,与pwa一样,随着5G时代的到来,如何发展还有待检验

TypeScript权重变高

因为随着前端团队变大,规模化编程也必然依赖类型系统和面向对象的。 TypeScript 落地很好,包容性更好:React 对.tsx 支持非常好,Vue 从 v2.5.0 之后对 ts 支持就非常好,Node.js(尤其是 Egg.js、midway)对 ts 支持也非常好。

WebAssembly

WebAssembly 是一种新的字节码格式,目前主流浏览器都已经支持 WebAssembly。 和 JS 需要解释执行不同的是,WebAssembly 字节码和底层机器码很相似,可以快速装载运行,因此性能相对于 JS 解释执行而言有了极大的提升。 也就是说 WebAssembly 并不是一门编程语言,而是一份字节码标准,需要用高级编程语言编译出字节码放到 WebAssembly 虚拟机中才能运行, 浏览器厂商需要做的就是根据 WebAssembly 规范实现虚拟机。

有了 WebAssembly,在浏览器上可以跑任何语言。从 Coffee 到 TypeScript,到 Babel,这些都是需要转译为 js 才能被执行的,而 WebAssembly 是在浏览器里嵌入 vm,直接执行,不需要转译,执行效率自然高得多。

应用例子:《AutoCAD & WebAssembly: Moving a 30 Year Code Base to the Web》,即通过 WebAssembly,让很多年代久远的 C++ 代码在 Web 上可以运行,并且保证了执行效率。web.autocad.com/