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

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


当前回答

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

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

其他回答

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

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

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

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

就是这样。

在简单的行中,你可以调用自己的文件夹为module:

为此,我们需要:global和app-module-path module

这里“App-module-path”是模块,它允许你添加额外的目录到Node.js模块搜索路径 global的意思是,你附加到这个对象的任何东西b在你的应用中都是可用的。

现在看一下这个片段:

global.appBasePath = __dirname;

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

__dirname为节点当前运行目录。您可以在这里给出自己的路径来搜索模块的路径。

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

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

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

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

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

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

安装:

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')