2015-10-01 4 views
2

По причинам, не имеющим отношения к вопросу, моему коллеге необходимо загрузить сценарий, который использует шаблон Universal Module Definition. В нашей среде обычно загружен инструмент AMD, но для более неуместных причин моему коллеге нужен сценарий для определения глобального, а не регистрации модуля через AMD. Подход, который в настоящее время проверяется в их отделении что-то вдоль линий этого:Могут ли модули AMD загружать промежуточные строки в сценарии?

<script> 
    var backupDefine = define; 
    define = null; 
</script> 
<script src="../path/to/some/script/using/UMD.js"></script> 
<script> 
    define = backupDefine; 
    backupDefine = null; 
</script> 

Мой вопрос: Является ли это ужасная идея? Есть ли гарантия того, как браузеры загружают скрипты из тегов сценариев, которые обеспечат ничего, кроме загрузки сценария на основе UMD, произойдет между неопределением определения и восстановления define? У нас очень большая, очень тяжелая загрузка асинхронных активов, в основном основанная на модулях AMD, поэтому я заинтересован в том, что модуль AMD пытается определить себя в этом прерывистом состоянии, где определение в настоящее время не определено.

+0

Можете ли вы показать нам код UMD.js? Я не понимаю, почему вы не можете использовать UMD вместе с AMD, поскольку UMD - это всего лишь надмножество AMD. – Buzinas

+0

@Buzinas Концерн не связан с UMD и AMD вместе. Это прекрасно работает. Озабоченность заключается в попытке моего коллеги обмануть UMD в обход AMD и определить глобальную. – Dogs

+0

Но зачем ему это нужно? Это мой вопрос. Почему он пытается изменить 'define' на' null' при добавлении файла 'UMD.js', а затем, определяя его? Не может ли 'UMD.JS' жить вместе с' define'? Это не имеет смысла для меня. – Buzinas

ответ

0

Я вижу это как плохую идею и нарушение спецификации, даже если случай, когда define всегда необходим, является редким или даже несуществующим из-за загрузки заказа, учитывая ваш случай. В среде AMDdefine, require и тому подобное должны в основном рассматриваться как ключевые слова первого класса, так как их цель - помочь вам удалить globals.

Реально, вы наступаете на неопределенное поведение, насколько я могу судить и писать код, который трудно поддерживать. Вы полагаетесь на сложный случай со спецификацией, где вам нужно что-то отменить, и они сразу переопределяют это, надеясь, что ничто не попыталось использовать его в среднее время. Я бы сказал, что это «небезопасно».

Если вам действительно нужно, чтобы это произошло, я бы прокомментировал и задокументировал его, чтобы убедиться, что будущий разработчик не поймет, что вы делаете. Тем не менее, я бы сказал, что лучший способ действий - переписать файл UMD.js, чтобы вы экспортировали свой глобальный свой собственный путь. Риторически, почему вы пытаетесь использовать UMD, если вы не хотите его UMD вещей?

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

1

Пока UMD.js никоим образом не изменяет сценарии в DOM, эти сценарии гарантированно выполняются в том порядке, что они авторством в перед тем любые асинхронные обратные вызовы, которые, возможно, были в очереди до того, как первый сценарий выполняется.

 Смежные вопросы

  • Нет связанных вопросов^_^