Улучшение времени загрузки JavaScript - конкатенация по сравнению со многими + кэш

Я задаюсь вопросом, какое из следующего собирается привести к лучшей производительности для страницы, которая загружает большую сумму JavaScript (jQuery + jQuery UI + различные другие файлы JavaScript). Я прошел большинство YSlow и материал Google Page Speed, но оставлен, задавшись вопросом о конкретной детали.

Ключевая вещь для меня здесь состоит в том, что сайт, я продолжаю работать, не находится в общедоступной сети; это - платформа предоставления товаров и услуг предприятиям, где почти все пользователи являются повторными посетителями (и поэтому с кэшами данных, которые являются чем-то, что принимает YSlow, не будет иметь место для большого количества посетителей).

Сначала стандартный подход, рекомендуемый инструментами, такими как YSlow, должен связать его, сжать его и подать его в единственном файле, загруженном в конце Вашей страницы. Этот подход звучит довольно эффективным, но я думаю, что ключевая роль обоснования здесь должна улучшить производительность для пользователей без кэшированных данных.

Система, которую я в настоящее время имею, является чем-то вроде этого

  • Все файлы JavaScript сжаты и загружены внизу страницы
  • Все файлы JavaScript имеют далекие будущие даты истечения срока кэша, так останется (для большинства пользователей) в кэше в течение долгого времени
  • Страницы только загружают файлы JavaScript, которых они требуют, вместо того, чтобы загрузить один монолитный файл, большинство которых не будет требоваться

Теперь, мое понимание - то, что, если дата истечения срока кэша файла JavaScript не была достигнута, то кэшированная версия сразу используется; нет никакого Запроса HTTP, отправленного в к серверу вообще. Если бы это корректно, я предположил бы, что наличие нескольких тегов не вызывает потери производительности, поскольку у меня все еще нет дополнительных запросов на большинстве страниц (вспоминающий из вышеупомянутого, что почти все пользователи заполнили кэши).

В дополнение к этому, не загружая JS означает, что браузер не должен интерпретировать или выполнять весь этот дополнительный код, в котором он не испытывает необходимость; как приложение B2B, большинство наших пользователей, к сожалению, застревает с IE6 и его крайне медленным механизмом JS.

Другое преимущество - то, что, когда код изменяется, только затронутые файлы должны быть выбраны снова, а не полный набор (предоставленный, он должен был бы только быть выбран однажды, таким образом, это не большая часть преимущества).

Я также смотрю на использование LabJS для обеспечения параллельной загрузки JS, когда это не кэшируется.

Конкретные вопросы

  • Если существует много тегов, но все файлы загружаются из локального кэша, и меньше JavaScript загружается в целом, будет этим быстрее, чем один тег, который также загружается из кэша, но содержит весь JavaScript, необходимый где-нибудь на сайте, а не соответствующем подмножестве?
  • Там какие-либо другие причины состоят в том, чтобы предпочесть один по другому?
  • Подобные взгляды относятся к CSS? (Я в настоящее время использую намного больше монолитного подхода к CSS),

23
задан El Yobo 6 June 2010 в 02:48
поделиться

7 ответов

Я бы сказал, что самое важное, на чем нужно сосредоточиться, - это восприятие скорости .

Прежде всего, следует принять во внимание, что не существует формулы win-win , кроме порога, при котором файл javascript вырастает до такого размера, что его можно (и нужно) разделить.

GWT использует этот , и они называют его кодом DFN (Dead-for-now) . Здесь не так уж много магии. Вам просто нужно вручную определить, когда вам понадобится новый фрагмент кода, и, если он понадобится пользователю, просто вызовите этот файл.

Как, когда и где вам это понадобится?
Бенчмарк. В Chrome есть отличный инструмент для тестирования производительности. Используйте его широко. Посмотрите, значительно ли улучшит загрузку этой конкретной страницы наличие небольшого файла javascript. Если это произойдет, начните DFNing вашего кода.

Кроме того, все дело в восприятии.

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

Отложить javascript!
Все основные библиотеки могут дождаться загрузки страницы перед выполнением javascript. Используй это. jQuery выглядит так $ (document) .ready (function () {...}) . Он не ждет синтаксического анализа кода, но заставляет проанализированный код срабатывать именно тогда, когда он должен. После загрузки страницы, перед загрузкой изображения.

