Я знаю, что подобные вопросы заданы раньше, но методология быстро меняется, поэтому я пытаюсь понять текущие лучшие практики. (На самом деле, в последнее время, как 2 дня назад, Чад Killingsworth добавил комментарий к accepted answer от трех лет назад, что @expose
аннотаций теперь осуждается.)Схема модуля с компилятором Closure и ADVANCED_OPTIMIZATIONS
Я использую module pattern. Работа JSFIDDLE из кода ниже:
/** @const */
var MATHCALCS = (function() {
'use strict';
var MY = {};
/**
* @constructor
* @param {!Object} obj
* @expose
*/
MY.ModuleStruct = function (obj) {
/** @expose */
this.color = (obj.color !== undefined) ? obj.color : null;
/** @expose */
this.size = (obj.size !== undefined) ? obj.size : null;
};
/**
* @expose
*/
MY.ModuleStruct.prototype.clone = function() {
return new MY.ModuleStruct({
"color": this.color,
"size": this.size
});
};
MY.moduleProperty = 1;
/**
* @type {function(!Array<number>)}
* @expose
*/
MY.moduleMethod = function (a) {
var i, x = 0;
for (i = 0; i < a.length; i += 1) {
x = x + a[i];
}
return x;
};
return MY;
}());
window["MATHCALCS"] = MATHCALCS;*
В настоящее время, используя @expose
аннотацию, выше, может быть минимизирован с закрытием в заранее режиме и следующие вызовы работают (minified example):
// call a public method
alert(MATHCALCS.moduleMethod([1, 2, 3]));
// allocate a new structure
var ms = new MATHCALCS.ModuleStruct({
"color": "red",
"size": "small"
});
alert(ms.color + '\t' + ms.size);
// clone a second instance
var ms2 = ms.clone();
alert(ms2.color + '\t' + ms2.size);
alert(ms !== ms2); // cloned objs are not equal
// and directly update the properties of the object
ms2.color = "white";
ms2.size = "large";
alert(ms2.color + '\t' + ms2.size);
Если это возможно, без изменения от шаблона модуля, я хотел бы обновить код (приблизительно 10 000 строк), чтобы использовать аннотацию @export
. Однако, когда я заменяю @expose
с @export
Закрытие поднимает эту ошибку:
ERROR - @export only applies to symbols/properties defined in the global scope.
Q: Можно ли, и если да, то как выше код аннотироваться работать с ADVANCED_OPTIMIZATIONS?
Я знаю, что я могу, возможно, использовать этот тип записи:
MY["ModuleStruct"] = MY.ModuleStruct;
MY["ModuleStruct"]["prototype"]["clone"] = MY.ModuleStruct.prototype.clone;
но экспортирующие свойств объекта таким образом, становится утомительным. Далее JSLint жалуется на странные назначения, поэтому я предпочел бы использовать аннотацию JSDocs.
'@ export' - правильный метод. Похоже, нам нужно будет немного поработать над этим типом использования. –
Проблема добавлена https://github.com/google/closure-compiler/issues/912 –
@ChadKillingsworth, спасибо, что подняли билет на выпуск. Было бы здорово, если поддержка нотации '@ expose' не будет удалена до тех пор, пока' @ export' не поддержит этот шаблон для '@ expose', в настоящее время работает нормально для этого случая. – Karl