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

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


当前回答

同样的问题我遇到过很多次。这可以通过使用basetag npm包来解决。它本身不一定是必需的,只是在node_modules中创建到基本路径的符号链接时安装。

const localFile = require('$/local/file')
// instead of
const localFile = require('../../local/file')

使用$/…Prefix将始终引用相对于应用程序根目录的文件。

来源:我如何创建basetag来解决这个问题

其他回答

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

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

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

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

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

我正在寻找完全相同的简单性,要求文件从任何级别,我发现模块-别名。

安装:

npm i --save module-alias

打开你的包裹。Json文件,在这里你可以为你的路径添加别名,例如。

"_moduleAliases": {
 "@root"      : ".", // Application's root
 "@deep"      : "src/some/very/deep/directory/or/file",
 "@my_module" : "lib/some-file.js",
 "something"  : "src/foo", // Or without @. Actually, it could be any string
}

使用你的别名只需:

require('module-alias/register')
const deep = require('@deep')
const module = require('something')

感谢所有发帖的人,这篇帖子给我指明了正确的方向。由于提出的解决方案没有一个像我想要的那样简洁,我想在这里分享我的解决方案。

我一直在寻找一种解决方案,不“需要”任何额外的东西,没有模块,没有包。Json mod,没有环境变量,没有外部依赖,最小的CPU周期…

...所以我想到了这个:

全球。Dir = process.cwd();

我在应用程序加载时这样做一次。显然,您可以通过添加子目录和/或添加'/..,它将根据需要将您发送到目录树的上下。

在所有文件中,所有my include都是这样的格式:

找生气。(你,兄弟,妙/妙以致)

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

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

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