Безопасно ли заменять html <script src = "xxx.js"> 'includes' на $ .getScript (...)? - PullRequest
3 голосов
/ 21 октября 2011

(я все еще очень плохо знаком с Javascript и JQuery) Я пытаюсь сохранить свой код в чистоте, создавая один файл js на файл html. У меня также есть несколько общих js-файлов, содержащих код, используемый js-файлами для конкретных страниц.

Я искал решения для импорта / включения других js-файлов в данный js-файл и наткнулся на этот one . Это относится к $.getScript().

Вместо того, чтобы использовать несколько <script src="xxx.js"></script> в качестве импорта / включения в моих html-страницах, могу ли я переместить их в свои файлы js и использовать вместо них $.getScript(...)? Я имею в виду, это безопасно? Это хорошая практика?

EDIT

Насколько безопасны циклические ссылки?

РЕДАКТИРОВАТЬ II

Чтобы было понятнее, давайте представим, что у меня есть a1.js, a2.js и a3.js.

Для a1.js:

$.getScript("a2.js");
$.getScript("a3.js");
...

Для a2.js:

$.getScript("a3.js");
...

Для a3.js:

$.getScript("a2.js");
...

Существует потенциальная бесконечная петля между a2.js и a3.js. Должен ли я справиться с чем-то вроде этого в каждом файле js:

var vari;

if (typeof vari === 'undefined') {
    vari = 1;
}

1 Ответ

4 голосов
/ 21 октября 2011

Относительно хорошей практики, этот ответ как всегда ... это зависит.

Стиль вашей страницы

Против:

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

PRO:

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

Ваш стиль кодирования

  • Не каждая страница и сценарий структурированы для использования таким образом. JQuery $(document).ready() запускает каждый зарегистрированный обработчик один раз, даже после того, как событие произошло. Это не обязательно означает, что каждый обработчик работает таким образом, определенно не события DOM2.

  • Если у вас есть встроенные скрипты, они больше не будут работать.

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

Какая награда?

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

ОБНОВЛЕНИЕ ответ на ваш комментарий

Использование getScript на вашей странице должно выглядеть так:

//since you need it there will be some kind of wrapper
var initClosure = function() {...}

if(typeof optionalNamespace == 'undefined') {
    $.getScript('/foo.js', initClosure);
} else {
    initClosure();
}

Весь зависимый код находится в initClosure, и вы проверяете пространство имен или имя переменной (даже что-то вроде window['blub'] или просто blub будет работать). Вам это понадобится, поскольку зависимая функция on getScript, которая обычно устанавливает значения по умолчанию или добавляет что-либо в dom, должна вызываться только один раз.

Тем не менее, я не вижу смысла в циклических ссылках, потому что это будет означать:

загрузить скрипт 1 -> ждать -> загружен -> загрузить скрипт 2 -> ждать -> загружен -> [...] -> загрузить скрипт 1

Этой ситуации следует избегать как минимум по 2 причинам

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