2015-11-17 82 views
1

我在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。对此有何想法?

回答

1

好吧,我终于发现了这件事由我自己:

而不是使用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 - 完美!

+1

一个Grails 3.1版本的开心与@CompileStatic: ''' @CompileStatic 闭幕RenderFile模块= {地图ATTRS - > 字符串文件路径= attrs.get( '文件') 如果{ throwTagError((文件路径!)必须提供''file'属性“) } Resource asset = assetResourceLocator.findAssetForURI((String)filePath) out << asset.inputStream } ''' –