【问题标题】:Require.js something not clearRequire.js 有些不清楚
【发布时间】:2012-05-29 14:19:18
【问题描述】:

我正在尝试使用 requirejs 并加载外部供应商 js 并隐藏 Backbone 或 Underscore 等全局变量。

这是我的代码:

<script data-main="./main" src="<?php echo $rootRequirejs?>/require.js"></script>
<script type="text/javascript">
    require.config({
        baseUrl: "/web/js",
        paths: {
            "jquery": "/vendor/js/jquery-1.7.1.min",
            'underscore': '/vendor/js/underscore-min',
            'backbone': '/vendor/js/backbone-min'
        }
    });

这是我的问题:

1) 如果我转到 javascript 控制台并编写 Backbone 或下划线,它们被定义......
我认为它应该无法从控制台访问,而只能从我的 main.js 文件中访问。
为什么它们是全球性的?

【问题讨论】:

  • 关于全局,在您对它们使用noConflict() 方法之前,它们仍然是全局的。 IIRC,require.js 允许您为这些依赖项定义一个函数,因此您可以返回类似 Backbone.noConflict() 的内容。
  • 顺便说一句,你看过Require.js 2.0吗?它解决了你的问题。还可以看看“升级 require.js”指南,你会看到很多有用的东西。
  • 你如何加载你的模块?您可以发布您的 main.js 以查看依赖项是如何声明的吗?
  • @GabrielJürgens 我确实解决了这个问题。实际上我只有一个关于全局变量的问题。并且 Backbone.noConflict() 不能解决我的问题。我的意思是主干是全球性的。
  • @FlorianMargaine。我确实解决了这个问题。实际上我只有一个关于全局变量的问题。并且 Backbone.noConflict() 不能解决我的问题。我的意思是主干是全球性的。

标签: javascript backbone.js require


【解决方案1】:

由于库本身(骨干网等)的编写方式,这些默认情况下将是全局的 - 它们明确使用全局空间(b/c 很好,这就是 js 的工作方式)。你试过这些库中的the AMD-forks 吗?

Florian 在上面的 cmets 中指出,也许更好的选择是使用 Require2.0,因为它现在附带 "shim" feature,它可以帮助您使用非 AMD 库...虽然我不确定这会消除全局变量。

fwiw,除非您有特定的理由避免使用全局变量,否则它们通常没什么大不了的。

【讨论】:

  • 我正在尝试使用 shim 功能,但我可以告诉 requirejs 一个模块已经定义吗?如果是,如何?对于 eaxmple shim: { 'jquery'} 它在 baseUrl 中查找,但实际上它已经加载了。
  • require 不会尝试加载它已经加载的模块。如果你使用 require 加载 jquery,你应该没问题。如果您通过 require AND 标准脚本标记加载 jquery,那么您最终可能会在页面中得到两个副本。我认为如果你首先加载 jquery,require 会看到它已经被加载(技术上“定义”为一个模块)并且不会尝试再次加载它。
【解决方案2】:

您可以使用封装在 AMD 模块中的那些库的 amd 版本,这应该避免使用全局变量:

https://github.com/amdjs/backbone

https://github.com/amdjs/underscore

它们由 RequireJS 的作者 James Burke 维护。

希望这能解决您的问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2018-02-24
    • 2013-02-28
    • 2020-01-29
    • 1970-01-01
    • 2020-08-22
    • 2020-11-15
    相关资源
    最近更新 更多