Улучшение кода JavaScript - PullRequest
       5

Улучшение кода JavaScript

0 голосов
/ 02 декабря 2009

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

(function() {
    var jq = document.createElement('script');
    var an = document.createElement('script');
    var cm = document.createElement('script');
    var ga = document.createElement('script');
    var domain = 'http://example.com/';

    jq.src = domain + 'jquery.1.3.2.js';
    an.src = domain + 'jquery.alphanumeric.js';
    cm.src = domain + 'common.js';
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    ga.setAttribute('async', 'true');

    document.documentElement.firstChild.appendChild(jq);
    document.documentElement.firstChild.appendChild(cm);
    document.documentElement.firstChild.appendChild(an);
    document.documentElement.firstChild.appendChild(ga);
})();

Ура, ребята!

Ответы [ 7 ]

7 голосов
/ 02 декабря 2009

Компактность в том, как она написана, и производительность, не связаны. Но чтобы написать его более компактным, многократно используемым способом:

function appendScript(url, async) {
    var el = document.createElement('script'),
        root = document.documentElement;
    el.async = async;
    el.src = url;
    // avoid an IE6 bug by using insertBefore (http://bugs.jquery.com/ticket/2709)
    root.insertBefore(el, root.firstChild);
}


appendScript('http://example.com/js/jquery.1.3.2.js', false);
appendScript('http://example.com/js/jquery.alphanumeric.js', false);
appendScript('http://example.com/js/common.js', false);
appendScript(('https:' == document.location.protocol ? '//ssl' : '//www') + '.google-analytics.com/ga.js'), true);
1 голос
/ 02 декабря 2009
var child1 = document.documentElement.firstChild;
child1.appendChild(jq);
child1.appendChild(cm);
child1.appendChild(an);
child1.appendChild(ga);
1 голос
/ 02 декабря 2009
'https:' == document.location.protocol ? 'https://ssl' : 'http://www'

может стать:

'http' + 'https:'==document.location.protocol ? 's://ssl' : '://www'

Это единственное улучшение, которое я вижу, если вы не хотите использовать нестандартный javascript вместо создания элементов, а только фактические элементы html в строке, а затем добавьте их в документы .innerHTML

0 голосов
/ 02 декабря 2009

Вот один из подходов. Надеюсь, это упрощает добавление или удаление сценариев (для которых требуется или не требуется атрибут async:

({
    DOMAIN : 'http://example.com/',
    SCRIPTS : [ {file:'jquery.1.3.2.js'},
            {file:'jquery.alphanumeric.js'},
            {file:'common.js'},
            {file: ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'
                , async: 'true'} ],
    init: function() {
        for (var i in this.SCRIPTS) {
            var script = this.SCRIPTS[i];
            var sc = document.createElement('script');
            sc.src = (script.file.match(/^http/gi)) ? sc.src = script.file : sc.src = this.DOMAIN + script.file;
            if (typeof script.async !== 'undefined') {
                sc.setAttribute('async', script.async);
            }
            document.documentElement.firstChild.appendChild(sc);
        }

    }
}).init();
0 голосов
/ 02 декабря 2009

Хорошо, вот мой выстрел в этом. Не уверен, что сейчас это так сильно экономит, но если у вас будет больше активов на example.com, это ускорит процесс.

(function(){
    var scripts    = ['jquery.1.3.2', 'jquery.alphanumeric', 'common'],
        head       = document.documentElement.firstChild,
        domain     = 'http://example.com/',
        add_script = function(url, async){
            var script = document.createElement('script');
            script.src = url;
            if(async === true) script.setAttribute('async', 'true');
            head.appendChild(script);
        };

    for(script in scripts) add_script( domain + scripts[script] + '.js' );

    add_script( ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js', true);
})();
0 голосов
/ 02 декабря 2009

Я уверен, что за «раздувание» проголосуют, но просто поделюсь, как бы я это сделал:

Сначала я определю такую ​​функцию, которая будет очень расширяемой:

function addElements(objlist) {
    // One or many
    objlist = [].concat(objlist);

    while(objlist.length > 0) {
        var current = objlist.pop();

        var node = document.createElement(current.element || 'div');
        for(attr in current.attributes)
            node.setAttribute(attr, current.attributes[attr]);

        if(current.parent)
            current.parent.appandChild(node);
    }
}

Затем, чтобы использовать его:

addElements([
    {
        parent: document.documentElement.firstChild,
        element: 'script',
        attributes: {
            src: 'http://example.com/jquery.1.3.2.js'
        }
    },
    {
        parent: document.documentElement.firstChild,
        element: 'script',
        attributes: {
            src: 'http://example.com/jquery.alphanumeric.js'
        }
    },
    {
        parent: document.documentElement.firstChild, 
        element: 'script',
        attributes: {
            src: 'http://example.com/common.js'
        }
    },
    {
        parent: document.documentElement.firstChild, 
        element: 'script',
        attributes: {
            src: ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js',
            async: true
        }
    }
]);

Это то, что я называю «силовыми функциями». Он хорошо читается, и, несмотря на повторение, он выражен силой.

Вы даже можете автоматизировать создание объекта:

var elements = [
    'jquery.1.3.2.js',
    'jquery.alphanumeric.js',
    'common.js',
    ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'
];

for(var i=0; i<4; ++i) {
    elements[i] = {
        element: 'script',
        parent: document.documentElement.firstChild,
        attributes: {
            src: 'http://example.com/' + elements[i]
        }
    };
}

elements[3].attributes.async = true;

addElements(elements);
0 голосов
/ 02 декабря 2009

Вы можете создать функцию addScriptElement (), чтобы сделать этот способ менее повторяющимся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...