Javascript require(require.js)的多个实例可以很好地协同工作吗

Javascript require(require.js)的多个实例可以很好地协同工作吗,javascript,requirejs,Javascript,Requirejs,我认为我需要在一个页面中支持不止一个require实例,为此我遇到了两个问题。我正在开发一项服务,该服务向外部客户端页面提供可嵌入的交互对象。最重要的设计标准是易于嵌入,尽可能少地假设客户机环境,并且在客户机页面的js/css世界中表现良好。客户端向其页面添加脚本标记以加载加载程序,然后使用内联脚本加载所需内容: <script src="http://server.net/loader"></script> <script>

我认为我需要在一个页面中支持不止一个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>
在大多数情况下,这种方法非常有效。我能够将我的需求与客户端页面中的任何需求完全分开,并且我轻描淡写地处理了客户端的js全局名称空间。但是:

  • 如果客户端页面碰巧正在加载require并使用数据主属性调用它,则会显示my require并尝试根据my baseUrl加载其数据主脚本,我们会得到一个加载错误。我可以修改require的源,使其停止查找数据主属性。有更清洁的解决方案吗

  • require社区非常清楚,页面上的require实例不应超过一个。require.js源代码特意避免了自身的重复。所以我很紧张,因为我走这条路会给自己带来麻烦。也就是说,对于可能使用客户机的require实例(使用我自己的加载上下文),我甚至更加紧张。要求1.2、2.0和2.1是不兼容的,我不知道我在用什么。我只是处在一个不寻常的情况下,有必要单独运行吗?我会惹麻烦吗?有没有一种方法可以加载require.js并允许它在可能的情况下遵从现有的require,同时仍然可以保证我已经获得了require的特定版本


  • 我想可以。请参见此处的示例:

    您是否有任何选项可以在
    IFRAME
    中运行require并使用顶部窗口制作一个小型通信处理程序?我自己从未使用过,因此我不知道它是否有任何帮助,但是你检查过了吗?@YochaiAkoka我们试图避免这种情况,这样我们就可以让我们所有的交互用户无缝地将它集成到他们的页面中——例如,允许我们的名称空间css类通过他们的样式表进行样式设置。第一点(关于data main)看起来像的手表将导致一个选项,以防止扫描。
    // 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(...) { ... })