webpackで自動でJSファイルにリビジョンを付けて配信する
業務でレガシーなフロントエンドJSをbundleして、自動でリビジョンを付けて配信するようなタスクを任されたのでその軌跡を紹介します。
自動でリビジョンを付けて配信するというのは、このようなランダムな文字列が付与された静的ファイルのことです。
mypage-7dae16c420f219dde9b5.bundle.js
毎回ソースコードに変更がある状態でビルドすると毎回違うリビジョンが自動で付与されます。
これにどんなメリットがあるかというと、ファイル名が変わることでブラウザは新規ファイルだと判断しGETしてくれます。
ブラウザが良きにとキャッシュしてしまうとソースコードに変更があるのに(キャッシュされた)古いソースコードを参照してしまって予期せぬ挙動をすることがあります。
それを防止するために、確実に最新のJSを取得してもらうためファイル名を変更して配信することが良いことだと言われます。
つまりRailsでお馴染みのアセットパイプラインをwebpackを使ってbundleするついでにやってしまおうということです。
今回の要件は
- ES2015で書かれたJSをbabelでトランスパイルしてbundleすること
- SPAではないので画面ごとにbundleされたJSが欲しい
- ミニファイすること
- リビジョンを付与してブラウザキャッシュを回避すること
スカイプのチャットログをコピペした時に付いてくる「時間」と「ユーザー名」を消す
ここ1ヶ月ほどオンライン英会話を受けて勉強しています。
英会話ツールとしてスカイプを使っていますが、講師の方によってはメモだったり間違えた箇所をチャットログに貼ってくれます。
それを復習用としてEvernoteなどのメモツールに貼り付けようとすると余計な文字がくっついてくるのです。
例えばこんな感じ
[2016/05/21 0:02:34] Hogehoge: I will study driving at the driving school on Sunday. [2016/05/21 0:03:24] Hogehoge: I will attend a Technical Software Seminar tomorrow.続きを読む
PlayのCacheAPIをサブプロジェクトで使いたい
ある程度アプリケーションが大きくなってくるとサブプロジェクトを作ってプロジェクト分割したくなる時があります。
例えばサブプロジェクトでplayのCacheAPIを利用したいと思っても残念ながらplayのCacheAPIはplay.api.Application
に依存しているため、直接使うことができません。
playアプリケーション起動時にplay.api.cache.Cache
の実装を渡してしまえばサブプロジェクトでもplayのCacheAPIを利用することができます。
インターフェースを定義します。
trait Cache { def get(key: String): Option[Any] def set(key : String, value : Any, expiration : Int): Unit def set(key: String, value: Any, expiration: scala.concurrent.duration.Duration): Unit def remove(key: String): Unit }続きを読む