Когда я должен использовать встроенный или внешний Javascript? - PullRequest
123 голосов
/ 26 сентября 2008

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

Какова общая практика для этого?

Реальный сценарий - у меня есть несколько html-страниц, которые требуют проверки формы на стороне клиента. Для этого я использую плагин jQuery, который я включаю на всех этих страницах. Но вопрос в том, могу ли я:

  • написать биты кода, которые настраивают этот скрипт в строке?
  • включить все биты в один файл, который используется всеми этими HTML-страницами?
  • включить каждый бит в отдельный внешний файл, по одному на каждую HTML-страницу?

Спасибо.

Ответы [ 18 ]

111 голосов
/ 26 сентября 2008

На момент публикации этого ответа (2008 г.) правило было простым: весь сценарий должен быть внешним. И для обслуживания, и для производительности.

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

JavaScript не принадлежит HTML-коду, и если он содержит специальные символы (например, <, >), он даже создает проблемы.

В настоящее время масштабируемость сети изменилась. Сокращение количества запросов стало действительным соображением из-за задержки выполнения нескольких HTTP-запросов. Это делает ответ более сложным: в большинстве случаев использование внешнего JavaScript все еще рекомендуется. Но для некоторых случаев, особенно для очень маленьких фрагментов кода, имеет смысл встраивать их в HTML-код сайта.

31 голосов
/ 26 сентября 2008

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

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

21 голосов
/ 26 сентября 2008

Использование javascript - одно из правил производительности Yahoo: http://developer.yahoo.com/performance/rules.html#external

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

19 голосов
/ 08 октября 2014

Если вы заботитесь только о производительности, большинство советов в этой теме совершенно неверны и становятся все более и более неправильными в эпоху SPA, где мы можем предположить, что страница бесполезна без кода JS. Я провел бесчисленные часы, оптимизируя время загрузки страницы SPA и проверяя эти результаты в разных браузерах. С другой стороны, повышение производительности за счет реорганизации вашего html может быть весьма значительным.

Чтобы добиться максимальной производительности, вы должны думать о страницах как о двухступенчатой ​​ракете. Эти две стадии примерно соответствуют <head> и <body> фазам, но вместо этого думайте о них как <static> и <dynamic>. Статическая часть - это, в основном, строковая константа, которую вы толкаете вниз по трубе ответа так быстро, как только можете. Это может быть немного сложнее, если вы используете много промежуточного программного обеспечения, которое устанавливает куки (их нужно установить перед отправкой содержимого http), но в принципе это просто очистка буфера ответов, надеюсь, перед тем, как перейти к некоторому шаблонному коду (razor, php, и т. д.) на сервере. Это может показаться сложным, но тогда я просто объясняю это неправильно, потому что это почти тривиально. Как вы уже догадались, эта статическая часть должна содержать весь встроенный и уменьшенный JavaScript. Это выглядело бы как

<!DOCTYPE html>
     <html>
         <head>
             <script>/*...inlined jquery, angular, your code*/</script>
             <style>/* ditto css */</style>
         </head>
         <body>
             <!-- inline all your templates, if applicable -->
             <script type='template-mime' id='1'></script>
             <script type='template-mime' id='2'></script>
             <script type='template-mime' id='3'></script>

Поскольку отправка этой части по проводам вам практически ничего не стоит, вы можете ожидать, что клиент начнет получать ее где-то через 5 мс + задержка после подключения к вашему серверу. Предполагая, что сервер достаточно близок, эта задержка может составлять от 20 до 60 мс. Браузеры начнут обрабатывать этот раздел, как только получат его, и время обработки обычно будет доминировать во времени передачи в 20 и более раз, что теперь является вашим амортизированным окном для обработки на стороне сервера части <dynamic>.

