2015-11-17 5 views
1

Я использую require.js в проекте Grails. Существует несколько отдельных файлов JavaScript, содержащих модули require.js, определенные с помощью define.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> 

Все модули а, б, и так далее асинхронно загружается require.js. Теперь я хотел бы объединить их в один файл - я мог бы использовать инструмент оптимизации require.js, но я предпочитаю использовать конвейер активов. Это работает настолько, что я получаю все модули, входящие в один optimized-modules.js, который доступен по адресу http://example.com/assets/optimized-modules.js.

Вопрос: Я хотел бы иметь оптимизированный код JavaScript в динамически отображаемом GSP-файле. Итак, как я могу вставить файл optimized-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); 
    } 

Но я не могу получить содержимое из minified optimized-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 -> Строка Filepath = attrs.get ('файл') если { throwTagError ((Filepath!) атрибут '' file 'должен быть указан ") } Ресурс ресурс = assetResourceLocator.findAssetForURI ((String) filePath) out << asset.inputStream } ' '' –

Смежные вопросы