Rails Webpacker not detecting change
紀錄一次 Rails 6 Webpacker 沒有 watch 到 vue 檔案變動,導致 assets:precompile 沒有正確的編譯出檔案問題。
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
收工。