以下の内容はhttps://ozaki25.hatenadiary.jp/entry/2024/11/23/161251より取得しました。


「JSConf JP」に参加してきました

LT: UI 開発における ヘッドレス UI ライブラリの重要性とデザインシステムへの取り入れ方

UI開発の難しさ

  • ネイティブアプリのようなUIを求められる
  • ヘッドレスUI
    • スタイルを持たないUIライブラリ
    • 振る舞いは提供してくれるがスタイルは何もない
    • たいていはAPGに準拠
  • 従来のUIライブラリ
    • スタイルも提供される
    • 上書きするための労力

LT: A Tour of Anti-patterns for Functional Programming

関数型プログラミング

  • JSで関数型プログラミング
    • 設計の勘所に使いたい
    • 安全な開発にもつながる
  • 例外じゃなくて EitherResult
  • エラーにも種類がある
    • 欠陥があった場合にクラッシュさせるべき場面も
  • Railway Structure
    • fp-ts
    • effect-ts

LT: Storybook との上手な向き合い方を考える

Storybookの設定

  • Storybookはzero config?
    • 導入はすぐ終わる
    • preview.jsにいろんなことを書かないと
    • メンテする覚悟をもって入れないと
  • Storybookを何故使うか
    • レビューの支援
    • テストに使う
  • Storybookでe2eはやりすぎなのでは
    • composeStoryでtesting-libraryでいいのでは
    • v6時代は押されていたが最近はブラウザで動かす方に注力している印象

LT: あなたの知らない Function.prototype.toString() の世界

Function.prototype.toString()

  • 関数のソースコードを取り出せるAPI
  • 関数の転送
    • 関数はシリアライズできない
    • toStringしてevalすれば使える・・?
    • Puppeteerの中でそれをやってる
  • ネイティブコード判定
    • 組み込みの関数はtoStringしてもとれない
    • [native code] ってとれる
    • 正規表現で見れば判定できる
    • 実用的な用途はない・・?
  • Dependency Injection
    • AngularJSで使われていた
    • 引数でControllerにServiceをDIするところで使われてる
    • 荒業すぎてminifyで壊れる

React への依存を最小にするフロントエンドの設計

フレームワークへの依存

  • 依存が最小とは
    • JSのみで書かれた部分の多さ
    • Reactなしで動くコード
    • testライブラリなしで動くコード
  • なぜ依存を最小にするのか
    • エコシステム変化への追従負荷
    • フレームワークの切り替え負荷
    • より良い設計のため
      • ライブラリを使いこなせなくて品質の低いコードが量産e
      • テストを書くのも困難
  • 技術選定
    • Reactに依存しないJSのみで動くライブラリにした
      • swr -> TanStack Query
      • Recoil -> Jotai
      • XState -> 自作ライブラリ
    • 薄いフレームワーク
      • 規約に依存しないAPI
      • ファイルベースルーティングからコンフィグベースルーティング
      • レールから外れる時に難しくないように
    • 標準APIの尊重

React CompilerとFine Grained Reactivityと宣言的UIのこれから

  • ssssota (TOMIKAWA Sotaro)さん

宣言的UI

  • Reactをはじめモバイルにも取り入れられてる考え方
  • 仮想DOMと宣言的UI
    • 宣言的UIを実現するための仕組みとして仮想DOMが使われた
  • 仮想DOMのオーバーヘッド
    • 仮想DOMの処理は純粋にオーバーヘッドでしかない
    • 仮想DOMのツリーを探索する
    • 仮想DOM自体の構築
  • React Compiler
    • 仮想DOMのコストを解決する
    • JSの処理によって仮想DOMのdiff検出を実装している
    • インライン関数をトップレベルに移動したりキャッシュしたりもする
    • 子孫コンポーネントもキャッシュされるのでmemoの代わりみたいになる
  • SolidJS
    • jsxを使ってるが仮想DOMは使ってない
    • 状態は全てsignalで管理し更新されるとDOMを更新する
      • Fine-Grained Reactivity
    • 制約
      • 関数は1回しか実行されない
      • 算出プロパティは関数にしないとダメ
      • 早期returnはできない
  • Svelt5とVueVapor
    • Fine-Grained Reactivity
    • return書かない
    • jsxじゃないから独自記法

Vapor Revolution: Unleashing Vue evolution and Potential with Vapor Mode

Vue Vapor Mode

  • Vapor Mode
  • Vueを支える技術
    • Compiler
    • Reactivity System
      • Fine-Grained Reactivity
      • signal
    • Virtual DOM
      • diff/patchでrerenderする仕組み
  • Vapor Modeでどうなるか
    • レンダリングカニズム
    • Compiler
      • Template -> Vue AST -> Optimized AST -> JS
      • 3番目がVapor IRに変わる
    • Runtime
      • 50%以上サイズが小さくなる
  • Vapor Modeの利点
    • パフォーマンス
    • 互換性
      • 従来の仕組みのサブセットとして動く
    • 相互運用性
      • 混在させて動かすことができる
  • IR(Intermediate Representation)
    • データ構造やコード表現のこと
    • 実行可能なコードを生成する
    • 最適化もする
    • ツリーで表現させる

幸せの形はどれも似ているが、不幸なプロジェクトはそれぞれの形がある

