我正在实现 Grails 插件并且遇到了很大的问题,因为 GrailsonChange
在重新加载静态资源之前触发了事件。所以有时它会返回过时的 css/js 版本。
请解释一下 Grails 如何重新加载静态资源(css/js)(当我运行应用程序时run-app
)?onChange
静态资源重新加载后是否可以触发事件?
我正在实现 Grails 插件并且遇到了很大的问题,因为 GrailsonChange
在重新加载静态资源之前触发了事件。所以有时它会返回过时的 css/js 版本。
请解释一下 Grails 如何重新加载静态资源(css/js)(当我运行应用程序时run-app
)?onChange
静态资源重新加载后是否可以触发事件?
好的...我花了 4-5 个小时来调试它。Grails 使用 Tomcat 处理静态资源 - 检查org.apache.catalina.servlets.DefaultServlet.serveResource
方法。Tomcat 缓存静态资源 5 秒。因此可能存在 Grails 触发插件该文件已更改但 Tomcat 会根据GET
请求返回缓存值的情况。我已经创建了ticketticket并更准确地描述了它
如果你使用资源插件,你可以查看他的源代码。我认为他安排了更改,如果您再次更改文件,可能会取消它。
def onChange = { event ->
if (event.source instanceof FileSystemResource) {
if (isResourceWeShouldProcess(event.source.file)) {
log.info("Scheduling reload of resource files due to change of file $event.source.file")
triggerReload {
event.application.mainContext.grailsResourceProcessor.reloadChangedFiles()
}
}
} else if (handleChange(application, event, getResourceMapperArtefactHandler().TYPE, log)) {
log.info("Scheduling reload of mappers due to change of $event.source.name")
triggerReload {
event.application.mainContext.grailsResourceProcessor.reloadMappers()
}
} else if (handleChange(application, event, getResourcesArtefactHandler().TYPE, log)) {
log.info("Scheduling reload of modules due to change of $event.source.name")
triggerReload {
event.application.mainContext.grailsResourceProcessor.reloadModules()
}
}
}