如何扩展用AMD定义的Javascript模块?

Joh*_*hn_ 7 javascript module-pattern js-amd

首先是一段历史,我们有一个由许多javascript文件组成的引擎,这些文件本质上是模块.尽管在指定的命名空间下,这些模块返回分配给全局范围的单个类.

引擎本身用于显示电子教学内容,每个不同的电子教学课程需要稍微不同的需求,这是我们根据必要的功能将javascript文件包含到页面中的位置.(只有一个入口页面).

我一直试图权衡它是否值得改为AMD,require.js和r.js,或者如果最好继续使用我们当前的系统,其中包括页面上所需的所有内容并将其最小化为一个脚本.

去AMD的最大问题之一就是容易扩展课程似乎更难.例如,有时我们必须稍微调整原始类的行为.因此,我们通过复制原始原型在页面上添加另一个脚本include,扩展原始类,执行使用apply重写的原始函数,然后执行任何其他代码.

您是否可以在不调整原始文件的情况下扩展AMD模块?或者我错过了这一点,我们最好还是坚持我们现在正在做的事情?

Kee*_*een 6

我最近使用RequireJS开始了一个项目,我用来扩展下划线的方法归结为这样:

相关目录结构:

  • /脚本
  • /scripts/underscore.js
  • /scripts/base/underscore.js

真正的下划线库转到/scripts/base/underscore.js.

我的扩展名在/scripts/underscore.js中.

/scripts/underscore.js中的代码如下所示:

define(['./base/underscore'], function (_) {
    'use strict';

    var exports = {};

    // add new underscore methods to exports

    _.mixin(exports); // underscore's method for adding methods to itself

    return _; // return the same object as returned from the underscore module
});
Run Code Online (Sandbox Code Playgroud)

对于正常扩展,它可能看起来更像这样:

define(['underscore', './base/SomeClass'], function (_, SomeClass) {
    'use strict';

    _.extend(SomeClass.prototype, {
        someMethod: function (someValue) {
            return this.somethingOrOther(someValue * 5);
        }
    });

    return SomeClass;
});
Run Code Online (Sandbox Code Playgroud)

关于下划线的注意事项:在其他地方,我使用RequireJS shim-config来获取下划线作为AMD模块加载,但这对于使用非填充AMD模块的此过程应该没有影响.