使用RequireJS:我应该定义继承的资源吗?

Using RequireJS: should I define inherited resources

本文关键字:资源 继承 定义 RequireJS 我应该 使用      更新时间:2023-09-26

我有一个使用require.js的骨干应用程序,我试图弄清楚,如果在链下定义的资源是通过原型链继承的,这似乎是这样的情况。如果这是正确的,那么什么是最佳实践,我是否应该重新定义它们?

在我的例子中,我有一个基本模型,它提供了一些自定义行为,这些行为将在我所有的模型中通用。

// Base Model
define([
    'backbone'
],
function (Backbone) {
    'use strict';
    return Backbone.Model.extend({
        fetch: function (options) {
            options = options ? options : {};
            options.data = options.data ? options.data : {};
            options.data.nocache = $.now();
            return Backbone.Model.prototype.fetch.call(this, options);
        }
    });
});

然后我有其他模型扩展基本模型来继承这些公共函数。

// Some other model
define([
    'app',
    'backbone',
    'models/base/model'
], 
function(App, Backbone, BaseModel) {
    'use strict';
    return BaseModel.extend({
        url : function() {
            return 'some/url/;
        }   
    });
});

正如您所看到的,我已经将backbone定义为两个模型中的资源,但由于其他模型继承自基本模型。我真的需要在这里定义主干吗?

我正在寻找最佳实践,谢谢!

我总是定义一个模块运行所需要的一切。如果你不这样做,它就不是便携式的。如果您在将来删除了上游依赖项,那么您的下游模型也可能会中断。例如,

define('a', ['app','backbone','myplugin', ...]
define('b', ['app','backbone','a', ...]

如果ba都使用myplugin,那么在将来的某个时候a不再需要它,当你从a中删除myplugin时,你将在不知情的情况下破坏b

如果你有一堆some-other-models,我建议把它们放在你的require.js配置文件中,像这样:

require.config({
  paths: {
    'backbone': 'path/to/backbone'
  },
  shim: {
    'models/*': { deps: [ 'backbone' ] }
  }
});

然后你就可以为你的some-other-model声明深度,因为backbone已经存在了:

define(['app', 'models/base/model'], function (App, BaseModel) {
  // backbone is already loaded here
});