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