【问题标题】:Grails: render file from assets folder into gspGrails:将资产文件夹中的文件渲染到gsp
【发布时间】:2015-11-17 16:58:36
【问题描述】:

我在 Grails 项目中使用 require.js。有几个单独的 JavaScript 文件包含用 define 定义的 require.js 模块。

还有一个 *.gsp 文件,它生成 require.js 配置和以require() 开头的入口点,因为要生成一些动态配置。它看起来像这样:

<%@ page contentType="application/javascript;charset=UTF-8" %>

require(['a', 'b'], function(a, b){
    ...
    var a = ${controllerPropertyA};
    ...
    some functions        
    ...
});

在我的布局中,我像这样集成 require.js:

<script data-main='http://example.com/exampleController/dynamicGenerateMethod?domain=xyz.com' src='http://example.com/assets/require.js'></script>

所有模块 a 、 b 等都是由 require.js 异步加载的。现在我想将它们捆绑到一个文件中——我可以使用 require.js 优化工具,但我更喜欢使用资产管道。只要我将所有模块都捆绑到一个 optimized-modules.js 中,它就可以在 http://example.com/assets/optimized-modules.js 上使用。

问题:我想在动态呈现的 GSP 文件中包含优化的 JavaScript 代码。那么如何将优化的modules.js 文件注入到我动态渲染的GSP 中呢?我已经考虑在标签库中定义一个标签,以便我的 *.gsp 看起来像

<%@ page contentType="application/javascript;charset=UTF-8" %>

<g:renderFile file="/assets/optimized-modules.js" />
require(['a', 'b'], function(a, b){
    ...
    var a = ${controllerPropertyA};
    ...
    some functions        
    ...
});

和标签定义有点像这样:

    def g:renderFile = { attrs, body ->
        def filePath = attrs.file

        if (!filePath) {
            throwTagError("'file' attribute must be provided")
        }
        //out << filePath
        out << request.servletContext.getResource(filePath).file
        //out << grailsResourceLocator.findResourceForURI(filePath).file.text
        //out << grailsApplication.mainContext.getResource(filePath).file.text
        //out << Holders.getServletContext().getResource(filePath).getContent()
        //IOUtils.copy(request.servletContext.getResourceAsStream(filePath), out);
    }

但我无法获得由 assets-pipeline 插件在启动时完成的缩小优化模块.js 的内容。对此有什么想法吗?

【问题讨论】:

    标签: grails assets gsp pipeline inject


    【解决方案1】:

    好的,我终于自己找到了:

    我不得不使用assetResourceLocator,而不是使用grailsResourceLocator,如果您尝试访问资产资源,这是要走的路。

    我的标签定义现在看起来像:

        def renderFile = { attrs, body ->
            def filePath = attrs.file
            if (!filePath) {
                throwTagError("'file' attribute must be provided")
            }
            ServletContextResource bar = (ServletContextResource)assetResourceLocator.findAssetForURI(filePath)
            String fileAsPlainString = bar.getFile().getText("UTF-8")
            out << fileAsPlainString
        }
    

    这样我可以将编译资产 javascript 文件注入到我的 GSP 中 - 完美!

    【讨论】:

    • 带有@CompileStatic 的grails 3.1 快乐版本:```@CompileStatic Closure renderFile = { Map attrs -> String filePath = attrs.get('file') if (!filePath) { throwTagError(" 'file' 属性必须提供") } 资源资产 = assetsResourceLocator.findAssetForURI((String) filePath) out
    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多