Upgrade to Pro — share decks privately, control downloads, hide ads and more …

フロントエンド、私的リリース戦略史 / Connehito Marche Online Front-End release strategy

フロントエンド、私的リリース戦略史 / Connehito Marche Online Front-End release strategy

mediba社合同勉強会】コネヒトマルシェオンライン「祝書籍出版!両社のフロントエンド事情大公開」

発表資料
https://connehito.connpass.com/event/193896/

Satoshi Takeda

November 12, 2020
Tweet

More Decks by Satoshi Takeda

Other Decks in Programming

Transcript

  1. whoami { { "name" "name" : : " 武⽥ 諭

    " " 武⽥ 諭 ", , "from" "from" : : " 株式会社 mediba" " 株式会社 mediba", , "job" "job" : : " フロントエンド開発者 " " フロントエンド開発者 ", , "social" "social": : "tkdn" "tkdn", , "career" "career": : { { "2003-2013" "2003-2013" : : " 役者 " " 役者 ", , "2013-" "2013-" : : " エンジニア " " エンジニア " } } } }
  2. SSG 変遷: Next.js, Gatsby, Nuxt 世は JavaScript ⼀強時代(バイアス ✅ フレームワーク(巨⼈)の肩の上で

    画⾯を⼤量⽣成したい フロントエンドに特化しているので パフォーマンス、開発体験
  3. 私的リリース史 B バックエンド FW が中⼼のパターン 201x 年中頃の Web 開発 FuelPHP

    、Laravel 、Rails 、Yii などの バックエンドFW フロントエンドは控えめに載っかっている バックエンドFW のテンプレートエンジン
  4. 私的リリース史 C フロントエンド特化のパターン 最近関わっている mediba のプロジェクト Next.js SSR/SSG 、React SPA

    ✅ フロントエンドに軸を置いているので フロントエンド中⼼のメリットを享受できる
  5. メリット1: Optimized Cache Busting 中間キャッシュをパージする画⾯サブリソースの参照 URL 変更 < <link link

    rel rel= =" "stylesheet stylesheet" " href href= =" "https://awsesome-app.com/css/style.css?cache=1604818365 https://awsesome-app.com/css/style.css?cache=1604818365" "> > < <script script src src= =" "https://awsesome-app.com/js/app.js?cache=1604818365 https://awsesome-app.com/js/app.js?cache=1604818365" "> ></ </script script> >
  6. メリット1: Optimized Cache Busting 昨今のフロントエンド事情 webpack でのコンパイルでフォローが可能 // webpack config...

    // webpack config... output output: : { { // ⽣成されるファイルのダイジェスト値により変わる // ⽣成されるファイルのダイジェスト値により変わる filename filename: : '[name].[contenthash].js' '[name].[contenthash].js', , path path: : path path. .resolve resolve( (__dirname __dirname, , 'dist' 'dist') ), , } }, , < <link link rel rel= =" "stylesheet stylesheet" " href href= =" "https://awsesome-app.com/css/style.0cf28fbf.css https://awsesome-app.com/css/style.0cf28fbf.css" "> > < <script script src src= =" "https://awsesome-app.com/js/app.7847e54d.js https://awsesome-app.com/js/app.7847e54d.js" "> ></ </script script> >
  7. 1.webpack のビルド時に manifest.json を作成 { { "/assets/css/app.css" "/assets/css/app.css": : "/assets/css/app.640bde4c.css"

    "/assets/css/app.640bde4c.css", , "/assets/css/page-a.css" "/assets/css/page-a.css": : "/assets/css/page-a.201ed25f.css" "/assets/css/page-a.201ed25f.css", , "/assets/css/page-b.css" "/assets/css/page-b.css": : "/assets/css/page-b.b1b57f9f.css" "/assets/css/page-b.b1b57f9f.css", , "/assets/js/app.js" "/assets/js/app.js": : "/assets/js/app.39540668.js" "/assets/js/app.39540668.js", , "/assets/js/page-a.js" "/assets/js/page-a.js": : "/assets/js/page-a.9bf31e12.js" "/assets/js/page-a.9bf31e12.js", , "/assets/js/page-b.js" "/assets/js/page-b.js": : "/assets/js/page-b.7b3b2b62.js" "/assets/js/page-b.7b3b2b62.js" } }
  8. 3. json からパス⽣成するビューヘルパー実装 json ファイルキーから実パスを作成 パスを参照した script タグを作る例(PHP /** /**

    * @param string $url * @param string $url * @param array $attrs * @param array $attrs * @return HtmlString * @return HtmlString */ */ public public static static function function script script( (string $url string $url, , array $attrs array $attrs = = [ [] ]) ): : HtmlString HtmlString { { $filepath $filepath = = self self: :: :asset asset( ($url $url) ); ; $attributes $attributes = = self self: :: :attributes attributes( ($attrs $attrs) ); ; return return new new HtmlString HtmlString( ('<script src="' '<script src="' . . $filepath $filepath . . '" ' '" ' . . $attributes $attributes . . '></script>' '></script>') ); ; } }
  9. 4. テンプレートディレクティブ // ... なんやかんや // ... なんやかんや @script("/assets/js/app.js") @script("/assets/js/app.js")

    <!-- output: --> <!-- output: -->< <script script src src= =" "/assets/js/app.39540668.js /assets/js/app.39540668.js" "> ></ </script script> > </ </body body> > </ </html html> >
  10. 例) Laravel 5.8 laravel new app ルートに webpack.mix.js がいる webpack

    の⼩難しいところを 隠蔽したラッパーパッケージ
  11. 最適化を戦略へ応⽤ 1.webpack.mix.js const const mix mix = = require require(

    ('laravel-mix' 'laravel-mix') ); ; mix mix. .js js( ('resources/js/app.js' 'resources/js/app.js', , 'public/js' 'public/js') ) . .sass sass( ('resources/sass/app.scss' 'resources/sass/app.scss', , 'public/css' 'public/css') ) . .version version( () ); ; // この⾏だけスキャッフォルド時点では⼊っていない // この⾏だけスキャッフォルド時点では⼊っていない
  12. 最適化を戦略へ応⽤ 2. マニフェスト作成 ビルドコマンドはすでに⽤意されている { { "/js/app.js" "/js/app.js": : "/js/app.js?id=2f472fa1cb8208a4b3f4"

    "/js/app.js?id=2f472fa1cb8208a4b3f4", , "/css/app.css" "/css/app.css": : "/css/app.css?id=99bb964c34fbf0372f70" "/css/app.css?id=99bb964c34fbf0372f70" } }
  13. 最適化を戦略へ応⽤ 3. テンプレートから利⽤ mix は付属のヘルパー関数 < <link link rel rel=

    =" "stylesheet stylesheet" " href href= =" "{{ mix('css/app.css') }} {{ mix('css/app.css') }}" " /> /> < <script script src src= =" "{{ mix('js/app.js') }} {{ mix('js/app.js') }}" "> ></ </script script> >
  14. 例) Rails 6.0 rails new app webpacker がデフォルトで⼊っている webpack の⼩難しいところを

    隠蔽したラッパーパッケージ ※ … と思ったが使い勝⼿に癖があって少し⼾惑った
  15. 最適化を戦略へ応⽤ 3. テンプレートへ記述 <%= stylesheet_pack_tag 'app' %> <%= stylesheet_pack_tag 'app'

    %> <%= stylesheet_pack_tag 'styles/another' %> <%= stylesheet_pack_tag 'styles/another' %> </ </head head> > < <body body> > <%= javascript_pack_tag 'app' %> <%= javascript_pack_tag 'app' %> <%= javascript_pack_tag 'scripts/another' %> <%= javascript_pack_tag 'scripts/another' %> </ </body body> >
  16. 参考資料その 2 Caching | webpack ブラウザのキャッシュを活⽤する | PageSpeed Insights |

    Google Developers Prevent unnecessary network requests with the HTTP Cache Caching best practices & max-age gotchas - JakeArchibald.com
  17. 参考資料その 3 クエリ⽂字列パラメータに基づくコンテンツのキャッシュ - Amazon CloudFront S3 バケットのライフサイクルポリシーを作成する⽅法 - Amazon

    Simple Storage Service medz/webpack-laravel-mix-manifest: A webpack plugin that generates Laravel framework compatible mix-manifest.josn le. JeffreyWay/laravel-mix: The power of webpack, distilled for the rest of us. rails/webpacker: Use Webpack to manage app-like JavaScript modules in Rails