Активы отсутствуют в приложении Angular, построенном с использованием grunt

Я создал приложение, использующее Yeoman и AngularJS (и все, что с ним связано, как Grunt и Bower).

Все работает отлично, когда выполняется локально с помощью grunt serve. Однако после запуска grunt и развертывания приложения есть несколько недостающих активов, и я не уверен, что лучший способ его решить.

Во-первых, запуск Grunt, похоже, копирует изображения на dist, но переименовывает их без корректировки ссылок в CSS. app/images/uparrow.png становится dist/images/3f84644a.uparrow.png.

Вот строка из main.scss:

.table.sortable th.sorted-asc        { background-image: url(../images/uparrow.png); }

Когда он компилируется в CSS во время процесса сборки, он не переписывает путь, поэтому браузер пытается загрузить dist/images/uparrow.png, который отсутствует.

Во-вторых, возникает проблема с загрузкой шрифтов для модуля Bootstrap. Загрузочный CSS в app/bower_components/bootstrap/dist/css/bootstrap.css ссылки ../fonts/glyphicons-halflings-regular.woff. Относительный путь разрешается до app/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.wof и работает отлично.

Как только построено, поставщик CSS объединяется и минимизируется в один файл CSS в dist/styles/8727a602.vendor.css. Относительный путь к шрифту не переписывается. Поэтому он пытается искать шрифты в папке dist/fonts, а не dist/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.wof, где файл фактически есть.

Любые советы очень ценятся.

Ответы

Ответ 1

Вы столкнулись с ошибками Йомана с задачей build, которая еще не исправлена. Я считаю, что нет чистых решений, поэтому мы предлагаем несколько обходных решений.

Во-первых, изображение rev:

Просто удалите изображения из задачи rev, и вам будет хорошо идти.

rev: {
  dist: {
    files: {
      src: [
        '<%= yeoman.dist %>/scripts/{,*/}*.js',
        '<%= yeoman.dist %>/styles/{,*/}*.css',
        // '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}', <- remove that line
        '<%= yeoman.dist %>/styles/fonts/*'
      ]
    }
  }
},

Во-вторых, шрифты bootstrap-sass не копируются в папку dist. Я потратил часы на эту ошибку и не смог найти правильное решение. Наконец, я решил добавить новое правило в задачу copy:

copy: {
  dist: {
    files: [{
      // your existing rules...
    },
    // add this rule to copy the fonts:
    {
      expand: true,
      flatten: true,
      cwd: '<%= yeoman.app %>',
      dest: '<%= yeoman.dist %>/fonts',
      src: ['bower_components/sass-bootstrap/fonts/*.*']
    }]
  },
  ...
}

Запустите grunt build снова после этих изменений и он должен работать.

Ответ 2

Я нашел аккуратное решение проблемы CSS - SCSS имеет встроенные функции для изображений, и это автоматически переписывает пути к активам:

.table.sortable th.sorted-asc        { background-image: image-url('uparrow.png'); }

Ответ 3

cssmin с корневой опцией заменяет все относительные пути.

вы можете деактивировать корневую опцию cssmin в файле Gruntfile.js

cssmin: {
  options: {
    //root: '<%= yeoman.app %>'
  }
},

Ответ 4

У меня была точно такая же проблема, и я решил ее:

1. Добавьте к задаче копирования (внутри gruntfile) начальные шрифты:

{
expand: true,
cwd: ‘src/main/webapp/bower_components/bootstrap/dist,
 src: ‘fonts/*,
 dest: ‘<%= yeoman.dist %>/assets/
}

Это скопирует загрузочные шрифты в вашу папку dist/assests/fonts.

2. Удалите задачу cssmin или закомментируйте корневой параметр. Это должно решить вашу проблему в отношении путей.

Для получения дополнительной информации, проверьте этот пост, который включает в себя глубокое объяснение: