https://gyazo.com/710b423b1dc917e6caf59fc69ccc4dff
仕様書はどこにある?
ECMA-262は毎年版更新される
比較演算子を読もう
Relational Operators
文法
斜体文字は非終端記号
:は定義
追っておくと終端記号が見えてくる
どんな意味があるのか?
リンクで飛べるようになってる
ランタイムのセマンティクスを読む
アルゴリムステップを読んでいく
IsLessThan
Abstract Operation
booleanかundefinedを返す
Syntax-Directeved Operation
何を解決するものなのか
1つのレポジトリにまとめられている
packageの管理ができる
後発のツールは何を解決したか
並列実行のアイドル時間管理
ビルドキャッシュ
標準以外の機能を使いたくない
モノレポはビルドの中心
メンテナンスされなくなるライブラリに任せるのは怖い
パッケージマネージャの組み込み
npm workspace
yarn workspace
pnpm
workspace.yml
ビルドの最小化
コンテナに固めてdistrolessに移し替えてデプロイ
yarn workspace focus
pnpm i --filter
共有ライブラリのmainは何を設定するか
事前にビルドしたindex.jsがよいのでは
コストがかかる?
規模が大きくなると時間がかかってしまう
モノレポツールのキャッシュがそれを改善する
静的解析でもキャッシュがある
モノレポツールにしかできないことは?
いつ使うべき?
早くしないといけないことってあるのかな
パッケージマネージャでいいんじゃない
導入は慎重になろう
おさらい
再利用可能マークアップ
templateで定義
slotは上書きできる
独自HTMLの定義
HTMLElement
customElement
HTTP Archiveで調査した使用率
徐々に増えてきている
何が足りてなかったか
SSR
クライアントサイドルーター
@lit-labs/router
バンドル
事実無くなった技術
Chrome、Safariが採用
Hermes Engineとは
何故作ったのか
スマートフォンは端末によってはスペックが違う
従来のJSエンジンの問題点
ユーザーの実行環境スペックに依存する
Hermesはどう改善している?
アプリに渡る前にバンドル・パーサーで変換、バイトコードの作成するビルドを実行
JITの読み込みが不要になる
JIT Optimizationの恩恵が得られない
SSA iR
Static Hermes
型付きのJSをビルド時にNativeCodeに変換する sound typesで書かれているJSが必要
バックトラック
有限オートマトンは後方マッチなどができない
複数あるのを試して正しいのとマッチするのを見つける
指数的の問題
入力の文字の長さで指数的な数になってしまう
これを解決するための正規表現エンジン
後方参照や先読み後読みを含まない
(概念的に)並列で試す
素のエンジンよりは遅い
当たり前だけど汚染は怖いよね
振る舞いが不可能になる、安全性の問題
3rd Partyは広告以外ある
非同期前提
Object.freeze()を使う
すでに汚染されていた場合はどうする?
厳格にすると使える仕様が小さくなっていく
3つに分割されてる
Compartment
仮想環境を作れる
モジュールを第一級にいじれる用にする方向に
Hardened JavaScript
Operator Overloading is Hard
こういうのをエンジンで実装するのは大変
リテラルはいいけどオペレーターをオーバーロードするのは難しいよ
Decimal.add, Decimal.multiply
オブジェクトとメソッド化になっていきそう
演算子(===)
実は抜け道がある
オブジェクトとオブジェクトを渡したらアドレスとって終わりだった
オブジェクトをベースに比較することになったら
値もみながら分岐で比較するオーバーヘッドがかかる