Клиентская сторона включает против серверной включает в себя? - PullRequest
9 голосов
/ 12 октября 2010

У нас есть HTML-страница с несколькими div блоками.Мы хотим разделить эти элементы div на несколько файлов, а затем объединить их все вместе в один файл - лучше ли использовать серверные включения (в нашем случае JSP) или клиентские?

Обратите внимание, что мы используем JQuery - не уверен, что у JQuery есть умный способ сделать включения.

Ответы [ 5 ]

4 голосов
/ 12 октября 2010

С точки зрения производительности, этот вид обработки на сервере намного лучше.Затраты на ввод-вывод и обработку дополнительных HTTP-запросов - как было бы необходимо, если бы вы выполняли сопоставление на клиенте - были бы значительными.Включение дополнительного содержимого на сервер приведет к задержке пользователя в миллисекундах;выполнение этого на клиенте потребует на несколько порядков больше.

Редактировать За Комментарий Люка Шефера , это предполагает, что составляемый контент может быть мгновенно создан (напримервключая плоские файлы с сервера).Если на это требуется время (например, длительные вызовы базы данных), может быть целесообразно загрузить основную часть страницы и добавить дополнительный контент в jQuery.Как всегда, лучшее решение зависит от ваших конкретных обстоятельств.

3 голосов
/ 30 октября 2012

На самом деле, у клиентских включений есть одно очень полезное свойство: клиентские браузеры имеют кеши! Если ожидается, что часть вашего контента не будет часто меняться, и каждый клиент будет часто загружать какой-то фрагмент страницы, то включение на стороне клиента - хорошая идея, поскольку кэш браузера клиента может быть использован.

Идея состоит в том, что ваша полная страница содержит кучу элементов-заполнителей, в которые будут добавлены клиентские части. Фрагменты HTML загружаются через вызовы AJAX. Если заголовки HTTP-ответов фрагментов указывают Expires и / или Cache-Control в далеком будущем, когда ваш клиент посещает следующую страницу, AJAX-запрос будет обслуживаться из кэша, а не отправляться на сервер.

1 голос
/ 19 ноября 2012

Я не совсем уверен, где я нахожусь на стороне клиента по сравнению с дебатами на стороне сервера.В наши дни популярнее всего обрабатывать вещи на стороне клиента.Вероятно, какая-то комбинация двух является лучшей.Просто чтобы попробовать это полностью на стороне клиента, я решил раскрутить объект, который на стороне клиента включает асинхронно, но кэшировал текст для дальнейшего использования.Существует функция загрузки, которая принимает функцию обратного вызова в качестве параметра, вызываемого при успешной загрузке.Также есть функция для установки внутреннего html объекта в загруженный текст.Для объекта требуется предыдущее включение jquery.

/**
 * An object to manage client side includes. 
 * 
 * Loads of text are asynchronous but the result will be cached for later use.
 * 
 * @param urlText - the url of the inlcude text
 * @returns an Include object
 */
function Include(urlText)
{
    var self;
    var loaded;
    var txt;
    var url;

    /**
     * Sets the url for the include.
     * 
     * Will unload a previously set include.
     * 
     * @param url
     */
    this.setUrl = setUrl;
    function setUrl(url)
    {
        if (self.url != url)
        {
            unload();
        }
        self.url = url;
    }

    /**
     * 
     * @returns the url
     */
    this.getUrl = getUrl;
    function getUrl()
    {
        return self.url;
    }

    /**
     * Unloads the current url.
     */
    this.unload = unload;
    function unload()
    {
        self.txt = null;
        self.loaded = false;
    }

    /**
     * Loads the current url asynchronously
     * 
     * @param fnPostLoad function to call on successful completion
     */
    this.load = load; 
    function load(fnPostLoad)
    {

        if (self.loaded)
        {
            if (fnPostLoad != null)
            {
                fnPostLoad.call();
            }
            return;
        }

        $.ajax({
            type : "GET",
            dataType : "text",
            url : self.url,
            success : function(data) {
                self.txt = data;
                self.loaded = true;
                if (fnPostLoad != null)
                {
                    fnPostLoad.call();
                }
            },
            error : function(){
                alert("An error occurred accessing client side include located at: " + self.url);
            }
        });         
    };

    /**
     * Sets the inner html of a given object to be the text of this include.
     * 
     * Will load the url if not loaded.
     * 
     * @param obj
     */
    this.setInnerHtmlOf = setInnerHtmlOf;
    function setInnerHtmlOf(obj)
    {
        load(function(){obj.html(self.txt);})
    }

    // initialize members
    self = this; // must be done first
    loaded = false;
    txt = null;
    setUrl(urlText);    
}

Чтобы использовать этот объект, вы можете сделать что-то вроде этого:

var foo = new Include("foo.inc");
var bar = new Include("bar.inc");
foo.setInnerHtmlOf($('#treeMargin'));
bar.setInnerHtmlOf($('#mainMargin'));

Я не слишком много тестировал, но, похоже,работать очень хорошо.

1 голос
/ 12 октября 2010

Я должен согласиться со всеми остальными, что серверная часть - это место с оговоркой.

Если в ваших разделах есть что-то, что занимает некоторое время, скажем, каждый из них имеет контент из отдельного вызова веб-службы, может быть полезно позволить JQuery загружать их для вас с помощью get, так как остальная часть страницы загружаться, пока секции загружаются асинхронно.

Кроме этого, да ... сторона сервера

0 голосов
/ 12 октября 2010

Я бы сказал, серверная сторона.Как быть, если jQuery не загружается или у пользователя включен javascript?

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