Javascript requirejs配置提供引用错误:can';找不到变量$

Javascript requirejs配置提供引用错误:can';找不到变量$,javascript,requirejs,Javascript,Requirejs,也许我从根本上误解了requirejs配置的工作原理,但我认为我下面的配置使一些库成为全局库,这样我就可以在其他文件中使用它们,而只需要在单个脚本中需要并定义需要使用的文件。但是,我无法在应用程序代码中引用$(jQuery),而不会得到一个引用错误,表明它无法全局访问。我已将问题隔离到下面的简单示例中 我的文件设置如下: test | |-index.html |-TestApp.js |-MainApp.js |-lib | |-require.js | |-j

也许我从根本上误解了requirejs配置的工作原理,但我认为我下面的配置使一些库成为全局库,这样我就可以在其他文件中使用它们,而只需要在单个脚本中需要并定义需要使用的文件。但是,我无法在应用程序代码中引用$(jQuery),而不会得到一个引用错误,表明它无法全局访问。我已将问题隔离到下面的简单示例中

我的文件设置如下:

test
  |
  |-index.html
  |-TestApp.js
  |-MainApp.js
  |-lib
  |  |-require.js
  |  |-jquery.js
  |  |-loadash.js
  |  |-backbone.js
  |-css
     |-test.css
<!DOCTYPE html>
<html>
  <head>
    <link rel='stylesheet' type='text/css' href='css/test.css'/>
  </head>
  <body>
      <div></div>
      <script src="./lib/require.js" type="text/javascript" data-main="./TestApp.js"></script>
  </body>
</html>
库文件版本为RequireJS 2.1.22、jQuery 2.0.3、Loadash 3.10.1和主干1.2.1。我只是尝试设置我的环境,我正在采取的方法是将我的TestApp.js文件传递给require.js,以加载所需的文件,并在MainApp.js中引导应用程序代码。index.html中的脚本如下所示:

test
  |
  |-index.html
  |-TestApp.js
  |-MainApp.js
  |-lib
  |  |-require.js
  |  |-jquery.js
  |  |-loadash.js
  |  |-backbone.js
  |-css
     |-test.css
<!DOCTYPE html>
<html>
  <head>
    <link rel='stylesheet' type='text/css' href='css/test.css'/>
  </head>
  <body>
      <div></div>
      <script src="./lib/require.js" type="text/javascript" data-main="./TestApp.js"></script>
  </body>
</html>
它是index.html中的脚本行,然后通过将配置文件传递给requirejs启动应用程序代码。这是作为data main传递的TestApp.js。TestApp.js在这里:

require.config({
    paths:  {
            'jquery':   'lib/jquery',
            'lodash':   'lib/lodash',
            'backbone': 'lib/backbone'
            },

    map:    {
            '*':    {
                    // Backbone requires underscore. This forces requireJS to load lodash instead:
                    'underscore':   'lodash'
                    }
            },

    shim:   {
            jquery:         {exports:   '$'},
            underscore:     {
                            deps:       ['jquery'],
                            exports:    '_'
                            },
            backbone:       {
                            deps:       ['underscore'],
                            exports:    'Backbone'
                            },

            TestApp:        {
                            deps:       ['backbone'],
                            exports:    'TestApp'
                            }
            }
    });

require(['MainApp'], function(MainApp) {
    MainApp.run();
    });
上面的文件引用了我想要使用的库文件的路径,然后在需要下划线时重新映射要加载的loadash(我需要一些额外的loadash功能),然后在加载文件时使用垫片确保相关性正确。将此配置文件传递到index.html中的require.js似乎起到了作用,因为所有文件都显示为已在我的浏览器中加载。然而,问题似乎是,它们似乎不像我想象的那样在全球范围内都可以访问

在config部分之后,最后一个require调用加载MainApp.js文件并调用公开的run函数。MainApp.js如下所示:

define(function(require) {

    var run = function() {

                $(document).ready(function() {
                    $('div').click(function() {
                        $('div').fadeOut('slow');
                        });
                    });
                };

    return  {
            run:    run
            };
    });
据我所知,我不需要要求我在require配置中已经提到的文件,我认为它们应该被加载并可用于此代码。这就是我误解了正在发生的事情或错过了一步的地方。正在调用公开的run函数,但调用$的第一行抛出错误:

ReferenceError: Can't find variable: $
因此,我的问题是:

  • 我的想法有什么错
  • (或)我做错了什么
  • 为了预加载并使其可用,我应该做些什么 经常引用的库,因此我不需要 在我所有的文件中定义它们
据我所知,我不需要要求我在require配置中已经提到的文件,我认为它们应该被加载并可用于此代码

你误解了RequireJS的工作原理。你应该从头到尾读这本书。现在,有些事情你应该改变

您应该在
MainApp
模块中要求
jquery

define(function(require) {
    var $ = require("jquery");

您应该删除为
jquery
下划线
主干线
设置的
垫片
,因为它们都调用
定义
垫片
仅用于未调用
定义
的代码。我不知道什么是
TestApp
,但如果它是你自己的代码,你真的应该把它制作成一个合适的AMD模块,并移除
垫片

@Louis让我意识到了我在上面所做的错误。更改TestApp.js中的垫片,使其显示:

MainApp: {
         deps:       ['backbone'],
         exports:    'MainApp'
         }
纠正了这个问题,现在主干,$和uu都可以用于我的应用程序代码的其余部分,而不会弄乱每个文件。i、 e.我不需要以以下内容开始每个文件:

define (['lib/jquery', 'lib/loadash', 'lib/backbone'], function($, _ , Backbone) {

在我的实际应用程序中,常见Dep的列表非常大,这意味着我只需要定义本地使用的资源,并且可以从单个位置控制路径。

您需要使用
$
,而不是在代码的另一部分中只使用一次。。。你可以将它们作为参数传递给
MainApp.run($,global2,…)
你关于什么是TestApp的问题触发了便士的下降,我已经意识到我在上面的错误。要回答您的问题,TestApp是包含require配置的文件。MainApp是包含代码的文件(稍后启动整个应用程序)。将垫片的最后一位更改为:“MainApp:{deps:['backbone']}”修复了这个问题,我不需要在后续的应用程序代码中使用jQuery,它是全局可用的,并且真正清理了我的应用程序代码。我已经为任何遇到这个问题的人添加了完整的答案,这样他们就可以看到错误是什么。