расширенные оптимизации компиляции закрытия, жалующиеся на использование этого

#javascript #google-closure-compiler #google-closure

#javascript #google-closure-compiler #google-закрытие

Вопрос:

У меня есть Gruntfile.js как показано ниже с конфигурацией компилятора закрытия,

 module.exports = function(grunt) {

grunt.initConfig({

    pkg: grunt.file.readJSON('package.json'),
     'closure-compiler': {
         jstracker: {
              closurePath: '/usr/local/',
              js: [
                'src/js/banner.js',
                'src/js/lib/json.js',
                'src/js/lib/jstz.js',
                'src/js/init.js',
                'src/js/helpers.js',
                'src/js/lib/sha1.js',
                'src/js/lib/murmur.js',
                'src/js/lib/base64.js',
                'src/js/tracker.js',
                'src/js/prayagupd.js',
                'src/js/constructor.js'
               ],
              jsOutputFile: 'dist/<%= pkg.name %>.min.js',
              options: {
                      compilation_level: 'ADVANCED_OPTIIZATIONS',
                      warning_level:"DEFAULT",
                      language_in: 'ECMASCRIPT5_STRICT'
               }
          }
    },

    qunit: {
        files: ['tests/**/*.html']
    },
    jshint: {
        files: ['Gruntfile.js', 'src/**/*.js', 'tests/*.js'],
        options: {
            // options here to override JSHint defaults
            globals: {
                jQuery: true,
                console: true,
                module: true,
                document: true
            }
        }
    },
    watch: {
        files: ['<%= jshint.files %>'],
        tasks: ['jshint', 'qunit']
    }
});

grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-closure-compiler');

grunt.registerTask('test', ['jshint', 'closure-compiler', 'qunit']);
grunt.registerTask('default', ['jshint', 'closure-compiler', 'qunit']);
  

};

Когда я выполняю grunt для создания уменьшенного js, я вижу уменьшенную версию в target папке,

 $ ls -lh dist/
total 44K
-rw-rw-r-- 1 prayagupd prayagupd  27K Jul  6 16:34 prayagupd.min.js
-rw-rw-r-- 1 prayagupd prayagupd  514 Jul  6 16:34 prayagupd.min.js.report.txt
  

Но со следующими 4 предупреждениями, все указывающими на использование this , которое позже появляется как ошибка ( Uncaught ReferenceError: JSON2 is not defined ) при использовании в браузере.

 src/js/lib/json.js:26: WARNING - dangerous use of the global this object
if (!this.JSON2) {
     ^
src/js/lib/json.js:27: WARNING - dangerous use of the global this object
    this.JSON2 = {};
    ^
src/js/leakers.js:1995: WARNING - dangerous use of the global this object
            this.setContextProperty("leaksId", leaksId);
            ^
src/js/leakers.js:2002: WARNING - dangerous use of the global this object
            this.setContextProperty("userId", userId);
            ^
0 error(s), 4 warning(s)
  

SIMPLE_OPTIMIZATIONS уровень работает нормально, хотя.

Оскорбительные исходные коды

 //src/js/lib/json.js:26
// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.
if (!this.JSON2) {
    this.JSON2 = {};
}
  

и,

    //src/js/leakers.js

   /**
    * Set context properties, properties which are used with every event
    */
    setContextProperty: function(name, value) {
        context[name] = value;
    },

    /**
    * Set leaks ID
    */
    setLeakesId: function(leakesId) {
        this.setContextProperty("leakesId", leakesId);
    },

    /**
    * Set user ID
    */
    setUserId: function(userId){
        this.setContextProperty("userId", userId);
    }
  

Две вещи, которые мне нужна помощь, чтобы исправить;

1) попросите закрытие игнорировать this , что кажется невозможным при ADVANCED_OPTIMIZATIONS

или

2) Найдите способы заменить this на и приступить к работе.

Комментарии:

1. Не могли бы вы, пожалуйста, опубликовать исходный код, нарушающий?

Ответ №1:

Компилятор в основном предупреждает, что вы используете «this» способом, в котором он не уверен (возможно, вы случайно используете глобальное this) и, возможно, несовместим с расширенной компиляцией. Вы хотите убедиться, что значение «this» будет правильным, и указать это компилятору с помощью аннотации @this.

Это предупреждение задокументировано здесь:https://developers.google.com/closure/compiler/docs/error-ref