Node.js require()vs RequireJS?

你好与RequireJS我可以设置一个基本path是这样的: base : './app/'所以当我在./app/foo/bar/例如,我有一个脚本,我使用require('foo'); 然后RequireJS将search./app/foo.js而不是在node_module文件夹或./app/foo/bar/foo.js当你有一种结构对于你来说会更清洁开发者可以看到依赖关系,而不是拥有../../foo.js 。 我可以有./app/foo.js./app/foo/foo.js./app/foo/bar/foo.js它会更清晰:

 require('foo'); require('foo/foo'); require('foo/bar/foo'); 

而不是:

 require('../../foo'); require('../foo'); require('./foo'); 

现在你可以说,为什么不改变名称,并没有到处都有foo,让我们说,我们不能以任何理由…

在RequireJS中,我在节点的require方法中看到的另一个缺乏的特性是设置path映射的能力,如果我在RequireJS中有一个名为./app/super-sized-directory-name/的目录,我可以简单地执行'big-dir' : 'super-sized-directory-name' ,然后我可以简单地使用require('./app/big-dir/foo')和Node.js的require方法,这是不可能的,据我所知…

 --alias, -a Register an alias with a colon separator: "to:from" Example: --alias 'jquery:jquery-browserify' 

您可以使用browserify注册​​别名,以覆盖您的重命名。

至于你根深蒂固的绝对path,那是不可能完成的。 如上所述, modul8有一个名称空间机制来解决这个问题。

我build议你在freenode的#stackvm中使用pong SubStack并直接询问他。

它可能会也可能不会帮助你,但是我相信Dojo框架AMD Loader API是与RequireJS兼容的,并且提供给你使用一个新的微内核不会污染全局命名空间。

我相信它现在只在全局名称空间中有require()define()

无论如何,他们处理这个问题的方法是做一些事情:

 require(["dojo/node!util"], function(util){ // Module available as util }); 

文档位于http://dojotoolkit.org/reference-guide/1.8/dojo/node.html

使用uRequire ,它在nodejs require和AMD define模块之间提供了一个“桥梁”,而不require重新发明轮子(它build立在两个标准之上)。 它基本上将模块从AMD或commonJS格式转换为在nodejs和浏览器上运行顺畅的其他格式或UMD 。

它也用灵活的path约定来转换依赖path,所以你可以有'../../foo'或者'bar/foo'这取决于你所处的位置。

您的AMD或UMD模块在浏览器上asynchronous加载(使用AMD / requireJs或其他AMD加载程序),并在节点上asynchronousrequire(['dep1', 'dep2'], function(dep1,dep2){...})也模拟。