Grails:将资产文件夹中的文件渲染到gsp

Grails: render file from assets folder into gsp

我在 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>

require.js异步加载模块a、b等所有模块。现在我想将它们捆绑到一个文件中——我可以使用 require.js 优化工具,但我更喜欢使用资产管道。只要我将所有模块捆绑到一个 optimized-modules.js 中,它就可以工作,该 optimized-modules.jshttp://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 插件在启动时完成的缩小优化的内容-modules.js。对此有什么想法吗?

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

我不得不使用 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 - 完美!