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

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


当前回答

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

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

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

全球。Dir = process.cwd();

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

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

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

其他回答

我认为你不需要用你描述的方式来解决这个问题。如果您想在大量文件中更改相同的字符串,请使用sed。在你的例子中,

find . -name "*.js" -exec sed -i 's/\.\.\/\.\.\//\.\.\//g' {} +

/../变成了../

或者,您可以要求配置文件存储包含库路径的变量。如果您将以下文件存储为config.js在示例目录中

var config = {};
config.path = '../../';

在你的例子文件中

myConfiguration = require('./config');
express = require(config.path);

您将能够从一个文件控制每个示例的配置。

这只是个人喜好。

另一个答案是:

想象一下这个文件夹结构:

node_modules lodash src 子目录 foo.js bar.js main.js 测试 . js

然后在test.js中,你需要这样的文件:

const foo = require("../src/subdir/foo");
const bar = require("../src/subdir/bar");
const main = require("../src/main");
const _ = require("lodash");

在main.js中:

const foo = require("./subdir/foo");
const bar = require("./subdir/bar");
const _ = require("lodash");

现在你可以使用。babelrc文件中的babel和babel插件模块解析器来配置两个根文件夹:

{
    "plugins": [
        ["module-resolver", {
            "root": ["./src", "./src/subdir"]
        }]
    ]
}

现在你可以在测试和src中以同样的方式要求文件:

const foo = require("foo");
const bar = require("bar");
const main = require("main");
const _ = require("lodash");

如果你想使用es6模块语法:

{
    "plugins": [
        ["module-resolver", {
            "root": ["./src", "./src/subdir"]
        }],
        "transform-es2015-modules-commonjs"
    ]
}

然后像这样在测试和SRC中导入文件:

import foo from "foo"
import bar from "bar"
import _ from "lodash"

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

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

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

例子:

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

我喜欢为共享代码创建一个新的node_modules文件夹,然后让node和require做它最擅长的事情。

例如:

- node_modules // => these are loaded from your package.json
- app
  - node_modules // => add node-style modules
    - helper.js
  - models
    - user
    - car
- package.json
- .gitignore

例如,如果你在car/index.js中,你可以require('helper'), node会找到它!

node_modules如何工作

Node有一个在竞争对手中独一无二的解决模块的聪明算法 平台。

如果你从/beep/boop/bar.js中require('./foo.js'), node会在/beep/boop/foo.js中寻找。/foo.js。以./或..开头的路径/对于调用require()的文件总是本地的。

然而,如果你需要一个非相对名称,例如require('xyz')来自/beep/boop/foo.js, node会按顺序搜索这些路径,在第一次匹配时停止,如果没有找到就会引发错误:

/beep/boop/node_modules/xyz
/beep/node_modules/xyz
/node_modules/xyz

对于每个存在的xyz目录,node将首先查找一个xyz/包。查看是否存在一个“main”字段。“main”字段定义了如果你需要()目录路径,哪个文件应该负责。

例如,如果/beep/node_modules/xyz是第一个匹配,那么/beep/node_modules/xyz/package。json有:

{
  "name": "xyz",
  "version": "1.2.3",
  "main": "lib/abc.js"
}

然后从/beep/node_modules/xyz/lib/abc.js中导出的文件将被返回 要求(“xyz”)。

如果没有包裹。Json或没有“main”字段,index.js是假设的:

/beep/node_modules/xyz/index.js