todo-add-alt

🌏 Hello World! Progressive Web-Blog!!

Web ComponentsでPWAなブログを䜜っおみた。[Loadingç·š]

Feb 13, 2018

🔥 2022幎にサむトの䜜りを倉えたしお、もう珟状はこの蚘事の限りではありたせん。もしこちらの蚘事の実装を参照されるのであれば こちらのブランチ を参照ください。

これで䜕床目の挑戊でしょうか。蚘憶する限り、幎ぶり床目くらいのブログでございたす。䌚瀟のパむセンの@ymotongpooさんは幎もご自身のブログを継続されおおり、日々コンテンツずその䜜業に耐えうるだけの筋肉を増やし続けられおいるのを暪目に、私はずいえば過去に幎以䞊続いた曞きものは日蚘も含めお䞀切なく、ブログはずいうず思い返しおみれば2004幎ごろのラむブドアブログから始たり、蟞めおは乗り換え蟞めおは乗り換えを繰り返しおきた挙句、最終的にはJekyllいじったあたりでさっぱり音信䞍通になったのが幎前。䞊びに、筋肉事情に関しお申し䞊げるず、最埌にゞムに行ったのも気づけば幎半が経っおおり、䌚員暩が腐り始めおいる小倪りク゜坊䞻になっおしたいたした。

実は曞きたいこずはたくさんあるのですが、ブログを再開するずなるずプラットフォヌム遞びに小䞀幎ほどかかるわけです。「Mediumかっこいいなヌ」ず思っおもすでに"uskay"ずいうIDがずられおいたりしおなかなか前に進みたせん。 なんお感じでたご぀いおいたのですが、気づけば2018幎になっおおり、これには流石に自分の実行力なさに絶望を感じたこずもあっお、今たでの怠惰を払拭すべく心機䞀転。今回は䞀番めんどくさくもある「ブログを自䜜」ずいうのをしおみたした。ざっくり申し䞊げるず、Progressive Web Appsなブログに仕立おおおりたす。いた時点はひずたずベヌタ版的な扱いでロヌンチ優先のツギハギものですが、今回圓該プラットフォヌムを開発するに過皋で意識した点を以䞋に蚘茉したすので、䜕かのご瞁でこのペヌゞたで蟿り着かれた皆様におかれたしおは、圓蚘事を今埌のりェブ開発のヒントずなっお消化しお頂けたすず幞甚に存じたす芋せられる出来でもないのですが、珟状の゜ヌスはこちらに晒しおおりたす。

ずいい぀぀曞きたいこずを党郚曞くず盞圓ボリュヌミヌになるかず思われたすので、耇数蚘事に分けさせお頂きたす。初回はLoading線ずいうこずでペヌゞ衚瀺スピヌドの最適化に぀いお䞻に取り䞊げたいず思いたす。

そもそもProgressive Web Appsっお

こちらにもありがたいこずに蚘事にしお頂いおおりたすが、Progressive Web AppsはPWAずいう略名で2015幎埌期ごろから流行っおいるWebフロント゚ンドのベスプラ集、か぀そのベスプラをいい感じに適甚したWebアプリの通称です。「最近むンスタがPWA化したよね」的な語法で䜿われるこずが倚いですが、念のためPWAのコンセプトを芁玄したすず、
  • ずにかくパフォヌマンスのいいサむトにしたしょう。SPAでもSPAじゃなくおも、どんなフレヌムワヌク䜿っおも䜿わなくおも、もうなんでもいいです。なんでもいいから、衚瀺が速くお画面遷移がスムヌズなものにしおナヌザヌに奜かれたしょう。
  • 䞊蚘をチュヌニングしたら、今床は最近䜿えるようになっおきたむケおるWeb APIを積極的に䜿っおよりよい䜓隓をナヌザヌに提䟛したしょう。
  • むケおるWeb APIを䜿うず䜕ができるかずいうず、Webアプリをホヌム画面に远加できるようになったり、オフラむンでも動䜜するようになったり、プッシュ通知ができるようになったり、そんな今たでWebでは実珟できなかったアプリっぜいこずができるので、やらない手はないでしょう
ずいったものです。少し䞊蚘でも觊れおいたすが、PWAはあくたでベスプラ集なので特定の3rd Partyフレヌムワヌクやラむブラリには䟝存したせん。䞖の䞭にはReactを䜿ったPWAもあるし、Polymerを駆䜿したPWAもあるし、PHPサヌバヌサむドペヌゞなPWAもありたす。埓っお技術スタックを倉えずずも適甚可胜なベスプラでありたすし、䞀床に党郚を適甚するのではなく段階的に=Progressively最適化するこずもできたす。

䞊蚘で蚀うずころのむケおるWeb APIをより具䜓的に玹介するず、ServiceWorker、WebAppManifest、Push API/Notification APIPayment Request API、Credential Management APIがいわゆるビッグでスタメンずなりたす。ずりわけ泚目床が高い桜朚花道は間違いなくServiceWorkerずなりたすので、こちらに぀いおは倚くの方がどこかで聞き芚えがあるものず思いたす。

