我想要求我的文件总是通过我的项目的根,而不是相对于当前模块。

例如,如果查看https://github.com/visionmedia/express/blob/2820f2227de0229c5d7f28009aa432f9f3a7b5f9/examples/downloads/app.js第6行,您将看到

express = require('../../')

在我看来,这真的很糟糕。假设我想让我所有的例子都只靠近根结点一层。这是不可能的,因为我必须更新超过30个例子,并且在每个例子中更新很多次。:

express = require('../')

我的解决方案是有一个基于根的特殊情况:如果字符串以$开头,那么它相对于项目的根文件夹。

任何帮助都是感激的,谢谢

更新2

现在我使用require.js,它允许你以一种方式编写,在客户端和服务器上都可以工作。Require.js还允许你创建自定义路径。

更新3

现在我转移到webpack + gulp,我使用enhanced-require来处理服务器端模块。看这里的基本原理:http://hackhat.com/p/110/module-loader-webpack-vs-requirejs-vs-browserify/


当前回答

如果你的应用程序的入口点js文件(即你实际运行“node”的文件)在你的项目根目录下,你可以很容易地用rootpath npm模块做到这一点。只需通过

npm install --save rootpath

...然后在入口点js文件的最上面,添加:

require('rootpath')();

从那时起,所有的require调用现在都相对于项目根——例如require('../../../config/debugging/log');就要求(“配置/调试/日志”);(其中配置文件夹在项目根目录下)。

其他回答

你可以在app.js中定义这样的东西:

requireFromRoot = (function(root) {
    return function(resource) {
        return require(root+"/"+resource);
    }
})(__dirname);

然后任何时候你想从根目录中要求一些东西,无论你在哪里,你只需要使用requireFromRoot而不是普通的require。到目前为止对我来说还不错。

刚刚看到这篇文章提到了app-module-path。它允许你这样配置一个基础:

require('app-module-path').addPath(baseDir);

还有:

var myModule = require.main.require('./path/to/module');

它需要的文件,就像它被要求从主js文件,所以它工作得很好,只要你的主js文件是在你的项目的根…这一点我很感激。

这里有关于这个问题的很好的讨论。

我遇到了同样的架构问题:想要给我的应用程序更多的组织和内部名称空间,但没有:

将应用程序模块与外部依赖项混合,或者为特定于应用程序的代码使用私有NPM回购 使用相对要求,使得重构和理解更加困难 使用符号链接或更改节点路径,这可能会模糊源代码位置,并且不能很好地进行源代码控制

最后,我决定使用文件命名约定而不是目录来组织我的代码。结构应该是这样的:

npm-shrinkwrap.json package.json node_modules ... src app.js app.config.js app.models.bar.js app.models.foo.js app.web.js app.web.routes.js ...

然后在代码中:

var app_config = require('./app.config');
var app_models_foo = require('./app.models.foo');

或者只是

var config = require('./app.config');
var foo = require('./app.models.foo');

和往常一样,外部依赖项可以从node_modules中获得:

var express = require('express');

通过这种方式,所有应用程序代码都按层次结构组织成模块,相对于应用程序根,所有其他代码都可以使用。

当然,主要的缺点是在文件浏览器中,您不能展开/折叠树,就好像它实际上被组织成目录一样。但我喜欢它非常明确所有代码的来源,而且它没有使用任何“魔法”。

在我看来,实现这一点最简单的方法是在应用程序启动时在node_modules/app(或任何你称之为它的地方)创建一个指向../app的符号链接。然后你可以调用require("app/my/module")。符号链接在所有主要平台上都可用。

然而,你仍然应该把你的东西分成更小的、可维护的模块,这些模块通过npm安装。你也可以通过git-url安装你的私有模块,所以没有理由有一个单一的应用程序目录。