由于与问题无关的原因,我的同事需要加载使用Universal Module Definition模式的脚本。我们的环境通常加载了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的脚本之外什么都不会在定义和恢复定义之间发生?我们有一个非常大的,非常大的非同步资产负载主要基于AMD模块,所以我关心的是一个AMD模块试图在间歇状态下定义自己,其中define目前尚未定义。
答案 0 :(得分:1)
只要UMD.js
无法修改DOM中的脚本,就可以保证这些脚本按照中创建的顺序执行任何可能具有的异步回调在第一个脚本执行之前排队。
答案 1 :(得分:0)
我认为这是一个坏主意和规范中断,即使define
总是必要的情况很少甚至不存在,因为考虑到你的情况<script>
加载顺序。在AMD
环境中,define
,require
等应该基本上被视为头等关键字,因为他们的目标是帮助您删除globals
。
实际上,就我所知和编写难以维护的代码而言,您正在研究未定义的行为。您依赖于一个棘手的案例,其中您必须取消定义某些内容,并立即重新定义它,希望在同一时间没有尝试使用它。我说那不安全&#34;。
如果您确实需要这样做,我会对其进行评论和记录,以确保未来的开发人员不会误解您正在做的事情。但是,我会说更好的做法是重写UMD.js
文件,以便您以自己的方式导出全局。在修辞上,如果你不想要UMD
事,你为什么要使用UMD
?
您正在编写此模块以支持AMD
到UMD
,但之后您说您不希望AMD
使用它。重写该文件以便只导出到全局,并避免在与define
处理棘手的其他库发生意外冲突之前弄乱define
。