require.js - 定义自定义模块

时间:2014-10-16 11:44:22

标签: javascript requirejs

大家好,

我想弄清楚,为什么Cookie模块只有在使用new运算符实例化后才可访问... 我想如果我在shim配置中导出Cookie模块并将模块名称添加到 app.js 中的必备条件,那么它将是全局可访问的。但事实并非如此。

您能否告知我的模块可能出现的问题?

cookie.js

define("Cookie",function (){
    function Cookie()
    {}

    Cookie.prototype.add = function ()
    {
        doStuff();
    }

    Cookie.prototype.remove = function ()
    {
        doStuff();
    }

    return Cookie;
});

main.js

requirejs.config({
    baseUrl: 'js/lib',
    paths: {
        app: '../app',
    },
    shim:{
        Cookie: {
            exports : 'Cookie'
        }
    }
});

app.js

define(['Cookie'],function(Cookie)
{
    Cookie.add(); 
    Cookie.remove(); 
}

2 个答案:

答案 0 :(得分:2)

此代码存在许多问题。正如Andy指出的那样,定义Cookie的方式需要实例化它。如果您希望应用程序中只有一个Cookie实例,那么会指示return new Cookie(),但是如果您想要创建多个实例,则需要return Cookie,然后您只要您需要创建new Cookie个实例,就可以在导入它的每个模块中使用Cookie

但是,您在问题中显示的代码存在以下其他问题:

  1. 您的文件名为cookie.js,但您将其定义为Cookie,大写不同。经验法则:RequireJS区分大小写,因此文件和模块名称应该对应,除非以某种方式将其覆盖在其他地方,这在您显示的代码中不是这样。

    < / LI>
  2. 您使用define('Cookie',为您的模块指定名称Cookie。 RequireJS的文档非常清楚地建议不要手动分配模块名称。优化后,r.js将指定名称。或者,如果您不进行优化,则RequireJS将从文件名中分配模块名称。优化后,如果您已经分配了名称,r.js将无法正常工作。 (是的,有时您想自己分配名称,但如果您无法在特定实例中命名具体原因,则需要设置名称你自己,那很可能是你做错了。)

  3. 您使用shim配置来调用RequireJS&#39; define功能。 shim选项仅适用于未调用define 的模块。如果您向调用shim的模块提供define,则输入未定义的行为区域,如果有效,那就是运气。它可能现在可以正常工作但明天就会失败,或者当RequireJS引入新版本 为调用shim的模块使用define指定一些已定义的行为时,它可能会失败。

答案 1 :(得分:0)

因为Cookie是构造函数。您需要return new Cookie();

有关this StackOverflow page上应使用new的原因的详细信息。

  

...如果忘记[new],您将调用对象构造函数作为常规函数。如果构造函数没有检查其执行上下文,那么它将不会注意到“this”指向不同的对象(通常是全局对象)而不是新实例。因此,构造函数将向全局对象(窗口)添加属性和方法。如果你总是在对象函数中检查'this'是你对象的一个​​实例,那么你就不会遇到这个问题。