2

由于与问题无关的原因,我的同事需要加载一个使用通用模块定义模式的脚本。我们的环境通常会加载一个 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 模块试图在当前未定义定义的间歇状态下定义自己。

4

2 回答 2

1

只要不以任何方式修改 DOM 中的脚本,就可以保证这些脚本在任何可能在第一个脚本执行之前排队的异步回调之前UMD.js按照它们创作的顺序执行。

于 2015-10-05T20:36:40.427 回答
0

我认为这是一个坏主意和规范破坏,即使考虑到您的情况,由于加载顺序define而总是需要的情况很少甚至不存在。<script>AMD环境中,definerequire基本上应该被视为一流的关键字,因为它们的目标是帮助您删除globals.

实际上,据我所知,您正在陷入未定义的行为并编写难以维护的代码。您依赖于一个带有规范的棘手案例,您必须取消定义某些东西,他们会立即重新定义它,希望同时没有任何尝试使用它。我会说那是“不安全的”。

如果您真的需要这样做,我会对其进行大量评论和记录,以确保未来的开发人员不会误解您在做什么。但是,我想说更好的做法是重写UMD.js文件,以便您以自己的方式导出全局。UMD从修辞上讲,如果您不想使用它,为什么还要尝试使用它UMD

您正在编写此模块以支持AMD通过,UMD但随后您说您不希望它被AMD. 重写文件以仅导出到全局并避免define在意外与其他库发生冲突之前弄乱define.

于 2015-10-05T20:27:02.467 回答