パフォーマンス

  • パフォーマンスは時間の経過とともに劣化する
    • 計測しておかないと何が原因かわからない
  • パフォーマンス課題はどうして発生するか
    • 計測してない
    • 計測できると知らない
    • コード量と比例しないことも
      • 1箇所変なものがあるとそれで悪化する
    • ドキュメントで非推奨と言われてることをやってる
    • 非機能要件に対する指摘が言いづらい環境
  • パフォーマンスと機能追加
    • 中身がないのが一番はやい
    • でも機能を追加していかないといけない
    • バジェットを食いつぶしていくということ
    • 想定することはできないから計測する
      • 推測するな計測せよ
  • フロントエンドの計測
    • 合成モニタリング
    • Web Vitals
      • Lighthouseで計測
    • コードは見ない方がいい
      • 思い込みがない状態で外から最初ははかる
    • Devtoolsと解析を繰り返す
  • Lighthouse
    • FCPはサーバが重いことが多い
    • LCPは非同期のラウンドトリップの問題
    • TBTはバンドル処理
    • CLSは初期画面のCSSのガタツ
    • SpeedIndexは合計なので見なくていい
    • LCPを追っていく
      • Lighthouse的には2.5sで100
      • Devtoolsでどれが重いかでるが、それを出すまでの過程に問題がある
      • Performanceタブで見ていく
        • 縦のかたまりがどれくらいあるかその単位で見る
      • Networkタブ
        • sizeとtime
        • 重そうなやつをブロックして計測してみる
        • 3rdpartyブロックするとか
        • webfont本当に重いのかとか
      • SourcesタブのOverrides
        • ファイルを置き換えられる
        • 空配列にしてみて計測とか
  • ソースコード解析
    • 問題を絞り込んでからソースコードに入る
      • CPPU/Network/RTT
      • 最小のコードで再現するものを作る
    • 計測手段
      • console.log
      • console.time/timeEnd
      • Date.now
      • performance.now
      • debugger
    • ひたすら探索して特定していく
      • ライブラリの中のこともあってそれは大変
    • そこまで特定してコードを改善していく

LINEヤフーにおけるPrerender技術の導入とその効果

先読み技術

  • Webの先読み技術
    • 行動を予測して先回りすることを模索し続けている
  • preload
    • linkタグに先読みするコンテンツをセットする
    • それがないと成り立たないものにつけて優先して読み込む
  • prefetch
    • 次のページで必要なものを読み込む
    • HTTP Cacheに保持させる
  • Private Prefetch Proxy
    • crossoriginでやるとどこを見てたか伝わってしまう
    • 匿名化したサーバを返す仕組み
  • Speculation Rules API
    • 元はprerenderだったがjs処理が必要なのでこれに変わった
    • 宣言的に条件を書く
    • どの要素をどのページで先読みするのか
    • ページの描画やjsの実行もされる
      • ログなど注意
      • prerenderの場合の振り分け等必要
      • Sec-Purpose:prerenderヘッダ
      • document.prerendering
      • prerenderchangeイベント
  • 導入テスト
    • ヤフートップのニュースリンクで検証
    • 読み込み速度は6.9%改善
      • CTRや広告への寄与はなかった
      • iframeは先読みできないので広告にはきかない
    • prerenderしたけど表示されなかったケースが85%
      • アクセス増に対して予測される増強が大きかった
      • 密集したリンクはマウスで迷ってる時に発火してしまう

JavaScriptのモジュール解決の相互運用性

相対パスのimport

  • ESM/CJS
    • CommonJS
      • require
      • 拡張子を省略しても動く
      • 内部ではいろいろ順番にチェックしてとやってくれる
    • ESModules
      • import from
      • 多くは拡張子を書く
        • ブラウザが解釈する時にパターンを試すわけにもいかない
    • package.jsonのtypeで指定
    • 拡張子(.cjs/.mjs)
  • ESMなのに拡張子省略できるパターン
    • importだけど中身はcjs
      • next/angular
    • emsだけど省略できる
      • vite
  • TypeScriptとESM
    • importに.tsと書くかどうか
    • ts5.7で.tsを.jsに書き換えるオプションができた
    • バンドルされて動くなら.tsと書いていい
  • import path alias
    • ts使ってるならtsconfig.jsonのpathsで
    • package.jsonのimportsのsubpath
      • 似たようなことをできる
      • パスはだいたい同じ表現力
      • 配列で書いても一個目しか見てくれない
      • # はじまりじゃないとダメだけど #/ はダメ

Web標準の進化を止めない!Baselineというブラウザサポートの考え方

  • Mariko Kosakaさん

Web標準

  • 新しい機能がたくさん出ているが全ブラウザ対応しないと使えない
    • 新し目のものを使う時にわざわざ確認しないといけない
  • The interop project
    • ブラウザベンダーや開発に履いている企業が集まる場
    • 次に何をやっていくか足並み揃えるために話し合っている
    • 年単位で次どうするか決める
    • それを実現するテストがあって進捗状況が見られる
  • とは言っても本番で使えるか考えるのは大変
    • caniuse見る?mdn見る?
    • 開発者みんなチェックしないと
    • gapがgridでは使えてflexはダメだったとか確認ミスも
  • Baseline
    • 今主要ブラウザでどの機能が使えるか示すもの
    • 同じブラウザでもiOS/AndroidとかどれかでダメならOKにならない
    • 青いチェック
      • Newly available
      • 最新のステーブル
    • 緑のチェック
      • Widly available
      • サポートされて30ヶ月たつとこれになる
    • バツ
      • Limited available
  • Baselineの情報源
    • web-featuresというリポジトリで管理
      • 1つの機能をどの単位で捉えるか大変なのでそれをまとめてる
    • 個々の対応状況はbrowser-compat-dataをmdnから取得している
    • bcdが一番先端でブラウザに機能追加入るとPRできて取り込まれる
    • 検索できる便利サイト
  • Baselineのチェック
    • Lintとか
    • PR出した時にCIでチェックとか



以上の内容はhttps://ozaki25.hatenadiary.jp/entry/2024/11/23/161251より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14