りェブボりズはどんな構成で䜜ったの

ずころで申し遅れたしたが、圓ブログ名は「りェブボりズ」にしたした。私はりェブが奜きで、か぀ボりズ頭であるこずに由来しおおりたすが、気分がいいずきはスキンヘッドにしおおりたすので「テクニカルハゲ」ずどっちがいいかなず悩んでいたずころ、劻からさすがに埌者の案はひどいず諭され今に至りたす。さお、「りェブボりズ」はどのような技術スタックで成り立っおいるかずいうず、
  • フロントのメむンはVanilla JavaScript (ES6) + Web Components
  • バック゚ンドはFirebase Hosting + Fireabase Cloud Functionsでサヌバレス的なアレ
で構成されおいたす。ちょうど絵にするず以䞋のような感じです。

todo-add-alt

恥ずかしながらUskayUIなるこのブログ専甚のWeb Component矀を䜜っおしたいたした.. 埌述したすが、蚘事自䜓はマヌクダりンで曞けるように぀くっおいお、<uskay-article>ずいうコンポヌネントがFirebase Hostingに眮いおある.mdファむルをfetchしおきお、フロント゚ンドでマヌクダりンをパヌス・レンダリングしおいきたす。぀たり、フロント゚ンドでJavaScriptを駆䜿しお動的にコンテンツを構築しおいくタむプのペヌゞずなりたすし、それでも劂䜕に初回衚瀺でもパフォヌマンスよく、各皮Botにもフレンドリヌにするかがポむントずなっおきたす。

Web Components むケおるよ

今回はなるべく3rd Partyフレヌムワヌクやラむブラリは䜿わずに、Webプラットフォヌムの玠材をそのたた掻かすこずを意識しおいたす。ただ、そうはいっおも最近のトレンドであるWebペヌゞ内の各芁玠郡たずえばヘッダヌずかはコンポヌネント化しお䞀元管理したり再利甚したりしたいものです。今でこそReactやVueJsなどコンポヌネント指向な䜿いやすいラむブラリが数倚くありたすが、叀くはDojo toolkitでdeclareしおみたり、jQueryのプラグむンなんか䜿っおみたり、その歎史は決しお短くありたせん。そういったコンポヌネントをWeb暙準で䜜るための仕様がWeb Componentsずなりたす。Web ComponentsはCustom Elements、Shadow DOM、HTML Templatesずいう各Web APIから成り立っおおり、䟋えばものすごいシンプルな䟋ですが以䞋のように簡単にコンポヌネントを䜜れたすR.I.P HTML imports...。

CODEPENで詊す: Simple Custom Element

䞊蚘の通り、Custom ElementsはES6 Classesずしお䜜るので他のコンポヌネントの継承もできたすし、DOM、内郚のロゞックおよびCSSはカプセル化されたすので名前空間の衝突から開攟されたす。もう錻血が出るくらいJavaScriptを構造化しやすくなりたすので是非ずもお詊しください。

AMPを実装したこずある方はご存知かず思いたすが、<amp-img>や<amp-carousel>などずいったAMPのコンポヌネント達はたさにWeb Componentsです。AMPは、AMPHTMLラむブラリが甚意しおあるCustom Elementsを再利甚するこずで簡単にペヌゞが぀くれちゃう、ずいうフレヌムワヌクなのです。たた、最近だずVueJsやAngularがWeb Componentsを吐き出す動きがたたらなくステキで、Web暙準をちゃんずレバレッゞしようぜ的機運を感じたす。

Performance をあげるためには。

ずいうこずでりェブボりズはWeb Componentsだけでペヌゞを䜜っおいるのですが、Web ComponentsっおJavaScriptを実行しお初めおDOMが構築される代物ですので、ペヌゞ衚瀺スピヌドの敵であるJavaScriptの読み蟌みをうたいこず工倫しないずパフォヌマンス良くペヌゞが描画されたせん。そんな最適化が必芁ずなる堎合は、䜕かしらのデザむンパタヌンを参考にするのが定石かず思いたすが、最近はPRPL Patternパヌプルパタヌンず読みたすずいうものが流行っおいたすので、それに埓っおチュヌニングを行っおいきたす。PRPLパタヌンはPush、Render、Pre-cache、Lazy-loadの頭文字を取ったものずなりたしお、それぞれひず぀ひず぀芋おいきたいずは思うのですが、文量の関係䞊、圓蚘事ではペヌゞ衚瀺スピヌド最適化に絞っお䞻にPush/Renderに぀いお芋おいきたいず思いたす。

Push/Render

こちらは、Critical Path初期描画に必芁なリ゜ヌスたちを最適化しようずいうもので「描画に必芁なものはド頭で党郚䞀気にずっおいきたいのでH/2 Pushするか<link rel=preload>を䜿いたしょう」ずいったものです。そもそもHTTP/1.1のたただずりェブボりズのCritical Path関連リ゜ヌスは以䞋のように五月雚にダりンロヌドされおしたうわけです。少なくずもJsは党郚必芁なんですけど、悲しいかな、五月雚に。こちらはChrome Developer ToolsのPerformanceタブで簡単に確認できたす。

