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.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 插件在启动时完成的缩小优化的内容-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 - 完美!
我在 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.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 插件在启动时完成的缩小优化的内容-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 - 完美!