{
"name" : "武田 諭",
"from" : "株式会社 mediba",
"job" : "フロントエンド開発者",
"social": "tkdn",
"career": {
"2003-2013" : "役者",
"2013-" : "エンジニア"
}
}
担当したのは Part 1 導入編, Part 3 応用編
例えば SSG(静的サイト生成)
※ SSG は書籍で扱ってません
例)SSG 変遷
共通する解決したい課題は
✅ 画面を大量生成したい
✅ 手動で作るより
テンプレートに合わせて
画面を大量生成したい
世は SSG 戦国時代(だった(言語も多種多様
✅ 手動で作るより
プログラマブルに
画面を大量生成したい
世は JavaScript 一強時代(バイアス
✅ フレームワーク(巨人)の肩の上で
画面を大量生成したい
フロントエンドに特化しているので
パフォーマンス💯、開発体験💯
💣 選択肢とデプロイが自由すぎる
💣 マニュアル操作で不穏な匂いがする
💣 フロントエンドが通常デプロイフローと区別される
💣 画面に必要なアセットファイルの存在有無が未確定
✅ フロントエンドに軸を置いているので
フロントエンド中心のメリットを享受できる
<link rel="stylesheet" href="https://awsesome-app.com/css/style.css?cache=1604818365">
<script src="https://awsesome-app.com/js/app.js?cache=1604818365"></script>
昨今のフロントエンド事情
webpack でのコンパイルでフォローが可能
// webpack config...
output: {
// 生成されるファイルのダイジェスト値により変わる
filename: '[name].[contenthash].js',
path: path.resolve(__dirname, 'dist'),
},
<link rel="stylesheet" href="https://awsesome-app.com/css/style.0cf28fbf.css">
<script src="https://awsesome-app.com/js/app.7847e54d.js"></script>
つまり?
リリース前後で参照するサブリソースが全く違うので
ローリングアップデート中に不幸がない
実体験)
半年前リリースした資材になぜかまだリクエストがある…
リプレイスしているのに前の API にリクエストがある(なんで…)
C パターンのリリース戦略とはつまり…
👊 まずこの課題をクリアしたい
{
"/assets/css/app.css": "/assets/css/app.640bde4c.css",
"/assets/css/page-a.css": "/assets/css/page-a.201ed25f.css",
"/assets/css/page-b.css": "/assets/css/page-b.b1b57f9f.css",
"/assets/js/app.js": "/assets/js/app.39540668.js",
"/assets/js/page-a.js": "/assets/js/page-a.9bf31e12.js",
"/assets/js/page-b.js": "/assets/js/page-b.7b3b2b62.js"
}
まあいろいろやって読む。
json ファイルキーから実パスを作成
パスを参照した script タグを作る例(PHP
/**
* @param string $url
* @param array $attrs
* @return HtmlString
*/
public static function script(string $url, array $attrs = []): HtmlString
{
$filepath = self::asset($url);
$attributes = self::attributes($attrs);
return new HtmlString('<script src="' . $filepath . '" ' . $attributes . '></script>');
}
// ... なんやかんや
@script("/assets/js/app.js")
<!-- output: --><script src="/assets/js/app.39540668.js"></script>
</body>
</html>
laravel new app
webpack.mix.js
がいるwebpack の小難しいところを
隠蔽したラッパーパッケージ
const mix = require('laravel-mix');
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css')
.version(); // この行だけスキャッフォルド時点では入っていない
ビルドコマンドはすでに用意されている
{
"/js/app.js": "/js/app.js?id=2f472fa1cb8208a4b3f4",
"/css/app.css": "/css/app.css?id=99bb964c34fbf0372f70"
}
mix は付属のヘルパー関数
<link rel="stylesheet" href="{{ mix('css/app.css') }}" />
<script src="{{ mix('js/app.js') }}"></script>
rails new app
webpacker
がデフォルトで入っているwebpack の小難しいところを
隠蔽したラッパーパッケージ
app/javascript/packs/
にファイル設置ビルドコマンドはすでに用意されている
<%= stylesheet_pack_tag 'app' %>
<%= stylesheet_pack_tag 'styles/another' %>
</head>
<body>
<%= javascript_pack_tag 'app' %>
<%= javascript_pack_tag 'scripts/another' %>
</body>
適切なリリース戦略実現のために
バックエンドフレームワークとの協調で何が必要そうか?
昨今の JS フレームワークはフロントエンドに
最適化されたリリース・キャッシュ戦略が込み
最適化されたフロントエンドの戦略を
バックエンドフレームワークにも持ち込む場合