grunt: jshint после uglify генерирует предупреждения

Я охотился здесь и довольно долго искал в Google, и не вижу ничего очевидного, хотя я предупреждаю, что это первый раз, когда я работал с jshint/uglify и grunt.

У меня есть (для краткости) 2 тестовых файла JS:

(function() {
console.log("I'm in your build, testing your stuff (1)");
})();

а также

(function() {
console.log("I'm in your build, testing your stuff (2)");
})();

мой файл grunt выполняет ряд задач сборки, но, по сути, я запускаю jshint дважды — один раз на src (остановитесь раньше, если есть проблемы) и один раз после всех concat/uglify, чтобы убедиться, что окончательный вывод файлов все еще проходит.

jshint в исходном коде (см. выше) отлично работает, но jshint post 'build', кажется, терпит неудачу, потому что uglify удалил пару точек с запятой.

соответствующие части моего файла grunt (для ссылки):

jshint: {
        jshintrc: '.jshintrc',
        source: {
            files: {
                src: ['app/common/scripts/**/*.js',
                        'app/games/**/*.js'
                ]
            }
        },
        dist: {
            files: {
                src: [ 'dist/' + targetEnvironment + '/common/scripts/**/*.js',
                        'dist/' + targetEnvironment + '/games/**/*.js'
                ]
            }
        }
    },
concat: {
    scriptsCommon: {
                src: [  'app/common/scripts/*.js',
                ],
                dest: 'dist/' + targetEnvironment + '/common/scripts/common.concat.js',
                nonull: true
            }
        },
uglify: {
            all: {
                files: [
                    {   src: 'dist/' + targetEnvironment + '/common/scripts/common.concat.js',
                        dest: 'dist/' + targetEnvironment + '/common/scripts/common.min.js' },
                ]
            }
        }

и моя задача ворчания, которая выполняется, по сути (опять же, урезанная для примера):

    grunt.registerTask('default', [
        'jshint:source',
        'concat:scriptsCommon',
        'uglify:all',
        'jshint:dist'

jshint:source работает отлично, jshint:dist нет и жалуется на отсутствие точек с запятой.

Скрипт uglify'd (для справки):

!function(){"use strict";angular.module("TestingStuffs",[]).controller("TestController",["$http","$log",function(){}]).controller("Test2Controller",["$http","$log",function(){}])}(),function(){console.log("I'm in your build, testing your stuff (1)")}(),function(){console.log("I'm in your build, testing your stuff (2)")}();

как вы можете видеть, в обоих операторах console.log были удалены точки с запятой - кажется, безопасно. Я могу понять, почему uglify сделал это, и я также могу понять, почему jshint жалуется на это.

В идеале я хотел бы изменить uglify так, чтобы он оставлял точку с запятой (хотя я могу получить гнев от полиции с запятой за это), хотя в идеале я хотел бы увидеть варианты для обоих - заставить jshint игнорировать проблему с точкой с запятой, но также получить uglify, чтобы оставить его.

Любая помощь с благодарностью!

Привет, Терри


person Terry_Brown    schedule 21.01.2014    source источник


Ответы (1)


Я не думаю, что JSHint следует запускать на выходе uglified/concat, а только на входе. JSHint — это средство проверки синтаксиса для устранения человеческих ошибок, и uglify, очевидно, попытается уменьшить размер файла до минимума.

С JSHint.com:

JSHint — это управляемый сообществом инструмент для обнаружения ошибок и потенциальных проблем в коде JavaScript, а также для обеспечения соблюдения соглашений о кодировании вашей команды... Цель этого проекта — помочь разработчикам JavaScript писать сложные программы, не беспокоясь об опечатках и языковых ошибках.

Очевидно, это означает, что вы должны очень доверять задаче uglify и тем изменениям, которые она вносит в ваш код. Однако запуск ваших модульных тестов (при условии, что они у вас есть) на углифифицированном коде повысит уверенность и выявит любые проблемы.

person Shepless    schedule 21.01.2014