3

我正在构建一个单页 Web 应用程序,其中一个要求是 jQuery、jQuery-ui 和我决定在开发期间使用的任何 jquery 插件。

我还在研究 RequireJS 和 Backbone 以形成应用程序的 MVC 结构。虽然我毫不怀疑 RequireJS 在加载我创建的 Backbone MVC 模块时会非常有用,但我对使用它来加载 jQuery 及其插件有些漠不关心。

这是因为我认为 jQuery 可以在全局命名空间中使用,因为它将在整个应用程序的任何地方使用。

所以我的问题是:在模块化组件和我认为必要的全局组件 jQuery 之间进行这样的分离可以吗?

4

2 回答 2

2

我们做了类似的事情并且不使用 require 来加载诸如 jQuery 和下划线之类的“全局”组件,尽管我们确实使用 require 来加载我们的模块。我认为这两种方法都是有效的(使用 require 加载 jQuery 或不加载)。

选择 requireJS 来加载您的自定义模块的原因之一是因为您希望在构建和部署过程中运行优化器,以最大限度地减少应用程序必须加载的脚本文件的数量。优化器(例如 r.js)可以跟踪您指定到 requireJS 的依赖项,以帮助确定要创建哪些捆绑的 JS 文件。如果您使用多个第三方库,您可能希望将它们捆绑到一个 JS 文件中. 这将是选择使用 requireJS 加载 jQuery 的原因之一。

否则,我认为这取决于您的喜好。如果您在应用程序中使用 requireJS,我不知道为什么您“应该”使用 requireJS 加载 jQuery 的技术原因。

我建议阅读这份文件。它更多的是关于如何而不是为什么,但它仍然是有用的信息:http ://requirejs.org/docs/jquery.html

也看看这个示例项目:https ://github.com/jrburke/require-jquery

于 2012-11-01T22:06:59.610 回答
1

你想要这样的东西:

require.config({
  baseUrl: "/js/",
  paths: {
    jquery: 'libs/jquery/jquery-1.7.1',
    'jquery.mobile-config': 'libs/jqm/jquery.mobile-config',
    'jquery.mobile': 'libs/jqm/jquery.mobile-1.1.0',
    'jquery.mobile.asyncfilter': 'libs/jqm/asyncfilter',
    underscore: 'libs/underscore/underscore-1.3.3',
    backbone: 'libs/backbone/backbone-0.9.2',
    templates: '../templates'
  },
  shim: {
          'underscore': {
            exports: "_"
          },
          'backbone': {
              //These script dependencies should be loaded before loading
              //backbone.js
              deps: ['jquery','underscore'],
              //Once loaded, use the global 'Backbone' as the
              //module value.
              exports: 'Backbone'
          },
          'jquery.mobile-config': ['jquery'],
          'jquery.mobile': ['jquery','jquery.mobile-config'],
          'jquery.mobile.asyncfilter': ['jquery.mobile'],
        }
});

require([
  'jquery',
  'app',
  'jquery.mobile','jquery.mobile.asyncfilter'
], function( $, App ){
    $(function(){
      App.initialize();
    });
});

在你的情况下,你会用 jquery-ui 的东西替换 jquery-mobile 的东西。同样的想法。Jquery 足够聪明,可以将自己置于全局命名空间中,其余的则不是(一般而言),具体取决于您的版本。希望这可以帮助你。请记住,如果您使用与 amd 不兼容的库,则需要将其放入 shim 中,就像您在上面看到的那样。垫片是手动(也就是你自己)包装库的快捷方式。

于 2012-11-02T20:04:08.790 回答