我正在實現Grails插件,並且遇到很大問題,因爲Grails在重新加載靜態資源之前觸發onChange
事件。所以有時它會返回過期的css/js版本。Grails如何在沒有資源插件的情況下處理靜態文件?
請向我解釋Grails如何重新加載靜態資源(css/js)(當我運行run-app
的應用程序時)?靜態資源重新加載後,是否可以觸發onChange
事件?
我正在實現Grails插件,並且遇到很大問題,因爲Grails在重新加載靜態資源之前觸發onChange
事件。所以有時它會返回過期的css/js版本。Grails如何在沒有資源插件的情況下處理靜態文件?
請向我解釋Grails如何重新加載靜態資源(css/js)(當我運行run-app
的應用程序時)?靜態資源重新加載後,是否可以觸發onChange
事件?
好吧......我花了4-5個小時來調試它。 Grails使用Tomcat來處理靜態資源 - 檢查org.apache.catalina.servlets.DefaultServlet.serveResource
方法。 Tomcat緩存靜態資源5秒鐘。所以可能會出現這樣的情況,即Grails觸發插件文件被更改,但Tomcat將返回緩存值GET
請求。我創建了票ticket並更準確地描述了它
如果您使用資源插件,您可以檢查his source code。我想他會安排一次更改,如果再次更改文件,可能會取消它。
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()
}
}
}