我需要加载外部(CMS提供的子模板)资产,其中CSS和JS最终位于顶部或底部,具体取决于文件类型或处置属性
查看这篇文章(Placement Of JS Resource Via <r:external />)我发现如果未在模块配置中定义CSS和JS,则无法在LayoutResources中放置它们。
在阅读资源插件代码之后,我想到了一个额外的标签,它可以动态创建模块,以便将它们附加到。这是一个快速原型,请不要判断质量:)
标签:
<r:cmsExternal url="/c/test.css" />
背后的代码(从ResourceProcessor类中挑选):
def cmsExternal = { attrs ->
String disposition = attrs.remove('disposition')
String url = attrs.remove('url')
// Creating adhoc module
ResourceModule module = grailsResourceProcessor.getModule(url) as ResourceModule
// Prevent creating the same module/resource twice
if(!module) {
grailsResourceProcessor.defineModule(url)
module = grailsResourceProcessor.getModule(url) as ResourceModule
grailsResourceProcessor.resourceInfo.addDeclaredResource {
ResourceMeta resourceMeta = new ResourceMeta(id: url, sourceUrl: url, workDir: grailsResourceProcessor.getWorkDir(), module:module)
grailsResourceProcessor.prepareResource(resourceMeta, true)
resourceMeta.disposition = disposition == 'head' || resourceMeta.processedFileExtension == 'css' ? 'head' : 'defer'
module.resources = [resourceMeta]
resourceMeta
}
}
// Rendering adhoc module
r.require(module: url)
}
它确实运作良好,但我想知道是否有人有更好的想法/方法来做到这一点。