2014-10-30 160 views
0

我使用requirejs为浏览器和nodejs编写了模块。只在浏览器中加载requirejs模块,而不是在nodejs中加载模块

一切工作正常,但我想包括一个模块仅用于浏览器,而不是节点,因为我不需要它,它不会在节点中工作。 (这只是浏览器的一个奇特的设计库)。

我的代码如下所示:

define([ 
    'requirement', 
    'libs/fancy' 
], function(Requirement, fancy) { 
    // do stuff 
}); 

看中的是,我不希望在节点的lib。所以我可以写这样的解决方法:

if (typeof window !== 'undefined') { // cheap detection of browser/node 
    define([ 
     'requirement', 
     'libs/fancy' 
    ], start); 
} else { 
    define([ 
     'requirement' 
    ], start); 
} 

function start(Requirement, Fancy) { 
    // do stuff 
} 

但显然这是丑陋的。有谁知道更好的方法来做到这一点?

- 编辑1:

var requirements = ['requirement']; 

if (typeof window !== 'undefined') { 
    requirement.push('libs/fancy'); 
} 

define(requirements, function(Requirement, Fancy) { 
    // do stuff 
} 

还不够完善

回答

1

我有时用你展示创建我把这取决于我需要哪些依赖数组的第二种方法。

但是,有另一种方法,但我不想修改依赖关系列表时使用了。推测模块内部的代码必须使用undefined的值Fancy。所以你可以使用下面的内容。这个想法是配置RequireJS加载一个模块,该模块在加载时返回undefined值。这样你就不需要修改你的依赖列表。它只需要能够处理Fancy未定义的情况。

var requirejs = require("requirejs"); 

// Create a fake module that we name immediately as "undefined". 
requirejs.define("undefined", [], function() { return undefined; }); 

var req = requirejs.config({ 
    map: { 
     // Make it so that all requests for `foo` load `undefined` instead. 
     "*": { 
      foo: "undefined" 
     } 
    } 
}); 

req(["foo"], function (foo) { 
    console.log(foo); 
}); 

上面的示例映射到fooundefined所以当console.log执行时,在控制台上的值是undefined。在你自己的代码中,你可以将libs/fancy映射到undefined

此方法的一个变体是使undefined模块返回一个对象,该对象显示与真实库相同的接口但什么也不做。这将避免必须测试Fancy是否定义在您的模块内部。虽然我会打电话给伪造的模块,但不是undefined。也许像fake-fancy