我在Grails项目中使用require.js。有几个包含用define
定义的require.js模块的单个JavaScript文件。Grails:将资产文件夹中的文件渲染为gsp
还有一个* .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优化工具,但我更愿意使用assets-pipeline。这样做的效果就像我将所有模块捆绑到一个optimized-modules.js
中,其可在http://example.com/assets/optimized-modules.js
上获得。
问题:我想要在动态呈现的GSP文件中获得优化的JavaScript代码。那么,如何将optimize-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插件在启动时完成的缩小的optimize-modules.js。对此有何想法?
一个Grails 3.1版本的开心与@CompileStatic: ''' @CompileStatic 闭幕RenderFile模块= {地图ATTRS - > 字符串文件路径= attrs.get( '文件') 如果{ throwTagError((文件路径!)必须提供''file'属性“) } Resource asset = assetResourceLocator.findAssetForURI((String)filePath) out << asset.inputStream } ''' –