Важные моменты, которые следует принять во внимание:

  1. Убедитесь, что файлы js кэшированы клиентом (все остальные не так хороши по сравнению с этим)
  2. Скомпилируйте свой код с помощью Closure Compiler
  3. Дефлируйте ваш код ; это быстрее, чем Gziping (на обоих концах)

Пример кэширования Apache:

// Set up caching on media files for 1 month
<FilesMatch "\.(gif|jpg|jpeg|png|swf|js|css)$">
    ExpiresDefault A2629744
    Header append Cache-Control "public, proxy-revalidate"
    Header append Vary "Accept-Encoding: *"
</FilesMatch>

Пример дефляции Apache:

// compresses all files for faster transfer
LoadModule deflate_module modules/mod_deflate.so
AddOutputFilterByType DEFLATE text/html text/plain text/xml font/opentype font/truetype font/woff
<FilesMatch "\.(js|css|html|htm|php|xml)$">
   SetOutputFilter DEFLATE
</FilesMatch>

И, наконец, и, вероятно, по крайней мере, обслуживайте ваш Javascript из домена без файлов cookie.

И чтобы держать ваш вопрос в центре внимания, помните, что когда у вас есть код DFN, у вас будет несколько файлов javascript меньшего размера, которые, как раз для разделения, не будут иметь такого уровня сжатия, который Closure может дать вам с помощью одного . В этом сценарии сумма частей не равна целому.

Надеюсь, это поможет!

11
ответ дан 29 November 2019 в 03:03
поделиться

Я бы определенно выбрал немонолитный подход. Не только в вашем случае, но и в целом дает вам больше гибкости, когда вам нужно что-то изменить или перенастроить.

Если вы внесете изменения в один из этих файлов, вам придется выполнить объединение-сжатие и доставку. Если вы делаете это автоматически, то все в порядке.

Что касается вопроса браузера «если срок действия кеша для файла javascript не был достигнут, то кешированная версия используется немедленно; HTTP-запрос не отправляется на сервер вообще», я думаю, что есть HTTP-запрос сделан, но с ответом "НЕ ИЗМЕНЕНО". Чтобы быть уверенным, вы должны проверить все запросы к веб-серверу (используя один из доступных инструментов). После получения ответа браузер использует неизмененный ресурс - файл js, изображение или другой.

Удачи в вашем B2B.

2
ответ дан 29 November 2019 в 03:03
поделиться

Вы пробовали Google Closure? Судя по тому, что я читал об этом, это кажется весьма многообещающим.

1
ответ дан 29 November 2019 в 03:03
поделиться

Даже если вы имеете дело с повторными посетителями, есть много причин, по которым их кеш мог быть очищен, в том числе инструменты обеспечения конфиденциальности и повышения производительности, которые удаляют временные файлы кеша, чтобы «ускорить работу вашего компьютера».

Слияние и минимизация вашего скрипта не должно быть обременительным процессом. Я пишу свой JavaScript в отдельных файлах, которые хорошо разнесены, чтобы я мог их читать, чтобы их было легче поддерживать. Тем не менее, я обслуживаю его через страницу сценария, которая объединяет все сценарии в один сценарий и сокращает все это в миниатюре, поэтому один сценарий отправляется в браузер со всеми моими сценариями. Это лучшее из обоих миров, когда я работаю в коллекции файлов JavaScript, которые все доступны для чтения, и посетитель получает один сжатый файл JavaScript, что является рекомендацией по сокращению HTTP-запросов (и, следовательно, времени ожидания в очереди).

1
ответ дан 29 November 2019 в 03:03
поделиться

Обычно лучше иметь меньше больших запросов, чем иметь много маленьких запросов, поскольку браузер будет выполнять только два (?) Запроса параллельно с определенным доменом.

Итак, хотя вы говорите, что большинство пользователей являются повторными посетителями, когда истечет срок действия кеша, произойдет много циклов приема-передачи для многих файлов, а не для монолитного файла.

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

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

Если вас беспокоит первоначальная загрузка «большого» файла javascript, вы можете попробовать загрузить его асинхронно, используя метод, описанный здесь: http://www.webmaster-source.com/2010/06 / 07 / loading-javascript-asynchronously /

Каким бы путем вы ни пошли в конце, помните, что, поскольку вы устанавливаете дату изменения в далеком будущем, вам нужно будет изменить имя javascript (и CSS), когда в них вносятся изменения , в противном случае клиенты все равно не получат изменения, пока не истечет срок их кеширования.

