PerfectPan / Collection

杂货铺
0 stars 0 forks source link

JavaScript #2

Open PerfectPan opened 2 years ago

PerfectPan commented 2 years ago

Shared memory and atomics

PerfectPan commented 2 years ago

V8 JAVASCRIPT FIXES (HORRIBLE!) RANDOM NUMBER GENERATOR

PerfectPan commented 2 years ago

lerna以及lerna-changelog使用

PerfectPan commented 2 years ago

Blazingly fast parsing, part 2: lazy parsing

简单介绍了 V8 如何对不必要的函数的延迟编译以提升第一次加载的性能,整体编译会有预编译 + 完整编译的流程,预编译会处理函数相关的信息,对于一些 IIFE 类型的立即执行函数,V8 有自己的策略(贪心,比较简单,有些 case 会考虑不到)去判断来跳过预编译从而减少不必要的步骤,因为这些函数是会被立即执行的。

后面介绍了 optimize-js 在高版本 V8 引擎中是不推荐使用的,优化策略太激进(将过多函数变成 IIFE,跳过命中跳过预解析的步骤)且会造成不必要的 memory usage,最终不会使第一次加载变快(其实还没太看懂,TBD)。

预编译模块代码:https://source.chromium.org/chromium/v8/v8.git/+/e3b2feb3aade83c02e4bd2fa46965a69215cd821:src/parsing/preparser.h;l=921

PerfectPan commented 2 years ago

test262

ECMAScript 的官方测试用例,262 是因为这个标准的编号是 262

PerfectPan commented 2 years ago

JS 中 setTimeout 的实现机理是什么?

看不懂,先 mark(我实在是太菜了)

Test Case: https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/trusted-types/block-string-assignment-to-DOMWindowTimers-setTimeout-setInterval.tentative.html

PerfectPan commented 2 years ago

javascript-compiler-optimization-techniques-only-for-experts

PerfectPan commented 2 years ago

不用 WebAssembly 也能实现 Web 虚拟机保护

Github 地址: https://github.com/sablejs/sablejs

需求是需要阻止反编译(验证码等场景),web 比较开放,js 代码都能断点到,不是很安全,因此需要一个沙盒的东西

简单扫了一下做这个的原因是 wasm 与 js 通信只能通过 eval,而 eval 是非常不安全的(据 Boson 说不是的),所以用 qjs 编译到 wasm 做一个沙盒不太好

调研了市面上的用 js 解释 js 的库(这样才能跑在一个 event loop 里)都不太行,于是自己写了一个

1.x 是预编译 js 代码成栈指令,然后跑在一个他实现的虚拟机环境里,但毕竟是 js 跑 js,会有性能问题,因此需要面向 V8 优化:

2.0 会在 22 年年中开源,脱离虚拟机的限制,性能更好

本地试了下需要 Node v14+

其他库: https://www.sweetjs.org/ 类似 C 的宏

感想:

PerfectPan commented 2 years ago

从 JS 引擎到 JS 运行时(上) 从 JS 引擎到 JS 运行时(下)

介绍了如何基于 qjs 定制化一个 runtime,怎么为 runtime 定制化能力(通过 C 扩展),如何移植默认的 Event Loop,支持 libuv 的 Event Loop。

关于 libuv 部分其实没太看懂,水平比较欠缺,日后水平上来了再来看一看。

其他:QuickJS 引擎一年见闻录

txiki.js 运行时基于 libuv 提供了类似 Node.js 的能力,作者是 libuv 的核心开发者。 vscode-quickjs-debug 提供了非官方的 VSCode 调试器支持,需要与作者 fork 出的定制版 QuickJS 配合使用。Fabrice 曾经对此表示会考虑加入调试器协议,可惜现在还没有进一步进展。 quickjs-emscripten 可以在浏览器里基于编译到 WASM 的 QuickJS 建立 VM 沙盒,执行不可控的外部 JS 代码。 unity-jsb 支持在 Unity 游戏引擎里使用 JS,这时运算符重载特性相当重要。 GodotExplorer/ECMAScript 支持在 Godot 游戏引擎里使用 JS。顺带一提,它是由知乎用户 @Geequlim 开发的。 flutter_js 支持在 Flutter 环境里执行 JS,它在安卓上会使用 QuickJS。不过注意这时实际的开发语言还是 Dart。 qjs-wasi 支持基于新的 WASI 标准,把 qjs 可执行文件直接编译到浏览器里执行。 fast-vue-ssr 刚刚推出,配合 Rust 上的高性能 Warp HTTP 框架来做 Vue 的 SSR。作者认为这种手法在多线程使用时,能兼备低资源消耗与高吞吐量。 quickjs-zh 提供了 QuickJS 文档的中文翻译