#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