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

例如,如果查看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/


当前回答

我尝试过很多这样的解决方案。我最终把这个添加到我的主文件的顶部(例如index.js):

process.env.NODE_PATH = __dirname;
require('module').Module._initPaths();

这将在加载脚本时将项目根添加到NODE_PATH。允许我通过引用项目根的相对路径,如var User = require('models/ User '),来要求项目中的任何文件。只要在项目中运行其他任何东西之前在项目根目录中运行一个主脚本,这个解决方案就应该有效。

其他回答

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

npm install --save rootpath

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

require('rootpath')();

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

你可以用我做的一个模块,Undot。它没有什么高级的,只是一个助手,让你可以避免那些点地狱与简单。

例子:

var undot = require('undot');
var User = undot('models/user');
var config = undot('config');
var test = undot('test/api/user/auth');

如果有人正在寻找另一种方法来解决这个问题,这里是我自己的贡献:

https://www.npmjs.com/package/use-import

基本思路:在项目的根目录中创建一个JSON文件,将文件路径映射为简写名称(或者让use-automapper为您完成)。然后您可以使用这些名称请求您的文件/模块。像这样:

var use = require('use-import');
var MyClass = use('MyClass');

就是这样。

一些答案说,最好的方法是将代码作为包添加到node_module,我同意,这可能是最好的方法,失去../../../ in require,但实际上没有一个给出这样做的方法。

从2.0.0版本开始,你可以从本地文件安装一个包,这意味着你可以在根目录下创建一个文件夹,里面有你想要的所有包,

-modules
 --foo
 --bar 
-app.js
-package.json

所以在包装上。Json,你可以添加模块(或foo和bar)作为一个包,而不需要发布或使用外部服务器,像这样:

{
  "name": "baz",
  "dependencies": {
    "bar": "file: ./modules/bar",
    "foo": "file: ./modules/foo"
  }
}

之后你执行npm install,你可以使用var foo = require("foo")访问代码,就像你对所有其他包所做的一样。

更多信息可以在这里找到:

https://docs.npmjs.com/files/package.json#local-paths

下面是如何创建一个包:

https://docs.npmjs.com/getting-started/creating-node-modules

我编写了这个小包,它允许您通过项目根的相对路径来要求包,而不引入任何全局变量或覆盖节点默认值

https://github.com/Gaafar/pkg-require

它是这样工作的

// create an instance that will find the nearest parent dir containing package.json from your __dirname
const pkgRequire = require('pkg-require')(__dirname);

// require a file relative to the your package.json directory 
const foo = pkgRequire('foo/foo')

// get the absolute path for a file
const absolutePathToFoo = pkgRequire.resolve('foo/foo')

// get the absolute path to your root directory
const packageRootPath = pkgRequire.root()