PS: Профилируйте его в разных браузерах разными методами и запишите, так как он окажется полезным для тех, кто также застрял на медленных JS-движках, таких как IE6 :)

0
ответ дан 29 November 2019 в 03:03
поделиться

Я использовал следующее для CSS и Javascript - большинство моих страниц в Google Speed report имеют 94-96/100 и загружаются очень быстро (всегда в течение секунды, даже если есть 100kb's Javascript).

1. У меня есть PHP функция для вызова файлов - это класс и хранит все уникальные файлы, которые запрашиваются. Мой вызов выглядит примерно так:

javascript( 'jquery', 'jquery.ui', 'home-page' );

2. Я выплевываю url-кодированную версию этих строк, объединенных вместе, чтобы вызвать динамическую PHP-страницу:

<script type="text/javascript" src="/js/?files=eNptkFsSgjAMRffCP4zlTVmDi4iQkVwibbEUHzju3UYEHMffc5r05gJnEX8IvisHnnHPQN9cMHZeKThzJOVeex7R3AmEDhQLCEZBLHLMLVhgpaXUikRMXCJbhdTjgNcG59UJyWSVPSh_0lqSSp0KN6XNEZSYwAqt_KoBY-lRRvNblBZrYeHQYdAOpHPS-VeoTpteVFwnNGSLX6ss3uwe1fi-mopg8aqt7P0LzIWwz-T_UCycC2sQavrp-QIsrnKh"></script>

3. Эта динамическая PHP-страница декодирует строку и создает массив файлов, которые необходимо вызвать. Создается путь cache_file:

$compressed_js_file_path = $_SERVER['DOCUMENT_ROOT'] . '/cache/js/' . md5( implode( '|', $js_files ) ) . '.js';

4. Проверяется, существует ли этот путь к файлу в кэше, если да, то файл просто считывается:

if( file_exists( $compressed_js_file_path ) ) {
    echo file_get_contents( $compressed_js_file_path );
} else {

5. Если он не существует, он сжимает весь javascript в один "монолитный" файл, но поймите, что он содержит ТОЛЬКО необходимый javascript для этой страницы, а не для всего сайта.

if( $fh = @fopen( $compressed_js_file_path, 'w' ) ) {
    fwrite( $fh, $js );
    fclose( $fh );
}

// Echo the compressed Javascript
echo $js;

Я привел вам выдержки из кода. Программа, которую вы используете для сжатия javascript, полностью зависит от вас. Я использую это и с CSS, и с Javascript, так что все эти файлы требуют 1 HTTP-запрос, когда-либо, результат кэшируется на сервере (просто удалите этот файл, если вы что-то измените), и он содержит только необходимые Javascript и CSS для этой страницы.

0
ответ дан 29 November 2019 в 03:03
поделиться

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

Во-первых, проанализируйте свои журналы, чтобы понять, действительно ли ваш уровень кэширования настолько хорош, насколько вы ожидаете для вашей пользовательской базы. Например, если каждая html-страница включает jquery.js, просмотрите журналы за день - сколько запросов было для html-страниц? Сколько для jquery.js? Если скорость кэширования хорошая, вы должны увидеть гораздо меньше запросов для jquery.js, чем для html-страниц. Возможно, вы захотите сделать это в течение дня сразу после обновления, а также в течение нескольких недель после обновления, чтобы посмотреть, как это повлияет на скорость кэширования.

Далее добавьте несколько простых измерений на страницу в JavaScript. Вы сказали, что теги сценария находятся внизу, поэтому я предполагаю, что это выглядит примерно так:

<html>
<!-- all your HTML content... -->
<script src="jquery.js"></script>
<script src="jquery-ui.js"></script>
<script src="mycode.js"></script>

В этом случае вы засекаете время, необходимое для загрузки JS, и пингуете сервер следующим образом:

<html>
<!-- all your HTML content... -->

<script>var startTime = new Date().getTime();</script>

<script src="jquery.js"></script>
<script src="jquery-ui.js"></script>
<script src="mycode.js"></script>

<script>
var endTime = new Date().getTime();
var totalTime = endTime - startTime; // In milliseconds
new Image().src = "/time_tracker?script_load=" + totalTime;
</script>

Затем вы можете просмотреть журналы /time_tracker (или как вы хотите его назвать) и посмотреть, сколько времени требуется людям для загрузки сценариев.

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

3
ответ дан 29 November 2019 в 03:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: