2015-11-17 80 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 } ''' –