{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/impression-comparison-of-middleman-and-gatsby/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"cdac6ebe-a5e0-5fa8-97d7-c18d9d593a8e","excerpt":"2017年にこのブログはWordpressからMiddleman製に作り変えたのですが、この度MiddlemanからGatsbyへ移行しました。前回の移行の記事はこちらです。 — Wordpressで運用していたブログをMiddleman+Netlifyに変更した | WEB EGG Middleman…","html":"<p>2017年にこのブログはWordpressからMiddleman製に作り変えたのですが、この度MiddlemanからGatsbyへ移行しました。前回の移行の記事はこちらです。</p>\n<blockquote>\n<p>— <a href=\"https://blog.leko.jp/post/migrate-wp-to-middleman-and-netlify/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Wordpressで運用していたブログをMiddleman+Netlifyに変更した | WEB EGG</a></p>\n</blockquote>\n<p>Middleman時代からmarkdownや画像系を全てソース管理していたので、移行は二日くらいで特に問題なく終わりました。\n今回はマイグレーションガイドではなく、使用感としてMiddlemanとGatsbyを比較してみたいと思います。</p>\n<h2 id=\"移行にあたり求めてたこと\" style=\"position:relative;\"><a href=\"#%E7%A7%BB%E8%A1%8C%E3%81%AB%E3%81%82%E3%81%9F%E3%82%8A%E6%B1%82%E3%82%81%E3%81%A6%E3%81%9F%E3%81%93%E3%81%A8\" aria-label=\"移行にあたり求めてたこと permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>移行にあたり求めてたこと</h2>\n<ul>\n<li>描画のパフォーマンスを上げたい</li>\n<li>ビルド速度の大幅改善（もともと3-40分かかってた）</li>\n<li>初期描画の後に動的に動くjs（サイト内検索とか）の開発体験を”普通”にしたい</li>\n</ul>\n<p>Gatsby使えばオフライン対応が入ってPWAにしやすいって話もあるんですが、このブログがPWAになってもどうしようもないのでその辺りは割愛します。</p>\n<h2 id=\"gatsbyによって描画のパフォーマンスが上がった\" style=\"position:relative;\"><a href=\"#gatsby%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E6%8F%8F%E7%94%BB%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%8C%E4%B8%8A%E3%81%8C%E3%81%A3%E3%81%9F\" aria-label=\"gatsbyによって描画のパフォーマンスが上がった permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Gatsbyによって描画のパフォーマンスが上がった</h2>\n<p>lighthouseのスコアはこんな感じです。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 668px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e7fec820b95d2fb3349a030005ebb1b6/09ede/lighthouse.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 34.73053892215569%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'138\\'%20viewBox=\\'0%200%20400%20138\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M11%207v3h54c2%200%203%200%203-3s0-3-1-1h-2l-2-1h-2c-1-1-1%200-1%201%200%202%200%202-2%201-1-2-1-2-2-1-2%202-2%202-2%200-1-2-2-2-3-1h-3c-1-1-1%200-2%201%200%202-1%202-1%201l-4-2h-6c-3-1-6-1-7%201%200%202-2%203-2%201-1-2-7-2-7%200h-1c0-1-1-2-3-2-4-1-4%200-4%202m34%2062l2%201c3%200%208%204%209%207%202%208-3%2015-11%2015s-12-7-10-17l1-2-2%202c-5%206%200%2017%208%2019%2015%204%2023-16%2011-24-4-2-10-3-8-1m70%201c-9%205-7%2019%202%2023%2011%206%2023-7%2018-18-4-7-13-9-20-5m77%200c-14%208-2%2030%2013%2023%206-2%208-6%208-13%200-9-12-16-21-10m84-1l3%201c9%202%2012%2012%206%2019-11%2010-26-4-16-15%204-5%203-6-1-2-12%2011%204%2030%2017%2020%207-5%207-15%201-21-4-3-10-4-10-2m77%200l3%201c4%200%209%206%209%2011%200%2011-11%2015-19%207-3-3-3-3-3-8l3-7%202-3c-2-2-7%206-7%2011%200%2016%2023%2019%2026%203%201-5-2-12-6-14-3-2-8-3-8-1m-236%203c-7%203-7%2013-1%2018%203%203%2010%203%2013%200%2011-9%200-25-12-18m75%201c-7%208-2%2019%208%2019%2011%200%2015-14%206-20-5-3-10-3-14%201m-10%2030l-1%203h17l17-1v-1l1%202v1c2-3%202-5%201-5h-10c-2-2-4-1-4%201h-18c-2-2-2-2-3%200\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/e7fec820b95d2fb3349a030005ebb1b6/5251b/lighthouse.webp 167w,\n/static/e7fec820b95d2fb3349a030005ebb1b6/7390e/lighthouse.webp 334w,\n/static/e7fec820b95d2fb3349a030005ebb1b6/7c056/lighthouse.webp 668w,\n/static/e7fec820b95d2fb3349a030005ebb1b6/0a92e/lighthouse.webp 1002w,\n/static/e7fec820b95d2fb3349a030005ebb1b6/7fa3c/lighthouse.webp 1336w,\n/static/e7fec820b95d2fb3349a030005ebb1b6/cf022/lighthouse.webp 1710w\"\n              sizes=\"(max-width: 668px) 100vw, 668px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/e7fec820b95d2fb3349a030005ebb1b6/21521/lighthouse.png 167w,\n/static/e7fec820b95d2fb3349a030005ebb1b6/86d36/lighthouse.png 334w,\n/static/e7fec820b95d2fb3349a030005ebb1b6/74866/lighthouse.png 668w,\n/static/e7fec820b95d2fb3349a030005ebb1b6/d69c4/lighthouse.png 1002w,\n/static/e7fec820b95d2fb3349a030005ebb1b6/9685e/lighthouse.png 1336w,\n/static/e7fec820b95d2fb3349a030005ebb1b6/09ede/lighthouse.png 1710w\"\n            sizes=\"(max-width: 668px) 100vw, 668px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/e7fec820b95d2fb3349a030005ebb1b6/74866/lighthouse.png\"\n            alt=\"lighthouse score\"\n            title=\"lighthouse score\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>まだ初期描画のパフォーマンスがやや低い（jsのbundleが大きい）のですが、まぁ許容範囲かなと思っています。このブログはリピートで訪問される方の方が多いので、２回目以降や回遊時のパフォーマンスでいえば、圧倒的にGatsbyの方が上です。<br>\nGatsbyをドキュメント通りに使えばService Workerによるキャッシュやprefetchがかかるので、一度訪れたページの表示速度はかなり早いです。\n（Middlemanでも<a href=\"https://github.com/GoogleChromeLabs/sw-precache\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">sw-precache</a>を使ってごちょごちょやってたんですが、管理が面倒で投げ出した）</p>\n<p><a href=\"https://www.gatsbyjs.org/packages/gatsby-plugin-sharp\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gatsby-plugin-sharp</a>で複数解像度の画像をクエリして<a href=\"https://www.gatsbyjs.org/packages/gatsby-image/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gatsby-image</a>を使って画像のlazy loadingと解像度の低い画像を初期表示しておくことも簡単に実現できます。<br>\n参考：<a href=\"https://github.com/Leko/WEB-EGG/blob/34bb9aeb99f7fabf4947b8ae31aa8fc02b8a388d/src/templates/blog-post.js#L107-L114\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">記事のfeatured imageのクエリ</a> と <a href=\"https://github.com/Leko/WEB-EGG/blob/34bb9aeb99f7fabf4947b8ae31aa8fc02b8a388d/src/templates/blog-post.js#L34-L37\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">それを表示するコード</a></p>\n<p>画面遷移には<a href=\"https://www.gatsbyjs.org/docs/gatsby-link/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gatsby-link</a>と<a href=\"https://www.gatsbyjs.org/docs/gatsby-link/gatsby-plugin-catch-links\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gatsby-plugin-catch-links</a>を使うのですが、これらがprefetchの仕組みを備えているので、リンクにmouseenterするとsame-originのリンク先はfetchされ、クリックする前にキャッシュされてるのでサイト内の画面遷移も高速になります。<br>\nまた、通常の<code>&#x3C;a /></code>タグを用いたリロードを伴う画面遷移ではなく、<a href=\"https://github.com/reach/router\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@reach/router</a>を用いてフロントエンドでルーティングしているので、同一ドメイン内での遷移ではリロードが発生しません。当然その分だけ早いです。この辺も自前で頑張らずとも勝手にそうなってくれるのでありがたい限りです。<br>\n<a href=\"https://github.com/GoogleChromeLabs/quicklink\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">quicklink</a>を使って回線強度によっては富豪的にリソースを読み込んでも良さそう、と思ってるのでprefetchの仕組みを変えるかもしれません。</p>\n<p>また、HTTP2対応として<a href=\"https://www.gatsbyjs.org/packages/gatsby-plugin-netlify/?=netlify\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gatsby-plugin-netlify</a>を使えばLinkヘッダも自動で生成もできますし、<a href=\"https://www.gatsbyjs.org/packages/gatsby-plugin-zopfli/?=zop\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gatsby-plugin-zopfli</a>と<a href=\"https://www.gatsbyjs.org/packages/gatsby-plugin-brotli/?=bro\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gatsby-plugin-brotli</a>を読み込むだけでZepfliやBrotliの圧縮にも対応できます。</p>\n<h2 id=\"ビルド速度が大幅に改善された\" style=\"position:relative;\"><a href=\"#%E3%83%93%E3%83%AB%E3%83%89%E9%80%9F%E5%BA%A6%E3%81%8C%E5%A4%A7%E5%B9%85%E3%81%AB%E6%94%B9%E5%96%84%E3%81%95%E3%82%8C%E3%81%9F\" aria-label=\"ビルド速度が大幅に改善された permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ビルド速度が大幅に改善された</h2>\n<p>Middlemanのビルドがとにかく遅くて、CI回すたびに3-40分待つことになるのがかなり辛かったです。<br>\nページのビルドも遅かったんですが、もっとも遅かったのは<a href=\"https://www.imagemagick.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ImageMagick</a>による画像の最適化でした。パッケージやRubyを最新バージョンにしても速度は改善することなく、アクティブな開発も止まってるので、改善される未来も見えないなーと思っていました。<br>\n一方Gatsbyは画像の圧縮を含めても3-4分ほどでビルドが終わるので、10倍以上早くなりました。Gatsbyは画像の最適化に<a href=\"https://github.com/lovell/sharp\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">sharp</a>というOSSを用いており、かなり高速に動作します。sharpは自分も仕事で使っているプロダクトだったので安心して使っています。</p>\n<p>結果的にCIもデプロイもすぐ終わるようになったのでとても快適です。\nGatsby自体がとてもアクティブに開発されているし、ビルド速度に関してもまだまだ改善の余地があると思います。</p>\n<h2 id=\"開発体験が普通になった\" style=\"position:relative;\"><a href=\"#%E9%96%8B%E7%99%BA%E4%BD%93%E9%A8%93%E3%81%8C%E6%99%AE%E9%80%9A%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F\" aria-label=\"開発体験が普通になった permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>開発体験が普通になった</h2>\n<p>私にとっての”普通”とは、JSのエコシステムに乗っかってwebpackサーバ立ててバベって〜、といったよくあるフロントエンドの開発のスタックに乗り換えたいということでした。</p>\n<blockquote>\n<p>— <a href=\"https://blog.leko.jp/post/how-to-use-webpack-with-middleman/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">MiddlemanのビルドにWebpackを組み込む方法 | WEB EGG</a></p>\n</blockquote>\n<p>MiddlemanでもAsset pipelineに乗っからずに無理やりwebpackを突っ込んで利用していたんですが、あまり体験は良くありませんでした。\nGatsbyではwebpackの設定がいい感じなので設定を自前で頑張る必要もありません（現時点では独自のwebpack.config.jsを持ってない）。\nカリカリにチューニングしようと思ったらその辺頑張る必要があると思うんですが、いざという時はなんとでもできそうという安心感があります。</p>\n<h2 id=\"総評\" style=\"position:relative;\"><a href=\"#%E7%B7%8F%E8%A9%95\" aria-label=\"総評 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>総評</h2>\n<p>まだ移行して数日ですが、今の所メリットしかないと思っています。<br>\nもちろんメリットがあると思っていたから移行したんですが、思ってた以上の嬉しさ（prefetch周りとかオフライン対応とか）がついてきたので、思わぬ誤算でした。\n今回のスタックはかなり満足いってるので、使ってて何か出たらGatsbyのプラグインやcoreにcontributeしていく所存です。</p>\n<h2 id=\"その他雑感\" style=\"position:relative;\"><a href=\"#%E3%81%9D%E3%81%AE%E4%BB%96%E9%9B%91%E6%84%9F\" aria-label=\"その他雑感 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>その他雑感</h2>\n<p>その他感じたことも雑多に残しておきます。</p>\n<h3 id=\"見た目を完全に保ったまま移行するのはかなり手間だと思う\" style=\"position:relative;\"><a href=\"#%E8%A6%8B%E3%81%9F%E7%9B%AE%E3%82%92%E5%AE%8C%E5%85%A8%E3%81%AB%E4%BF%9D%E3%81%A3%E3%81%9F%E3%81%BE%E3%81%BE%E7%A7%BB%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%8B%E3%81%AA%E3%82%8A%E6%89%8B%E9%96%93%E3%81%A0%E3%81%A8%E6%80%9D%E3%81%86\" aria-label=\"見た目を完全に保ったまま移行するのはかなり手間だと思う permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>見た目を完全に保ったまま移行するのはかなり手間だと思う</h3>\n<p>MiddlemanやJekyll等から移ってくるには、これまでテンプレートエンジンで書いてた部分やスタイルを全てjsxで書き直す必要があります。\nもともとのcssやSassを保ちつつ、１つ１つの要素にclassName振ってってもいいと思いますが、CSS in JSで書いた方がtree shakeしやすかったり「JSで書くならやれること」がたくさんあるので文句なしの形に移行するにはかなり手間がかかると思います。</p>\n<p>移行に際して、見た目に関してこだわっておらず「本文が読みやすくて表示が早ければいい」と思っていたので、ほぼデフォルトのままで、本文に関してはMediumを参考にスタイルを当てました。</p>\n<h3 id=\"markdownエンジンの移行はノーダメージ\" style=\"position:relative;\"><a href=\"#markdown%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%AE%E7%A7%BB%E8%A1%8C%E3%81%AF%E3%83%8E%E3%83%BC%E3%83%80%E3%83%A1%E3%83%BC%E3%82%B8\" aria-label=\"markdownエンジンの移行はノーダメージ permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>markdownエンジンの移行はノーダメージ</h3>\n<p>markdownのエンジンがRuby（私の場合は<a href=\"https://github.com/vmg/redcarpet\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Redcarpet</a>）からNode（<a href=\"https://github.com/remarkjs/remark\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">remark</a>）のものに変わるので、独特の方言を使ってると記法の解釈が変わる可能性がありますが、当ブログのmarkdownの構文は変えずに移行できました（アセットのパスとかfrontmatterのフィールド名はASTにバラしてゴリっと変えたけど）。<br>\nもしAsset pipelineを活かした<code>xxx.md.erb</code>のようなmarkdownエンジンの外側の問題があると、そこは苦労すると思います。</p>\n<p><del>strike through</del>も使えるし、見出しの横のパーマリンクも<a href=\"https://www.gatsbyjs.org/packages/gatsby-remark-autolink-headers/?=head\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gatsby-remark-autolink-headers</a>で実現できたし、</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> message <span class=\"token operator\">=</span> <span class=\"token string\">'Fenced code blockによるSyntax highlightも使えるし'</span></code></pre></div>\n<p>記事では見えませんがFrontmatterも使えてます。\n（<a href=\"https://github.com/Leko/WEB-EGG/blob/master/content/blog/impression-comparison-of-middleman-and-gatsby/index.md\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">この記事のソース</a>）</p>\n<h3 id=\"開発用サーバの起動はmiddlemanの方が早い\" style=\"position:relative;\"><a href=\"#%E9%96%8B%E7%99%BA%E7%94%A8%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E8%B5%B7%E5%8B%95%E3%81%AFmiddleman%E3%81%AE%E6%96%B9%E3%81%8C%E6%97%A9%E3%81%84\" aria-label=\"開発用サーバの起動はmiddlemanの方が早い permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>開発用サーバの起動はMiddlemanの方が早い</h3>\n<p>Middlemanでは類似の記事の検索＋表示をやっていました。Gatsbyではそれをやってないのですが、それでもMiddlemanの方が起動は早いです。<br>\n画像の圧縮を開発時にもやっていることが主な問題なんですが、本番だけバグることをなるべく避けたいし、そのデバッグに手間をかけたくないのでこのまま続ける予定です。もし速度が気になっても開発時は圧縮を切ればいいので、改善の余地はまだまだあると思います。<br>\n（もしMiddlemanで画像の圧縮を開発時にやっていたらサーバ起動するのにビルド時のように数十分かかるので、相対的に見れば圧倒的に早い）</p>\n<p>起動する時間はMiddlemanはおおよそ30秒、Gatsbyの方は1~2分ってとこなのですが、どちらにせよエディタに向かって記事を書いてる間にサーバは立ち上がってるのでそれほど問題になっていません。</p>\n<h3 id=\"ライブリロードの速さはgatsbyの方が上\" style=\"position:relative;\"><a href=\"#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%AA%E3%83%AD%E3%83%BC%E3%83%89%E3%81%AE%E9%80%9F%E3%81%95%E3%81%AFgatsby%E3%81%AE%E6%96%B9%E3%81%8C%E4%B8%8A\" aria-label=\"ライブリロードの速さはgatsbyの方が上 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ライブリロードの速さはGatsbyの方が上</h3>\n<p>Hot Module Replacement(HMR)が入ってるので、画面自体をリロードせずに描画だけ更新ができます。<br>\nWebアプリなどで自前で設定を組むのはやや面倒ですがGatsbyでは最初から設定済みなので、使い始めれば勝手にHMRが効くようになります。\n細かいスタイルの調整をしてる時にはとてもありがたく、一度サーバさえ立ち上がってしまえばそのあとは圧倒的にGatsbyの方が快適です。</p>\n<h3 id=\"gatsbyのページネーションはgraphqlに慣れれば簡単で明快\" style=\"position:relative;\"><a href=\"#gatsby%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AFgraphql%E3%81%AB%E6%85%A3%E3%82%8C%E3%82%8C%E3%81%B0%E7%B0%A1%E5%8D%98%E3%81%A7%E6%98%8E%E5%BF%AB\" aria-label=\"gatsbyのページネーションはgraphqlに慣れれば簡単で明快 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>GatsbyのページネーションはGraphQLに慣れれば簡単で明快</h3>\n<p>ページネーション系のプラグインを探してみたものの、どれもあまり使われてないか、開発が止まっていました。<br>\nただそもそもプラグインは必要なく、<a href=\"https://www.gatsbyjs.org/docs/adding-pagination/#adding-pagination\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">公式のガイド</a>があったのでその通りに実装しました。<code>gatsby-node.js</code>から各コンポーネントへのデータフローがわかれば、特に違和感なく書けると思います。<br>\nその要領で<a href=\"https://github.com/Leko/WEB-EGG/blob/34bb9aeb99f7fabf4947b8ae31aa8fc02b8a388d/gatsby-node.js#L65-L81\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">タグごとの記事一覧ページ</a>も作りましたが、特にハマることも無く素直に実装できました。</p>\n<h3 id=\"todo\" style=\"position:relative;\"><a href=\"#todo\" aria-label=\"todo permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>TODO</h3>\n<ul>\n<li>初期描画のパフォーマンス改善</li>\n<li>パフォーマンス面のlint（<a href=\"https://webhint.io/scanner/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">webhint</a>や<a href=\"https://developers.google.com/web/tools/lighthouse\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">lighthouse</a>、bundle sizeの<a href=\"https://github.com/ai/size-limit\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">size-limit</a>）を強化したい</li>\n<li>パンくずがないと今表示してるページがなんなのかぱっと見でわかりにくい</li>\n<li>サイト内検索がないと（自分が記事を探すときに）面倒くさいし、それなりに使われてるらしいので復活させたい</li>\n</ul>\n<p>などをボチボチやっていく予定です。</p>","timeToRead":12,"frontmatter":{"title":"ブログをMiddlemanからGatsbyに乗り換えた雑感","tags":["JavaScript","Gatsby","Middleman"],"date":"January 05, 2019","featuredImage":null}}},"pageContext":{"slug":"/impression-comparison-of-middleman-and-gatsby/","previous":{"fields":{"slug":"/you-might-not-need-dotenv-in-source/"},"frontmatter":{"title":"プログラム内でdotenvを読み込むのをやめた話","tags":["Node.js","JavaScript"]}},"next":{"fields":{"slug":"/nodejs-is-now-supported-brotli-compression/"},"frontmatter":{"title":"Node.jsの11.7.0からzlibモジュールでBrotli圧縮が使えるようになりました","tags":["Node.js"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}