我正在使用模块来处理Grails应用程序中的资源依赖性和捆绑:
'module1' {
resource url: '/path/to/resource1-1.js';
resource url: '/path/to/resource1-2.js';
}
'module2' {
dependsOn 'module1';
resource url: '/path/to/resource2-1.js';
resource url: '/path/to/resource2-2.js';
}
这将为上面的示例创建2个包,每个模块一个(注意:确切的包名称可能因某些配置而异):
/app/static/bundle-bundle_module1_defer.js
/app/static/bundle-bundle_module2_defer.js
现在,我正在实现一个使用module2
的Web Worker。在构造Worker时,需要指定它将使用的JS文件的URL,所以如果我知道生成的bundle的名称,它将是这样的:
var worker = new Worker('/app/static/bundle-bundle_module1_defer.js', '/app/static/bundle-bundle_module2_defer.js');
问题是:如何以编程方式获取与'module2'(及其依赖项)对应的这两个网址?我正在寻找类似r:require标记的内容,区别于require
代码生成完整的<script>
代码
<script src="/app/static/bundle-bundle_module1_defer.js" type="text/javascript" ></script>
<script src="/app/static/bundle-bundle_module2_defer.js" type="text/javascript" ></script>
我只需要上面的2个网址。
更新在Web Worker部分添加了一些示例。
答案 0 :(得分:0)
According to the docs,您可以更改将使用您的资源生成的捆绑包的名称:
'module1' {
resource url: '/path/to/resource1-1.js'
resource url: '/path/to/resource1-2.js'
defaultBundle 'module1'
}
'module2' {
dependsOn 'module1';
resource url: '/path/to/resource2-1.js'
resource url: '/path/to/resource2-2.js'
defaultBundle 'module2'
}
答案 1 :(得分:0)
我无法在Grails中找到任何可以轻松完成此任务的内容,但您可以尝试在客户端进行此操作吗?假设您可以在页面中包含脚本文件,那么您可以提取其src
属性并从中创建工作者URL:
<script id="script1" src="/js/script1.js"></script>
和
var script1Url = document.getElementById("script1").src;
var worker = new Worker(script1Url);
是的,这看起来像是一个黑客,如果脚本很大,那么它可能会影响渲染,让浏览器加载它们两次(?)。
答案 2 :(得分:0)
开发了一个实用程序类,它试图尽可能地重用现有代码:
class ResourceProcessorUtil {
def static externalURLPattern = /^((https?:?)?\/\/).*/
static Map getResources(grailsApplication, moduleNameList) {
def grailsResourceProcessor = grailsApplication.mainContext.getBean('grailsResourceProcessor')
def resourceTagLib = grailsApplication.mainContext.getBean('org.grails.plugin.resource.ResourceTagLib')
def modulesNeeded = grailsResourceProcessor.getAllModuleNamesRequired(moduleNameList)
def modulesInOrder = grailsResourceProcessor.getModulesInDependencyOrder(modulesNeeded)
def resources = [:]
for (moduleName in modulesInOrder) {
def module = grailsResourceProcessor.getModule(moduleName)
for (r in module.resources) {
if (!r.exists() && !isExternalURL(r.actualUrl)) {
throw new IllegalArgumentException("Module [$moduleName] depends on resource [${r.sourceUrl}] but the file cannot be found")
}
def info = resourceTagLib.resolveLinkUriToUriAndResource([uri: "${r.actualUrl}"])
resources.put(info.uri, info.resource)
}
}
return resources
}
static Boolean isExternalURL(url){
return url ==~ externalURLPattern
}
}
从控制器(例如)
调用它ResourceProcessorUtil.getResources(grailsApplication, ['some-module', 'an-additional-module'])
将返回包含所有资源的Map <key,value> = <'uri', ResourceMeta>
,根据插件的依赖性解析正确排序。
注意:使用资源插件1.2.1进行测试。 {URL <1}}方法已在URLUtils中的dev版本中实现。
打开了相关建议