Node.js require() 与 RequireJS?

Posted

技术标签:

【中文标题】Node.js require() 与 RequireJS?【英文标题】:Node.js require() vs RequireJS? 【发布时间】:2012-02-15 10:55:08 【问题描述】:

你好 RequireJS 我可以设置一个像这样的基本路径:base : './app/' 例如,当我在 ./app/foo/bar/ 并且我有一个使用 require('foo'); 的脚本时,RequireJS 然后会搜索 ./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 的 node 的 require 方法中看到的另一个缺少的功能是设置路径映射的能力,如果我在 RequireJS 中有一个名为 ./app/super-sized-directory-name/ 的目录,我可以简单地做 'big-dir' : 'super-sized-directory-name' 然后我可以简单地使用 @987654337 @ 使用 Node.js 的 require 方法,据我所知这是不可能的……

【问题讨论】:

modul8 通过域支持此功能,但语法不符合节点。我相信 browserify 只支持相对文件路径 @Raynos 你好!感谢您的回复!我更改了问题以使我的观点更清楚,我将首先看一下 modul8,它似乎比 browserify 更复杂,我在 browserify 中喜欢的是它可以即时编译脚本并接受咖啡,这非常酷 @Raynos 我再次检查了 modul8 并更仔细地阅读了它的文档我相信它非常酷,也许是我正在寻找的!我现在会测试它:) modul8 处理咖啡。至于即时编译,构建一个小的watch script 如果即时你的意思是中间件,不要那样做。预编译和静态服务。 如果 npm 安装正确,require('backbone') 应该可以工作。如果没有为 modul8 提出 github 问题。 【参考方案1】:
--alias, -a    Register an alias with a colon separator: "to:from"
             Example: --alias 'jquery:jquery-browserify'   

你可以用 browserify 注册别名,这样就可以覆盖你的重命名。

至于你的根绝对路径,那真的做不到。如前所述,modul8 有一个命名空间机制来解决这个问题。

我建议你在 freenode 上的 #stackvm 中 pong SubStack 并直接问他。

【讨论】:

browserify 或 modul8 是否异步工作?如果不是,在我看来,requirejs 至少仍然是浏览器中使用的模块的权利。 @Bruiser 它们异步工作,这意味着它们不会阻塞。它们通过预加载所有模块来工作 谢谢,所以你更喜欢在 node 项目中使用 browserify 而不是 requirejs?【参考方案2】:

它可能对您有所帮助,也可能无济于事,但我相信 Dojo Frameworks 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

【讨论】:

【参考方案3】:

使用uRequire,它提供了nodejs require 和AMD define 模块之间的“桥梁”,无需重新发明***(它建立在两个标准之上)。它基本上将模块从 AMD 或 commonJS 格式转换为其他格式或UMD,在 nodejs 和浏览器上都可以顺利运行。

它还使用flexible path conventions 转换依赖路径,因此您可以使用'../../foo''bar/foo',具体取决于您所处的位置更有意义。

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

【讨论】:

以上是关于Node.js require() 与 RequireJS?的主要内容,如果未能解决你的问题,请参考以下文章

静态文件,带有 Node.js 和 Express 的样式表

Node.js require() 与 RequireJS?

Node.js 加密与 Google Apps 脚本 (GAS) 中的 HMAC

Mailchimp 和 Node.js 与 typescript noob 问题:Import vs Require

有没有办法取消 node.js 对 require 模块的缓存

将 `require()` 与 `node --eval` 一起使用