todo-add-alt

これをどのように最適化するかずいうず、
  • たずはH/2を有効にしお䞀床に倚くのリ゜ヌスを取埗できるようにしたしょう。
  • 次にリ゜ヌス取埗の優先床を定矩したしょう。
今回はお手軜にH/2 + <link rel=preload>を䜿甚しおいたすが、これだけで以䞋のようにCritical Path取埗が最適化されたす。Preloadされたリ゜ヌスは取埗優先順䜍が高たり、非同期でダりンロヌドされおメモリキャッシュに保存されたす。

todo-add-alt

<link rel=preload>の宣蚀はこんな感じ。ちょっずcrossorigin属性に぀いおはややこしい点もあるので、たたの機䌚に蚘事化しようず思いたす。

たた、りェブボりズではタむトルにWeb Fontを䜿っおいるのですが、FOITを避けるためにCSS @font-face属性のひず぀のfont-displayを䜿っおいたす。珟状font-display: swapずしおいたすので、Web Fontが䜿甚可胜になるたではシステムフォントを䜿っお文字が衚瀺されたす。ナヌザヌに「読める」コンテンツをなるべく速く届けるために是非ずも利甚しおみお䞋さい。


さらには、Web ComponentsをES6 Modulesを䜿っお読み蟌んでいるので、<script type=module>なJavaScriptはすべおDeferされおいたす。DeferしおいるのでJavaScriptがRender BlockするこずなくHTMLのパヌスが行えおお䜜法ずしおはハッピヌなのですが、そもそもHTMLにコンテンツを䜕も甚意しないず最初は背景だけが衚瀺されお、その埌埐々にCustom Elementsが描画されるずいった、レむアりトが動き回る残念な事象が発生したす。これではちょっず恥ずかしい。いくらなんでも無防備するぎるので、スケルトンHTMLを甚意したした。なんのこずはない、HTMLにただむンラむンでダミヌのヘッダヌや蚘事を実装しおいるだけです。

todo-add-alt

っおな感じでPush/Renderの最適化する前ず埌を比范するずこんな感じです。分かりやすいようにNetworkずCPU Throttleをかけおいたすが、Afterのほうがだんぜん衚瀺が気持ちいい...

todo-add-alt

Pre-cache

次にPRPLパタヌン番目のP。Pre-cacheですが、これは次に画面遷移するであろうペヌゞRouteのリ゜ヌスを先読みしおおこうね、ずいうものです。埅っおたした、䞻圹ServiceWorkerの登堎です ...ただ、こちらに぀いおは別蚘事で玹介させお頂きたす。

Lazy-Load

Lazy-Loadは叀くから䌝わる手法ですが、りェブボりズでは画像を党お<uskay-img>ずいうWeb ComponentにWrapしおおり、内郚的にIntersection Observerを利甚しおスクロヌルに応じた画像のLazy-Loadを実珟しおいたす。たた、ペヌゞ䞊郚の描画を優先するために䞋郚のテキストも<uskay-article>内でLazy-Loadしおいたすし、ずころどころ出おくるGistも非同期にShadow DOMに差し蟌めるように<uskay-gist>なるものも䜜りたした。こちらもたた別蚘事で。

Lighthouseで枬っおみた。

で結局どんなパフォヌマンスなのよ、ずいうこずでLighthouseで枬っおみるずこんな感じです。ちなみにLighthouseはChromeのチヌムが開発しおいたすPerformance Auditツヌルで、今やWebサむトの最適化床合いを枬るツヌルの䞭ではデファクト化しおいるものです。ChromeのDeveloper Toolから簡単に䜿えたすので、ただ詊されたこずが無い方は是非ずもお詊しください。

todo-add-alt

悔しくも、Peformance 99点の阿郚寛のサむトには負けたすが、出だしずしおは悪くない、ずいったずころでしょうか。ちなみにLayoutするコンテンツ量も䟝存するJavaScriptもそれなりにある圓ブログにおいお、Perfomanceを90点台埌半たで䌞ばすためには、これたたそれなりに頑匵る必芁がりたした。ただ詊行錯誀を繰り返しながら点数が埐々に䌞びおいくのは芋おいお気持ちがいいですし、その過皋で䜿った圓蚘事のTipsが皆様にほんの少しでもお圹に立おるこずがあれば幞いでございたす。

たずめ

以䞊がLoadingに特化した開発メモずなりたす。お芋苊しい点も倚々あったかず存じたすが、今回玹介できなかったServiceWorkerやWebAppManifestを始め、その他Bot甚にはRendertronを䜿っおいたり、Web Components Polyfillを䜿っおIE11察応したり、Web Share APIを利甚したりしおいるので、たたの機䌚に蚘事ずしおログらせお頂ければず思いたす。

Happy Tuesday!!😆


$whoami

Yusuke Utsunomiya (宇郜宮 䜑亮). Working on the Web Platform but mostly just a big fan of the web and its ecosystem. APAC Manager & Staff Partner Solutions Engineer @Google. Ex Systems Engineer @IBM. Opinions are my own.

Presentation

Article