Браузеру требуется около 50 мс (chrome, отдых может быть на 20% медленнее) для обработки встроенного jquery + сигнализатор + угловой + ng animate + ng touch + ng route + lodash. Это довольно удивительно само по себе. Большинство веб-приложений имеют меньше кода, чем все эти популярные библиотеки, вместе взятые, но, скажем, у вас их столько же, поэтому мы выиграли бы задержку + 100 мс обработки на клиенте (эта задержка получается из второго блока передачи). К тому времени, когда прибудет второй блок, мы обработаем весь код и шаблоны js и сможем начать выполнять преобразования dom.

Вы можете возразить, что этот метод ортогональн к встраиваемой концепции, но это не так. Если вы вместо встраивания ссылаетесь на cdns или ваши собственные серверы, браузер должен будет открыть другое соединение (я) и задержать выполнение. Поскольку это выполнение в основном бесплатное (поскольку сервер взаимодействует с базой данных), должно быть ясно, что все эти переходы будут стоить дороже, чем вообще без переходов. Если бы была какая-то особенность браузера, в которой говорилось, что внешний js выполняется быстрее, мы могли бы измерить, какой фактор доминирует. Мои измерения показывают, что дополнительные запросы снижают производительность на этом этапе.

Я много работаю с оптимизацией приложений SPA. Люди часто думают, что объем данных имеет большое значение, хотя в действительности задержка и исполнение часто доминируют. Упомянутые минимизированные библиотеки добавляют до 300 КБ данных, и это всего лишь 68 КБ в разархивированном виде, или загрузка 200 мс на 2-мегабитный телефон 3g / 4g, что в точности соответствует задержке, которую потребуется на том же телефоне, чтобы проверить, если бы у него были те же данные в своем кеше уже, даже если он был кеширован по доверенности, потому что налог на мобильную задержку (телефон до башни) все еще применяется. Между тем, подключения к рабочему столу, которые имеют меньшую задержку при первом переходе, обычно в любом случае имеют более высокую пропускную способность.

Короче говоря, сейчас (2014) лучше всего встроить все скрипты, стили и шаблоны.

РЕДАКТИРОВАТЬ (МАЙ 2016)

Поскольку приложения JS продолжают расти, и некоторые из моих полезных нагрузок теперь складывают до 3+ мегабайт минимизированного кода, становится очевидным, что по крайней мере общие библиотеки больше не должны быть встроенными.

14 голосов
/ 30 сентября 2008

я думаю, характерно для одной страницы, короткий сценарий (только) оправдан для встроенного сценария

9 голосов
/ 10 августа 2011

На самом деле, есть довольно веский аргумент в пользу использования встроенного JavaScript. Если js достаточно маленький (однострочный), я предпочитаю использовать встроенный javascript из-за двух факторов:

  • Местность . Нет необходимости перемещаться по внешнему файлу, чтобы проверить поведение некоторых javascript
  • AJAX . Если вы обновляете какой-либо раздел страницы через AJAX, вы можете потерять все ваши обработчики DOM (onclick и т. Д.) Для этого раздела, в зависимости от того, как вы их связали. Например, используя jQuery, вы можете использовать методы live или delegate, чтобы обойти это, но я считаю, что если js достаточно мал, предпочтительнее просто поместите это в линию.
5 голосов
/ 02 октября 2013

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

4 голосов
/ 26 сентября 2008

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

Затем при разработке сайта на каждой html-странице вы включаете только те, которые нужны. Когда вы начнете жить со своим сайтом, вы можете оптимизировать, объединив каждый js-файл, который необходим странице, в один файл.

4 голосов
/ 01 марта 2013

Единственная защита, которую я могу предложить для встроенного javascipt, заключается в том, что при использовании строго типизированных представлений с .net MVC вы можете ссылаться на переменные c # в середине javascript, которые я считаю полезными.

3 голосов
/ 29 сентября 2008

Три соображения:

  • Сколько кода вам нужно (иногда библиотеки - первоклассный потребитель)?
  • Специфичность: этот код функционирует только в контексте этого конкретного документа или элемента?
  • Каждый код внутри документа стремится сделать его длиннее и, следовательно, медленнее. Кроме того, из соображений SEO становится очевидным, что вы сводите к минимуму внутренние сценарии ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...