Ruby on Rails开发测试环境下强制重新加载静态资源
解决Rails开发环境下js.erb因环境变量变更无法自动重新编译的问题
嘿,我刚好碰到过类似的情况,给你几个实用的解决方案,都是在开发/测试环境下能用的:
1. 手动删除编译后的目标JS文件
Rails的资产管道会把你的js.erb编译成对应的JS文件存在tmp/cache/assets目录里(开发环境默认存在临时缓存,不是public目录)。你只需要找到这个编译后的文件删掉,下次请求页面时Rails就会重新读取最新的环境变量来编译源文件。
举个例子,如果你的源文件是app/assets/javascripts/dynamic_content.js.erb,编译后的文件大概在tmp/cache/assets/development/js/dynamic_content-<一串哈希值>.js,找到它删掉就行。
2. 一键清空资产缓存
嫌找单个文件麻烦?直接在终端跑命令清空整个资产缓存:
rails assets:clean # 要是想更彻底,连其他临时文件也清掉的话用这个 rails tmp:clear
这个操作会删掉tmp目录下所有缓存内容,下次请求时所有资产都会重新编译,自然会用上最新的环境变量。
3. 给erb文件加个"动态指纹"注释(强推!)
这是最省心的办法,你可以在js.erb文件开头加一行注释,把你用到的环境变量值嵌进去:
// ENV_FINGERPRINT: <%= ENV['YOUR_TARGET_VAR'] %> // 下面是你的原有代码 const dynamicString = '<%= ENV['YOUR_TARGET_VAR'] %>';
这样一来,只要环境变量的值变了,这个注释行的内容就跟着变了,Rails会检测到源文件内容更新,自动重新编译,完全不用手动操作,还不影响代码逻辑。
4. 临时禁用资产缓存(仅调试用)
如果是短时间内频繁改环境变量调试,可以在config/environments/development.rb里临时关掉资产缓存:
config.assets.cache_store = :null_store
这样每次请求都会重新编译资产,但缺点是开发时资产加载会变慢,调试完记得改回原来的配置哦。
我自己平时用得最多的是第3种方法,既不用手动操作,也不会影响开发效率,完美适配你的场景。
内容的提问来源于stack exchange,提问作者Spevak
相关产品推荐
相关产品推荐

