我在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代码。那么如何将优化的模块.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);
}
但是我无法获得缩小的优化模块的内容.js这是由启动时的资产管道插件完成的。对此有什么想法吗?
好吧,我终于自己发现了:
我没有使用grailsResourceLocator
我不得不使用assetResourceLocator,如果您尝试访问资产资源,这是要走的路。
我的标签定义现在如下所示:
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 中 - 完美!