Grails Resources模块:程序化等效于r:require?

时间:2014-01-30 00:53:13

标签: javascript grails groovy resources

我正在使用模块来处理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部分添加了一些示例。

3 个答案:

答案 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版本中实现。

注意2:在http://jira.grails.org/browse/GPRESOURCES-249

打开了相关建议