javascript - Requirejs垫片: want to register backbone plugins directly into core backbone

标签 javascript backbone.js module requirejs shim

我有两个小的 Backbone 插件,看起来像这样:

(function($, _, Backbone) {

var ListView = Backbone.View.extend({
// blablabla
});

Backbone.ListView = ListView;

})($, _, Backbone);

(function($, _, Backbone) {

var Repository = Backbone.Model.extend({
// blablabla
});

Backbone.Repository = Repository;

})($, _, Backbone);

我现在已经设置了 require.config:

require.config({

    baseUrl: "javascripts",

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

    },

    paths: {
        "jquery": "Vendors/jquery",
        "underscore": "Vendors/underscore",
        "backbone": "Vendors/backbone",
        "ListView": "Extensions/ListView",
        "Repository": "Extensions/Repository"
    }

});

现在我们来解决问题。如果我想同时使用这两个插件,这就是我目前必须处理模块依赖关系的方式:

require(['jquery', 'underscore', 'ListView', 'Repository'], function($, _, Backbone1, Backbone2) {

    // this is backbone + list view
    console.log(Backbone1);
    // this is backbone + repository
    console.log(Backbone2);       

});

但我希望插件已经注册到主干中:

require(['jquery', 'underscore', 'backbone'], function($, _, Backbone) {

    // this now is backbone + listView + repository
    console.log(Backbone);

});

我该怎么做? 我需要更改什么?

最好的问候, 博多

最佳答案

我建议首先为 ListViewRepository 创建模块,让它们(希望 Backbone 也一样)远离全局命名空间,像这样:

list_view.js

define(['jquery', 'underscore', 'backbone'], function($, _, Backbone) {
  Backbone.ListView = Backbone.View.extend({
    ... ListView code here ...
  }
  return Backbone.ListView
});

库.js

define(['jquery', 'underscore', 'backbone'], function($, _, Backbone) {
  Backbone.Repository = Backbone.View.extend({
    ... Repository code here ...
  }
  return Backbone.Repository
});

然后你可以使用 require.js' map配置将依赖关系映射到包含两个模块的适配器,然后撤消 list_viewrepository 模块本身的映射以避免循环依赖:

requirejs.config({
  map: {
    '*': {
      'backbone': 'backbone-adapter'
    },
    'list_view': {
      'backbone': 'backbone'
    },
    'repository': {
      'backbone': 'backbone'
    },
});

然后创建一个文件 backbone-adapter.js 将插件与 Backbone 本身捆绑在一起:

Backbone 适配器.js

define(['backbone', 'list_view', 'repository'], function (Backbone) {
  return Backbone;
});

然后在您的模块中,当您将 'backbone' 作为依赖项包含时,requirejs 会将其映射到 backbone-adapter,后者将依次包含您的插件,以便它们以 Backbone.ListViewBackbone.Repository 的形式提供。

我还没有实际测试过上面的代码,但我使用了类似的策略将 vendor 模块与我自己的插件捆绑在一起,它对我来说效果很好。 (思路取自this discussion。)

关于javascript - Requirejs垫片: want to register backbone plugins directly into core backbone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13331484/

相关文章:

javascript - Backbone 和 TypeScript,一段不幸的婚姻 : Building a type-safe "get"?

python - 在 Jython 中使用时 inspect.py 的问题

javascript - 使用requests-html渲染javascript页面时发生IOError

javascript - JSFiddle 提供的额外 CSS

backbone.js - 用于创建集合的主干覆盖 url

javascript - 从 JSON 文件渲染主干集合不完全工作

php - 如何访问 require.js 异步加载的 Javascript 中的 URL 参数?

python - 为什么python在启动时不自动导入每个模块?

javascript - 创建网络 map 应用程序。 Leaflet 还是 OpenLayers?

javascript - 我可以让 webpack 不缩小 js 代码吗?