以下の内容はhttps://ozaki25.hatenadiary.jp/entry/2024/03/15/220648より取得しました。
No more parser-inserted js
script要素
- 標準は同期実行 & parser-inserted mode
- これが標準なのは互換性のため
- JavaScript1.0(1996)
- document.write
- 今は警告出るしもう使わない
- JavaScript1.0
HTMLパーサとJS実行
- parser-insertedな実行
- HTMLだけなら普通のパース処理
- JSが入るとややこしくなる
- JSでHTML入力ストリームにインサートできる
- JSでDOMツリーを改変できる
- 当然かなり遅い
- 今はもうquerySelectorがあれば十分
- DOM APIがあればパースとめて処理実行する必要ない
defer/asyncの話
- defer
- ダウンロードは並行
- 入力ストリームの終端で実行
- document.writeは虫
- async
- ダウンロードは並行
- パーサを止めて実行
- document.writeは虫
document.write再考
document.write
いいところ
- レンダリングプロセスに介入できる唯一の方法
- 画面が表示されたときには必ず処理が終わってる
- 計測タグ
- レンダリングまでに必ず必要な処理
悪いところ
- レンダリングプロセスに介入してしまう
- 実行タイミングがずれるとページを壊す
何が問題化
- 適切に使えば問題ないがそれが難しい
- 文字列渡すので何でも実行されてしまう
document.writeへの介入
- chromeは介入して止める
- scriptが実行されない
- ただし介入するのはいろんな条件を満たした時
Render Blocking
- 特定の要素にたどり着くまでブロッキングする
- ABテストで画面の表示が確定するまで止めるとか
エディタ付きのReact開発環境をブラウザだけで実装した話
ブラウザエディタ
- https://mosya.dev/react
- StackBlitzのブラウザでnode動かす製品とかあるが有料なので自分で作った
- lintエラーとか型情報とかちゃんと表示される
- Biomeのwasm webをブラウザで動かせる
- workerで動かさないと重すぎる
プレビュー環境
- SWを活用
- 通信に介入するのを利用した
- 必要なファイルを通信しにいってSWでァイルを返す
- 全部mjs化して返して解決させてる
- reactなどのライブラリはimportmapで対応
- SWでHonoを動かしてる
- tsは@swc/wasm-webでトランスパイル
採点機能
- ブラウザでtesting-libraryを動かしてる
- jest-liteで実行
Memory leaks in Web Application
メモリ管理
- アプリの変化
- SPで滞在時間長期化JSの肥大化
- ヒープを圧迫すると最悪タブクラッシュ
- なぜリークするか
- GC言語なのでメモリは自動管理
- 到達可能だけど不要なオブジェクトがリークしてるオブジェクト
- windowから参照されてる
- listener
- 頻出パターン
どうやって特定する
- Memory heap snapshot diffing
- snapshotをn回とって+nなオブジェクトが怪しい
- Retainer treeを確認
- 3snapshot
- ノイズが多くて大変
自動化
- fuite
- MemLab
- BLeak
- LeakPair
- ASTで解析してリークしやすいパターンを見つけてパッチあてる
モニタリング
Service Worker static routing API
SorviceWorker
- fetchをproxyするがその時には起動済みでないといけない
- SWの起動はnavigationにクリティカル
- Androidだとp95で500ms
- cold状態からの起動だとp95で940ms
- SWが介入しなかった時のコストも無駄がある
- navigationPreloadを使うとnavigationと起動を並行できる
SorviceWorkerのコスト改善
- いらない時は動かさない
- Static Routing API
- どういうリソースにどう介入させるのかを宣言的に指定する
event.addRoutes に定義する
- confition
- source
- or
Use case
- navigationはキャッシュしてないとか
- formのPOSTはキャッシュしてないとか
- サブリソースはキャッシュにあればキャッシュがいいとか
- networkタブでserviceworker routerと出るようになる
- 指定した定義も確認できる
以上の内容はhttps://ozaki25.hatenadiary.jp/entry/2024/03/15/220648より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます
不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14