{
"name" : "武田 諭 / Satoshi Takeda",
"from" : "株式会社 mediba",
"job" : "Front-End web developer / Architect",
"social": "tkdn",
"career": {
"2003-2013" : "Actor",
"2013-" : "Developer"
}
}
という内容を供養しにきました。
テキスト多めですが JS な話題も盛り込みます
かいつまんで
歪な状態 🤔
収益の問題
そのままでもいいのでは?
TTI
初期表示に必要な広告のロードタイミング
// 画面内の iframe の navigated なタイミングを取得
page.on("framenavigated", frame => console.log)
// デプロイ機構の変更による例外試験でアセットファイルに
// 不正なステータスコードを含んでいないかチェック
// これをローリングアップデート中に無限ループでテストする
page.on("response", response => {
const url = response.url();
if (url.includes(`${domain}`)) {
statuses.push(response.status());
}
});
いろんなイベント取れるので
API ドキュメントを読んでみるといいかもしれません
なぜ収益が落ちたのか?
ここから立てた仮説
アプリケーションの成立を早めて
サードパーティスクリプトとの棲み分けを最適化する
1: バンドルサイズの縮小
2: 効果がありそうな
Dynamic Imports, Progressive Hydration の実施
Next.js v5 -> v9
redux/reducer 部分で state のアップデートに
lodash に依存していた updeep を置き換え
9kb ダイエット(小さなことからコツコツと)
{...state, someState: true}
object spread で十分
クライアントでは Sentry 自体を
別バンドルにさせてアプリコードから除外したい
とはいえ SSR 時には Sentry を含めたい
// next.config.js ≒ webpack.config.js
// クライアントビルドでは @sentry/node
// => 無を返すモジュールに差し替える
if (!isServer) {
config.resolve.alias["@sentry/node"] =
path.join(__dirname, "./dummy/_sentry");
}
sentry.init(options)
されてもなにも処理しないこれらだけ対応したのではなく
詰められるサイズはどんどん詰めていった🔥
// 書き味は Next 風味です
const Header = dynamic(
() => import(/* webpackChunkName: "Header" */ "./Header"));
const Info = dynamic(
() => import(/* webpackChunkName: "Info" */ "./Info"));
const Search = dynamic(
() => import(/* webpackChunkName: "Search" */ "./Search"));
const Tabs = dynamic(
() => import(/* webpackChunkName: "Tabs" */ "./Tabs"));
const Panels = dynamic(
() => import(/* webpackChunkName: "Panels" */ "./Panels"));
const Footer = dynamic(
() => import(/* webpackChunkName: "Footer" */ "./Footer"));
render
shouldComponentUpdate
-> false
// ref を持った空 div
<div
ref={el => this.root = el}
dangerouslySetInnerHTML={{__html: ""}}
suppressHydrationWarning
/>
ReactDOM.hydrate
でマウント先ほどの ref
を持った要素に新たな仮想 DOM をマウントさせる
別のマウントポイントができるため…
// rehydrate するコンポーネント
<SomeContextProvider value={value}>
<Provider store={window.__REDUX_STATE__}>
{/** children */}
</Provider>
</SomeContextProvider>
シンプルな構成なら大丈夫だが結構面倒くさい
React Conf で Concurrent Mode への注目が大きいが
ReactDOM.scheduleHydration
も用意され始めていますhacky じゃないやり方で公式でサポートしてくれるなら嬉しいかも。
まだ分析途中ではあるものの
バンドルサイズの縮小
有意差がほとんどない…!
※ これはあくまでこのプロダクトでの話です
Before | After |
---|---|
![]() | ![]() |
チャンク化したからってそんなに旨味があるものでもない
チャンク化したスクリプトのロードと評価はバラせてもバンドルサイズの圧縮
TTI の向上
可能であれば施策ひとつひとつに
効果測定をしたほうがいい