Grails 3 src/main/webapp загружает файл app.js

Итак, я пытаюсь заставить работать простое приложение Grails 3 и Angular. После локального запуска я ожидал, что мой файл app.js загрузится, а затем загрузит мой файл index.html.

Я не совсем уверен, как работает index/main gsps, но, насколько я понимаю, при использовании asset-pipeline он должен направлять на мой app.js под src/main/webapp/js, а $routeProvider будет обрабатывать все остальное. Но он никогда не перенаправляется на мой app.js. Похоже, он все еще ищет файлы в папке grails-app/assets.

Вот мой index.gsp:

<!doctype html>
<html>
<head>

<asset:javascript src="app.js"/>
</head>
<body>

<asset:javascript src="app.js"/>
</body>
</html>

main.gsp:

<!doctype html>
<html lang="en" class="no-js">
<head>

<p>Here</p>

<asset:javascript src="../../../src/main/webapp/js/app.js"/>

<g:layoutHead/>
</head>
<body>

<g:layoutBody/>

<asset:javascript src="../../../src/main/webapp/js/app.js"/>

Вот мой context-path из application.yml

server:
   contextPath: '/item-upload'

Мой app.js находится под src/main/webapp/js. Это заменяющий каталог для webapp в Grails 3. Поэтому я помещаю туда свои файлы js, html и css.

App.js:

(function (angular) {
'use strict';

angular.module('common.initSideNavPanel', []);

var ngModule = angular.module('app', [
    'ngRoute',
    'ngAnimate',
    'item-upload'
]);

// Configure routing
ngModule.config(['$routeProvider', function ($routeProvider) {
    $routeProvider.when('/', {templateUrl: 'html/index.html', controller: 'UploadCtrl', pageName: 'upload'});

}]);

}(window.angular));

Любые идеи, что я делаю неправильно?


person Andrew Hummel    schedule 16.04.2017    source источник
comment
Вам нужно указать полный путь к ресурсу, ‹asset:javascript src=app.js/› должен работать, не так ли?   -  person Prakash    schedule 17.04.2017
comment
@Prakash Я тоже пробовал это, и он все еще искал в папке активов.   -  person Andrew Hummel    schedule 17.04.2017
comment
конвейер ресурсов по умолчанию ищет ресурсы в папке ресурсов. Почему бы вам просто не скопировать файлы в папку активов. Тогда это должно работать.   -  person Prakash    schedule 18.04.2017


Ответы (1)


Структура каталогов важна.

Плагин конвейера ресурсов требует, чтобы ресурсы находились в определенных каталогах, если только вы не контролируете указание конфигурации конвейера ресурсов в файле build.gradle.

Из документации конвейера ресурсов предполагается, что это папка структура.

Within the grails-app/assets directory are several subfolders
    grails-app/assets/javascripts
    grails-app/assets/stylesheets
    grails-app/assets/images
Otherwise, take control

Вы можете добавить дополнительные папки через (см. здесь)

// in build.gradle
assets {
  includes = ['your/more/js/or/images/folders/etc', 'another/one']
  excludes = ['**/*.less']
}

После того, как вы это сделаете, чтобы ссылаться на свои ресурсы в файлах gsp, вам нужно использовать

<asset:javascript src="app.js"/>

Как указать путь к ресурсу в теге <asset>.

Скажем, у вас есть такой файл grails-app/assets/javascripts/angularjs/app.js в папке с ресурсами, а затем, чтобы сослаться на него, вы должны сделать

<asset:javascript src="angularjs/app.js"/> // NOTE: assets/javascripts is omitted from the path.

Надеюсь это поможет.

В качестве примечания отойдите от папки src/main/webapp. В Grails 3 рекомендуется использовать src/main/resources/public (для общедоступных ресурсов, статических файлов, таких как html и т. д.) и src/main/resource.

person Tyagi Akhilesh    schedule 19.04.2017
comment
Спасибо. Это отличное объяснение. Итак, я думаю, вы ответили на мой следующий вопрос. Все мои пользовательские HTML и CSS помещаются в папку src/main/resources/public, верно? Нужны ли им соответствующие папки, такие как src/main/resources/public/html и src/main/resources/public/css? - person Andrew Hummel; 21.04.2017
comment
HTML надо (наверное?!) обязательно туда съездить. Для CSS (или меньше) используйте grails-app/assets/stylesheets. - person Tyagi Akhilesh; 21.04.2017
comment
Хорошо, допустим, я хочу сослаться на bootstrap.css в своем статическом файле html. Gradle скомпилировал загрузчик под grails-app/assets/bower/bootstrap/bootstrap.css. Как бы я сослался на это в моем html? - person Andrew Hummel; 21.04.2017
comment
Или любой CSS файл в этом отношении. Если он ниже grails-app/assets/..., то как я могу его втянуть? - person Andrew Hummel; 21.04.2017
comment
У меня нет на это окончательного ответа. Сам никогда не пробовал. Но на вашем месте я бы посмотрел окончательный сгенерированный War/Jar и посмотрел, где находятся обработанные (с помощью конвейера ресурсов) ресурсы (я думаю, они размещены как есть, сохраняя структуру каталогов каталога ресурсов), а затем попробовать из этого пути в html. Но это всего лишь предположение. Дайте мне знать, как это получается. Я хотел бы знать ответ и на него. :) - person Tyagi Akhilesh; 22.04.2017
comment
Необходимо использовать префикс URL-адреса /static, см. github.com/grails/grails -core/релизы/тег/v3.0.12. - person Tomáš Myšík; 28.08.2019