2018-12-03

Jekyll 3 + JekyllAssets + Parcelの環境を作ったけど注意が必要だった

先日の Middleman 4.2.1 + External Pipeline + Parcel 1.12環境を作れた - あーありがち(2018-11-23) に続いて Ruby の静的サイトジェネレータと Parcel を組み合わせる実験。

Middleman の評価については別に話があるんだけど、それは置いておく。

Jekyll には Middleman の External Pipeline のような仕組みは存在せず、各位で頑張って webpack を使う boilerplate が何個もできているような状態だったりする。

Search · jekyll webpack

これはこれで参考になるんだけど、できるだけ生で Webpack を触りたくないということで今回は前回に引き続いて parcel を使ってみることにした。

素材

ディレクトリ構成

前回と同様に

+- bin/
+- assets/     parcelが処理するもの
+- source/     jekyllが処理するもの
    +- assets/ parcelの処理結果かつjekyll-assetsのサーチパス

とした。

npm scriptsとnpm-run-allで処理を制御

Jekyll には External Pipeline のような賢い仕組みは存在しないので、build の際には

  1. parcel
  2. jekyll

の順番でコマンドが実行されるようにしてあげないといけない。

serve の際には npm-run-all で parallel に実行してあげれば両方ともいい具合に watch して rebuild してくれるのでそんなに気にする必要はない。

assets/ 以下を編集 → parcel が処理して source/assets/ に反映 → jekyll が処理して _site/assets/ に出力

が自動的にグルグル回ってくれる。

なぜJekyllAssetsか

サーバに依存しない cache buster のため。

Jekyll 自体には cache busting を支援する仕組みはなく、いろんな組み合わせがあり得る。例えば Web サーバを直接設定できるのであれば、revision を適当に URL に埋め込んで処理するという方法もある。

しかしせっかく静的サイトを生成するのであれば Web サーバには依存したくないというのが正直なところで、例えば S3 + CloudFront で似たようなことをやろうと思うと Lambda 使ってくださいみたいな話になっちゃって、静的サイトでサーバ要らずとはなんだったのか?という気持ちになってしまう。

注意すべきはjekyll-assetsのファイル名の扱い、特にparcel watchと組み合わせた時

parcel にも HTML からまとめて build させるとすべて同じディレクトリにフラットにぶちまけられてしまう問題があったが、jekyll-assets には

assets/ 以下のパスをいい具合に検索する機能

があるおかげで、

同じ名前のファイル名があるとどっちが正なのか分からなくなる

という致命的な問題がある。

どういうことかというと、例えば

assets/js/site.js
       css/site.js

があった場合に

{% asset site.js %}

と書くとどっちの site.js を読み込んでよいのか分からなくなってしまうという問題だ。

上の例だと「そんなことやるわけじゃないじゃん?」と思うかもしれないが、parcel は CSS に対しても HMR 用の JS を吐くので、意図せず同じ名前の JS が生成されてしまうことはあり得るのですよ。

ということで、

parcel + jekyll-assets を使う場合はファイル名のルールをちゃんと整えるべし

と思ったのでした。

ただ、そこさえ考えておけば必要な設定がほとんどないというのはやはり魅力。そこは JekyllAssets も Parcel も優秀だと思う。

例によって成果物

wtnabe/jekyll-v3-example-with-jekyll-asset-and-parcel

こんな感じ。

About

例によって個人のなんちゃらです

Recent Posts

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Document SVG AsciiDoc Pandoc DocBook Develop Jekyll macOS Node.js Vite Heroku Transformer AI Data Cloud Wasm