Grunt usemin, filerev и load-grunt-config

Обновлять

Я загрузил пример проблемы, с которой я столкнулся здесь:

https://github.com/ianjamieson/grunt-usemin-issue

При запуске grunt build вы увидите, что он создает папку dist и внутри правильный файл revved, однако я не могу заставить его обновить page.html с правильным путем к файлу!

Я оставил остальную часть вопроса здесь для справки, однако вы, вероятно, можете проигнорировать его и просто использовать репозиторий GitHub в качестве примера.


Я пытаюсь использовать модуль filerev с usemin, но я думаю, что может быть какая-то проблема, поскольку я также использую load-grunt-config.

В документации по usemin сказано, что я должен просто добавить revmap и установить значение:

<%= grunt.filerev.summary %>

Однако это возвращает undefined.

GruntFile.js

module.exports = function(grunt) {

     var config = {
         buildTasks: [
             'newer:copy', // copies the src directory to dist (htdocs)
             'requirejs', // do an r.js build to concat modular dependencies
             'fetchpages', // if there are any remote resources, fetch them here
             'concat:head', // concats js in the head
             'concat:foot', // concats js in the head
             'uglify:head', // compresses js in the head
             'uglify:foot', // compresses js in the foot
             'cssmin', // minifies and concats css
             'filerev', // changes the file name to include md5 hash and force cache refresh
             'usemin', // runs through html and inputs minified js and css
             'newer:htmlclean', // removes whitespace from html files where required
             'newer:imagemin', // minify newer images
             'clean:afterBuild' // deletes files that are not required for build
         ]
     };

    require('time-grunt')(grunt);
    require('load-grunt-config')(grunt, {
        jitGrunt: {
            staticMappings: {
                fetchpages: 'grunt-fetch-pages'
            }
        }
    });

    grunt.registerTask('build', config.buildTasks);

};

usemin.js

module.exports = function (grunt, options) {
    return {
        revmap: '<%= grunt.filerev.summary %>',
        html: [
            'path/to/page'
        ]
    };
};

filerev.js

module.exports = function(grunt, options) {
    return {
        options: {
            algorithm: 'md5',
            length: 10
        },
        js: {
            src: [
                'path/to/js.js'
            ]
        },
    };
};

Я получаю сообщение об ошибке:

Running "usemin:revmap" (usemin) task
Verifying property usemin.revmap exists in config...OK
Files: [no src] -> revmap
Options: type="revmap"
Replaced 0 references to assets

person Ian Jamieson    schedule 08.04.2015    source источник
comment
Я думаю, что вы пропустили задачу useminPrepare. Далее скопировано из их документа In a typical usemin setup you launch useminPrepare first, then call every optimization step you want through their generated subtask and call usemin in the end.   -  person Vishwanath    schedule 20.04.2015
comment
Привет @Vishwanath, я попытался добавить задачу useminPrepare, но безуспешно.   -  person Ian Jamieson    schedule 20.04.2015


Ответы (2)


Мне удалось это исправить, вы можете увидеть рабочий пример в основной ветке здесь:

https://github.com/ianjamieson/grunt-usemin-issue

Главное, что помогло, это вариант assetsDirs в задаче usemin. Сначала у меня также была опечатка в названии assetDir, поэтому убедитесь, что вы включили s! Вот пример Gruntfile в этом рабочем проекте:

module.exports = function(grunt) {

 grunt.initConfig({
    copy: {
      main: {
        cwd: 'src/',
        src: '**',
        dest: 'dist/',
        expand: true,
        flatten: false
      },
    },
    useminPrepare: {
        html: 'dist/templates/page/page.html',
        options: {
            dest: './dist',
            root: './dist'
        }
    },
    filerev: {
        options: {
          algorithm: 'md5',
          length: 16
        },
        js: {
          src: 'dist/resources/js/app.min.js'
        }
      },
      usemin: {
        html: 'dist/templates/page/page.html',
        options: {
            assetsDirs: ['dist']
        }
      }
  });

  grunt.loadNpmTasks('grunt-usemin');
  grunt.loadNpmTasks('grunt-contrib-copy');
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-concat');
  grunt.loadNpmTasks('grunt-debug-task');
  grunt.loadNpmTasks('grunt-filerev');

    grunt.registerTask('build', [
      'copy',
      'useminPrepare',
      'concat:generated',
      'uglify:generated',
      'filerev',
      'usemin'
    ]);
};

Обновленный файл находился в поиске относительно папки assetsDirs, поэтому в данном случае это был dist. Путь к файлу в HTML был resources/js/app.js. Таким образом, объединив их, он смотрел на dist/resources/js/app.js

person Ian Jamieson    schedule 27.04.2015

Я ответил на аналогичный вопрос здесь

Я не использую usemin, поскольку я использую requirejs для загрузки модулей, поэтому я не хочу, чтобы мой html-файл обновлялся новыми именами файлов. Функция конфигурации карты Requirejs — это то, что я использовал для сопоставления имен исходных модулей с новыми.

person Rahul Dole    schedule 30.10.2015