azproduction / lmd

LMD - JavaScript Module-Assembler for building better web applications :warning: Project is no longer supported :warning:
http://azproduction.ru/lmd/
MIT License
449 stars 27 forks source link

Поддержка GCC в Advanced режиме #131

Closed termi closed 11 years ago

termi commented 11 years ago

Google Closure Compile в ADVANCED режиме любит переименовывать переменные, поэтому

sandbox = {
            global: global,
            modules: modules,
            modules_options: modules_options,
            options: options,

            eval: global_eval,
            register: register_module,
            require: lmd_require,
            initialized: initialized_modules,

            /*if ($P.OFF_PACKAGE) {*/noop: global_noop,/*}*/
            document: global_document,
            /*if ($P.CACHE) {*/lmd: lmd,/*}*/
            /*if ($P.CACHE) {*/main: main,/*}*/

            on: lmd_on,
            trigger: lmd_trigger,
            undefined: local_undefined
        };

превращается в:

n = {
    global: c,
    m: f,
    n: k,
    options: n,
    eval: d,
    o: g,
    p: a,
    l: p,
    document: c.document,
    e: function(a, b) {
        h[a] || (h[a] = []);
        h[a].push(b)
    },
    r: b,
    s: void 0
};

Соответственно, многие модули больше не доступны по имени. Чтобы GCC не переименовывал критические названия свойств, нужно всего лишь использовать кавычки в именах или скобочную нотацию, или jsDoc.


var some1 = 1;// Будет переименована
var someObject = {// Будет переименован объект someObject
    someProperty: null// Будет переименовано свойство someProperty
}

// Не будет переименована, но и не будут переименованы все остальные переменные с таким же именем во всём файле
/** @expose */
var some2 = 2;

var someObject2 = {// Будет переименован объект someObject2
    'someProperty': null// Свойство someProperty, объекта someObject2 не будет переименовано
};
someObject2['someOtherProperty'] = null;// Свойство someOtherProperty, объекта someObject2 не будет переименовано

Больше информации в документации к GCC

azproduction commented 11 years ago

У LMD есть свойство "optimize": true, которое делает оптимизацию кода LMD (не модулей пользователя) и убирает этот объект - попробуй пока его. Это место я починю.

azproduction commented 11 years ago

@termi проверь, пожалуйста, lmd@1.10.11

termi commented 11 years ago

Супер, спасибо!

Кстати, если "правильно" писать код, то GCC сам убирает всё лишнее. Только критерий "правильность" очень размытый, так что пока не могу посоветовать как переписать. Исследую дальше оптимизацию LMD сборки через GCC