【发布时间】:2013-10-14 23:21:59
【问题描述】:
我认为我需要在一个页面中支持多个 require 实例,并且遇到了两个问题来实现它。我正在开发一项向外部客户端页面提供可嵌入交互式对象的服务。最重要的设计标准是易于嵌入,对客户端环境做出尽可能少的假设,并在客户端页面的 js/css 世界中很好地发挥作用。客户端在他们的页面中添加一个脚本标签来加载加载器,然后他们使用内联脚本来加载他们想要的内容:
<script src="http://server.net/loader"></script>
<script>
special_require(["loader"], function(loader) {
loader.load({
object: "objectname",
target: "#where-i-want-it"
// other config settings
})
})
</script>
加载器在匿名函数中运行 require.js 源,对其进行配置,然后将 require 和 define 导出为命名空间的全局变量(我们称它们为 special_require 和 special_define)。然后是special_defined几个模块,以“loader”结尾:
// Using strategy 2 from http://requirejs.org/docs/faq-advanced.html#rename to
// namespace require so it doesn't conflict with code on client sites.
;(function() {
// Here, we use Jinja to drop in require.js, which will define itself in
// this non-global namespace.
{% include 'loader/require.js' %}
require.config({
...
})
window.special_require = require
window.special_define = define
})()
special_define("loader", [...], function(...) { ... })
在大多数情况下,这非常有效。我能够将我的需求与客户端页面中的任何需求完全分开,并且我对客户端的 js 全局命名空间轻描淡写。但是:
-
1234563我可以修改我的 require 的来源,以便它停止寻找 data-main 属性。有更清洁的解决方案吗?
require 社区非常清楚,一个页面上不应有多个 require 实例。 require.js 源代码竭尽全力避免重复。所以我很紧张,因为我走这条路会让自己陷入困境。也就是说,我更担心可能使用客户端的 require 实例(使用我自己的加载上下文)。 Require 1.2、2.0 和 2.1 不兼容,我不知道我在使用什么。我是否只是在一个不寻常的情况下,分开运行是有意义的?我会遇到麻烦吗?有没有办法加载 require.js 并允许它在可能的情况下推迟到现有的 require,同时仍然可以保证我有特定版本的 require?
【问题讨论】:
-
您是否可以选择在
IFRAME中运行您的需求并使用顶部窗口创建一个小型通信处理程序? -
我自己没用过,不知道有没有用,你查过requirejs.org/docs/api.html#multiversion吗?
-
@YochaiAkoka 我们试图避免这种情况,这样我们就可以让我们交互的所有消费者将其无缝集成到他们的页面中——例如,允许我们命名空间的 css 类通过他们的样式表来设置样式.
-
对于您的第一点(关于数据主)观看github.com/jrburke/requirejs/issues/876,这看起来会导致一个选项阻止该扫描。
标签: javascript requirejs