Rails Webpacker not detecting change

紀錄一次 Rails 6 Webpacker 沒有 watch 到 vue 檔案變動,導致 assets:precompile 沒有正確的編譯出檔案問題。

Rails Webpacker not detecting change
Photo by Claudio Schwarz / Unsplash

Webpacker 是 Rails 6 之後整合好 Webpack 的 gem,主要是為了替代 Sprockets 的工作,因為 Webpack 在現在來說,已經是前端編譯的主流工具了,整個生態系的發展絕對會比 Sprockets 好的許多。

問題

這次在部署的過程中一直遇到一個很弔詭的問題,就是 vue 的畫面一直沒有新增的程式邏輯。
在這個過程一直在懷疑,是否有快取、CDN 甚至是 web server 的快取,看起來都很正常,直接去 public 資料夾看編譯出來的檔案,也確實沒有我新撰寫的程式碼。在 2487 也有看到類似的問題,可是沒有辦法解決我的情境。

就算下了指令

RAILS_ENV=staging bundle exec rails assets:precompile

也只會得到

success Already up-to-date.
✨  Done in 0.60s.
Everything's up-to-date. Nothing to do

解決辦法

從上述情形來看,Webpacker 有一個快取會去紀錄,到底該不該重新編譯這件事情。
如果我們從原始碼下去看,可以發現
https://github.com/rails/webpacker/blob/6b7aa2b464c5cb67784dbb6b4b9893a6bfe03b8a/lib/webpacker/compiler.rb#L107

有個快取的檔案,決定說 Webpacker 到底該不該重新編譯,那麼接下來再往上追一點點,會看到
https://github.com/rails/webpacker/blob/6b7aa2b464c5cb67784dbb6b4b9893a6bfe03b8a/lib/webpacker/compiler.rb#L54
可以大致上理解,cache hash 是如何產生的,既然 watch paths 已經正確了,最後手動的去 path 底下嘗試修改 js 檔案,會編譯,修改 vue 檔案,不會編譯。

好!看了一下設定檔,答案出來了....

  extensions:
    - .tsx
    - .ts
    - .mjs
    - .js
    - .sass
    - .scss
    - .css

我沒有讓他 watch .vue 副檔名,難怪怎麼改都沒用。

  extensions:
    - .tsx
    - .ts
    - .mjs
    - .js
    - .sass
    - .scss
    - .css
    - .vue

收工。