Uglify с помощью SourceMaps при использовании grunt usemin и rev

Я хочу регистрировать ошибки javascript на сервере, но трассировка стека бесполезна с минимизированным кодом JS. Поэтому я думал об использовании либо Getsentry, либо Rollbar, который показывает правильная трассировка стека с помощью sourcemaps. Но я изо всех сил пытаюсь создать исходную карту в первую очередь.

я получаю эту ошибку

«Назначение (_build/js/app.js) не записано, поскольку файлы src были пусты».

Как только он правильно создаст исходную карту, возникнет другая проблема, т.е. rev переименует файл. Мне также нужно оставить неминифицированный конкатенированный файл.

Ниже мой gruntfile.js (я удалил из него несколько битов).

module.exports = function(grunt) {

    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        clean: {
            jsFolders: {
                src: [
                    '_build/js/ui',
                    '_build/js/vendor',
                    '_build/js/app',
                    '_build/js/*templates.js'
                ]
            },
            build: {
                src: ['_build/**/*']
            }
        },

        copy: {
            build: {
                files: [{
                    expand: true,
                    src: [
                        'index.html',
                        'img/**/*', //includes web.cofig also.
                        'img/**/*.svg',
                        '!img/**/*.psd',
                        'js/**/*', //includes web.cofig also.
                        'css/**/*', //includes web.cofig also.
                        '*.png',
                        'favicon.ico'
                    ],
                    dest: '_build/'
                }]
            },
        },

        rev: {
            option: {
                algorithm: 'sha1',
                length: 4
            },
            all: {
                files: {
                    src: [
                        '_build/**/*.{js,css,eot,ttf,woff}'
                    ]
                }
            }
        },

        useminPrepare: {
            html: ['_build/index.html']
        },

        usemin: {
            html: [
                '_build/index.html'
            ],
            css: [
                '_build/css/**/*.css'
            ]
        },

        uglify: {
            options: {
                sourceMap: '_build/js/app.js.map',
            },
            js: {
                files: {
                    '_build/js/app.js': ['_build/js/app.js']
                }
            }
        },

        cssmin: {
            minify: {
                expand: true,
                cwd: '_build/css/',
                src: '*.css',
                dest: '_build/css/'
            }
        },
    });

grunt.registerTask('build', [
        'clean:build',
        'handlebars',
        'compass',
        'autoprefixer',
        'copy:build',
        'useminPrepare',
        'concat',
        'uglify',
        'cssmin',
        'clean:jsFolders',
        'rev',
        'usemin',
    ]);

};

ОБНОВЛЕНИЕ


Попробовал решение @Andy, оно по-прежнему показывает ту же ошибку "Destination (_build/js/app.js) not written because src files were empty.", а также говорит ниже при сборке

 uglify:
  { options:
   { sourceMap: true,
     sourceMapName: '_build/js/app.js.map' },
  js: { files: { '_build/js/app.js': [ '_build/js/app.js' ] } },
  generated:
   { files:
      [ { dest: 'dist\\js\\app.js',
          src: [ '.tmp\\concat\\js\\app.js' ] } ] } }

Не знаю, откуда у него dest название. Моя выходная папка _build.

ОБНОВЛЕНИЕ 2:
Обратитесь к ссылкам ниже для лучшего решения
https://stackoverflow.com/a/20574196/148271 https://github.com/gruntjs/grunt-contrib-uglify/issues/39#issuecomment-14856100


person IsmailS    schedule 24.02.2014    source источник
comment
Итак, каково фактическое решение?   -  person JobaDiniz    schedule 25.06.2015


Ответы (3)


useminPrepare объединяет существующую конфигурацию uglify со своей собственной, но вложенной в generated. Поэтому эта конфигурация для uglify работает для меня

grunt.initConfig({
  uglify: {
    generated: {
      options: {
        sourceMap: true
      }
    }
  }
});
person Andreas    schedule 10.03.2015
comment
Спасибо. Я был немного сбит с толку, откуда взялся uglify:generated - person neolaser; 04.11.2015

Не существует простого решения заставить исходные карты работать с потоком usemin. Это известная проблема, которая не решается уже год:

https://github.com/yeoman/grunt-usemin/issues/30

https://github.com/yeoman/grunt-usemin/issues/220

person Vlad Gurovich    schedule 24.02.2014

Варианты uglify:

sourceMap: true,
sourceMapName: 'path/to/name.map'

Например, в моем GruntFile.js я использую имя из package.json:

sourceMap: true,
sourceMapName: 'dist/<%= pkg.name %>-<%= pkg.version %>.map'
person Andy    schedule 24.02.2014
comment
Я обновил вопрос результатами реализации вашего решения. - person IsmailS; 24.02.2014
comment
это частично сработало, когда я изменил выходную папку на dist вместо _build. Итак, кажется, что внутри usemin есть какое-то жестко закодированное имя dist. Остались следующие проблемы: 1. объединенный неминифицированный файл находится в папке .tmp и не остается рядом с файлом min в папке js. 2. Когда я открываю и вижу сгенерированную исходную карту, она ссылается на файл app.js вместо имени rev'ed, т.е. <hash>.app.js. Сейчас пытаюсь их обойти. - person IsmailS; 25.02.2014
comment
Вам повезло, что в нижней части файла ‹hash›.app.js отсутствует имя reved? - person balteo; 11.04.2015