{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/how-to-use-webpack-with-middleman/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"e15915e6-a99b-5a0e-a7f0-c880cac3612a","excerpt":"こんにちは。 当ブログはMiddlemanにて運用しているのですが、検索機能や遅延ロードなどで実装したJavaScriptのビルドにはAsset pipelineなどは使わずにwebpackでビルドしています。 Rails5.1が今betaで出ていますね。中でも目玉はwebpacker.gem…","html":"<p>こんにちは。<br>\n当ブログは<a href=\"https://middlemanapp.com/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Middleman</a>にて運用しているのですが、検索機能や遅延ロードなどで実装したJavaScriptのビルドにはAsset pipelineなどは使わずに<a href=\"https://webpack.github.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">webpack</a>でビルドしています。</p>\n<blockquote>\n<p>Rails5.1が今betaで出ていますね。中でも目玉はwebpacker.gemによるモダンなフロントエンド開発がRailsに導入されることでしょう。\n今までのRailsのasset pipelineとは別に、yarnによって依存性を管理しwebpackで結合する独立したjsのビルドシステムがサポートされます。\nこれによって、以下のような従来のasset pip</p>\n<p>— <a href=\"http://qiita.com/yuroyoro/items/a29e39989f4469ef5e41\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Rails5.1から導入されるwebpacker.gemは本当にRailsのフロントエンド開発に福音をもたらすのか? - Qiita</a></p>\n</blockquote>\n<blockquote class=\"twitter-tweet\" data-cards=\"hidden\" data-lang=\"ja\"><p lang=\"ja\" dir=\"ltr\">つまりレールズはなんでもレールズの一部として歪な形で取り込むのをやめろ <a href=\"https://t.co/oRxC56jEWu\">pic.twitter.com/oRxC56jEWu</a></p>&mdash; null (@yuroyoro) <a href=\"https://twitter.com/yuroyoro/status/831685757655883776\">2017年2月15日</a></blockquote>\n<script async src=\"//platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\n<p>私も同意で、Railsはあくまでサーバサイドアプリケーションで、今まで対してフロントに気を使ってこなかったのだから、中途半端に内部に組み込むのやめてくれ派です。<br>\nMiddlemanはRailsのビュー層の部分だけ持ってきたようなものなので、当然同じ問題が発生します。</p>\n<p>ということで、MiddlemanとWebpackが共存できる妥協点を探って、実際にこのブログに取り入れてみた結果を残します。</p>\n<!--more-->\n<h2 id=\"完成品\" style=\"position:relative;\"><a href=\"#%E5%AE%8C%E6%88%90%E5%93%81\" 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<p>config.rbは<a href=\"https://github.com/Leko/WEB-EGG/blob/master/config.rb#L114\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">こちら</a>、\npackage.jsonは<a href=\"https://github.com/Leko/WEB-EGG/blob/master/package.json#L12\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">こちら</a>、\nwebpackの設定は<a href=\"https://github.com/Leko/WEB-EGG/blob/master/webpack.config.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">こちら</a>から確認できます。</p>\n<h2 id=\"参考\" style=\"position:relative;\"><a href=\"#%E5%8F%82%E8%80%83\" 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<blockquote>\n<p>— <a href=\"https://rossta.net/blog/using-webpack-with-middleman.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Using Webpack with Middleman - rossta.net</a></p>\n</blockquote>\n<p>探していたらちょうど目的に合う記事を見つけました。<br>\nこの記事の通り<a href=\"https://middlemanapp.com/jp/advanced/external-pipeline/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">external_pipeline</a>という拡張を利用します。</p>\n<h2 id=\"external_pipelineってなに\" style=\"position:relative;\"><a href=\"#external_pipeline%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%AB\" aria-label=\"external_pipelineってなに 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>external_pipelineってなに</h2>\n<blockquote>\n<p>ここ数年で, コミュニティは Rails から離れ NPM のタスクランナー (gulp, Grunt) や依存管理 (Browserify, webpack), 公式ツール (EmberCLI, React Native) やトランスパイラ(ClojureScript, Elm) に焦点を 合わせるようになりました。\nMiddleman はこれらすべてのソリューションや言語に対応することはできません。 そこで私たちはこれらのツールが Middleman の中で動作できるようにすることにしました。 この機能は external_pipeline (外部パイプライン) と呼ばれ, Middleman の 複数のサブプロセスで動作します。一時フォルダにコンテンツを出力し Middleman の サイトマップに取り込むことで実現しています。</p>\n<p>— <a href=\"https://middlemanapp.com/jp/advanced/external-pipeline/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Middleman: 外部パイプライン</a></p>\n</blockquote>\n<p>webpack.gemのようなものではなく、きちんと棲み分けされたツールだと思います。</p>\n<h2 id=\"ブログに適用\" style=\"position:relative;\"><a href=\"#%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AB%E9%81%A9%E7%94%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<p>この機能を利用したconfig.rbの記述はこんな感じです。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">activate :external_pipeline, {\n  name: :webpack,\n  command: build? ?\n    \"NODE_ENV=production npm run build\" :\n    \"NODE_ENV=develop npm run develop\",\n  source: \".tmp/dist\",\n  latency: 1\n}</code></pre></div>\n<p><code>build?</code>は<code>middleman build</code>した時だけtrueになります。<br>\n普段ローカルで確認する時はいちいちゼロからビルドされると遅いのでwatchを入れてます。</p>\n<h2 id=\"ビルドしてみる\" style=\"position:relative;\"><a href=\"#%E3%83%93%E3%83%AB%E3%83%89%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B\" 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><code>middleman build</code>してみた時のキャプチャです。</p>\n<p><img src=\"/9606523b075a729c275880d0d756d1f4/middleman-build.gif\" alt=\"middleman build\"></p>\n<p>このように、middleman build時にwebpackのビルドが走り、実行完了を待ってから次の処理へ進む、という挙動になっています。<br>\nということで、Middlemanにwebpackを導入できました。</p>\n<p>Middlemanでサイトを作っているものの、フロントの資源管理に悩まれている時はぜひ検討してみてください。</p>","timeToRead":4,"frontmatter":{"title":"MiddlemanのビルドにWebpackを組み込む方法","tags":["Middleman","webpack","JavaScript"],"date":"August 15, 2017","featuredImage":null}}},"pageContext":{"slug":"/how-to-use-webpack-with-middleman/","previous":{"fields":{"slug":"/report-builderscon-2017/"},"frontmatter":{"title":"Builderscon tokyo 2017に行ってきた","tags":["Builderscon","カンファレンス"]}},"next":{"fields":{"slug":"/implement-site-search-with-algolia/"},"frontmatter":{"title":"Algoliaを利用してMiddleman製サイトに検索機能を実装する","tags":["Algolia","JavaScript","Ruby","Middleman","React","Almin","DDD"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}