Не удается загрузить удаленный файл javascript, останавливает выполнение javascript в любых браузерах?

У меня есть отдельный файл script, который я хочу загрузить с стороннего сервера:

<script type="text/javascript" src="//some_server/logger.js"></script> 

Там небольшой шанс, что удаленный script не будет там иногда (404), и я хочу быть уверенным, что включение этого script не влияет на то, как работает мое приложение, так как мое приложение не работает 't требует, чтобы script загружался для работы (это сортировщик аналитики)

Могу ли я включить этот script безопасно, если он не блокирует или не приводит к ошибкам JavaScript в моем приложении, которые останавливают запуск другого javascript?

Я подумывал добавить атрибуты async и defer, чтобы сделать загрузку script ленивой. Этого достаточно? Мое приложение должно работать на IE8 и выше.

Вот что я сейчас думаю:

<script async defer type="text/javascript" src="//some_server/logger.js"></script> 

<script type="text/javascript">
console.log("I want this to always execute, no matter if the above script 404 or not!");
</script>

Ответ 1

Могу ли я включить этот script безопасно, не блокируя или вызывающий ошибки javascript в моем приложении, которые останавливают запуск другого javascript?

ДА вы можете

A 404 не останавливает выполнение javascript в любом случае, только ошибки.
Пока сервер отвечает 404 и не зависает, script не загружается, не будет вызывать заметной задержки.

Это может быть протестировано в разных браузерах путем регистрации времени, необходимого для проверки 404 или неработающей ссылки.
Просто тот факт, что браузер регистрирует время, показывает, что такие скрипты не останавливают выполнение javascript, поток всегда переходит к следующему тегу script, если парсер не встречает ошибку в script, если URL-адрес isn ' t, браузер не будет вызывать ошибку, он просто продолжается, как только URL-адрес не будет разрешен.

<script>console.time('Test');</script>
<script type="text/javascript" src="http://www.broken.url/file.js"></script>
<script>console.timeEnd('Test');</script>

FIDDLE

Тестирование в IE, Chrome, Firefox и Opera показывает, что во всех браузерах используется менее 0,0002 секунды для устранения неработающей ссылки, а время, необходимое для разрешения 404, зависит от того, как быстро реагирует сервер, но для серверов Google это кажется во всех браузерах до появления кода статуса 404, и браузер будет выполнять следующие сценарии.

Даже сложение 20 сценариев, которые все возвращают 404, занимает, как правило, менее половины секунды для разрешения сервера и перехода на

FIDDLE

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

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

Ответ 2

Определите все функции, которые вы используете (которые находятся в //some _server/logger.js), как пустые функции перед загрузкой script, и у вас не будет никаких исключений, даже если вы используете их без загружаемого script.

<script type="text/javascript">
   functionInLogger = function() {
   };
   functionInLogger2 = function() {
   };
   ...
</script>
<script type="text/javascript" src="//some_server/logger.js"></script> 

<script type="text/javascript">
   functionInLogger(); 
   functionInLogger2();
   console.log("This will always work");
</script>

И когда загружается script, он отменяет пустые функции.

Я не мог найти ни одного популярного браузера, который остановит выполнение на 404. И стандарт W3 только устанавливает это; (W3)

Когда пользовательскому агенту требуется выполнить блок script, он должен выполнить следующие шаги:

...

Если при загрузке произошла ошибка (например, ошибка DNS или ошибка HTTP 404) Выполнение блока script должно состоять только в том, чтобы запустить простой элемент с именем error в элементе.

Ответ 3

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

Или вы также можете загрузить его после готовности документа, этот метод не даст дополнительного времени загрузки, если script не найден. Пример:

$(document).ready(function() {
    $('head').append('<script type="text/javascript" src="//some_server/logger.js"></script>');
});

или используйте метод $.getScript

$(document).ready(function() {
    $.getScript('//some_server/logger.js', function(data, textStatus) {
        /*optional stuff to do after getScript */ 
    });
});

* в примере выше Я предполагаю, что если вы используете jQuery

Ответ 4

Я думаю, вы должны использовать что-то вроде RequireJS.

От Wiki: Это позволяет разработчикам определять зависимости, которые должны загружаться до того, как модуль будет выполнен, поэтому модуль не пытается использовать внешний код, который еще не доступен.