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

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


当前回答

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

安装:

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

其他回答

恕我直言,最简单的方法是将自己的函数定义为GLOBAL对象的一部分。 在项目的根目录下创建projRequire.js,包含以下内容:

var projectDir = __dirname;

module.exports = GLOBAL.projRequire = function(module) {
  return require(projectDir + module);
}

在你的主文件中,在需要任何特定于项目的模块之前:

// init projRequire
require('./projRequire');

之后,以下工作对我来说:

// main file
projRequire('/lib/lol');

// index.js at projectDir/lib/lol/index.js
console.log('Ok');

@Totty,我想出了另一个解决方案,可以解决你在评论中描述的情况。描述将是tl;dr,所以我最好展示我的测试项目的结构的图片。

大局

这看起来“真的很糟糕”,但要给它时间。事实上,它真的很好。显式的require()提供了完全的透明性和易于理解,就像项目生命周期中的一股新鲜空气。

可以这样想:你正在阅读一个例子,尝试Node.js,你认为它“在我看来真的很糟糕”。你在质疑Node.js社区的领导者,他们比任何人都花了更多的时间来编写和维护Node.js应用程序。作者犯这样一个新手错误的可能性有多大?(我同意,从我的Ruby和Python背景来看,乍一看这像是一场灾难。)

围绕Node.js有很多炒作和反炒作。但是当尘埃落定后,我们将承认显式模块和“本地优先”包是采用的主要驱动力。

一般情况

当然,首先搜索当前目录中的node_modules,然后是父目录、祖父目录、曾祖父目录等等。所以您已经安装的包已经以这种方式工作了。通常你可以从项目中的任何地方要求(“express”),它工作得很好。

如果您发现自己正在从项目的根目录加载公共文件(可能是因为它们是公共实用程序函数),那么这就是一个很大的线索,说明是时候创建包了。包非常简单:将文件移动到node_modules/,并放入package.json 在那里。瞧!整个项目都可以访问该名称空间中的所有内容。包是将代码放入全局名称空间的正确方法。

其他解决方法

我个人不使用这些技巧,但它们确实回答了你的问题,当然你比我更了解自己的情况。

您可以将$NODE_PATH设置为项目根目录。当您需要()时,将搜索该目录。

接下来,您可以折衷一下,从所有示例中要求一个通用的本地文件。该通用文件只是重新导出祖父目录中的真实文件。

Examples /downloads/app.js(以及其他类似的文件)

var express = require('./express')

/下载/ express.js例子

module.exports = require('../../')

现在当你重新定位这些文件时,最坏的情况是修复一个垫片模块。

这是我六个多月来的实际做法。我在项目中使用一个名为node_modules的文件夹作为我的根文件夹,这样它将始终从我调用绝对require的任何地方查找该文件夹:

node_modules myProject index.js我可以require("myProject/someFolder/hey.js")而不是require("./someFolder/hey.js") 包含hey.js的someFolder

当你被嵌套到文件夹中时,这更有用,如果以绝对方式设置,更改文件位置的工作要少得多。我在整个应用程序中只使用了2个相对要求。

这里已经有很多好答案了。这只是说明这是一个普遍的问题,没有明确的最佳解决方案。当然最好是在Node.js中提供本地支持。以下是我目前使用的:

const r  = p => require (process.cwd() + p);
let see  = r ('/Subs/SubA/someFile.js' );
let see2 = r ('/Subs/SubB/someFile2.js');
...

我喜欢这个解决方案,因为require部分变得更短,不需要键入'require'很多次。绝对路径的主要好处是,您可以将它们从一个文件复制到另一个文件,而不必像使用相对路径那样对它们进行调整。因此,复制额外的一行箭头函数'r()'也不会有太多额外的工作。为了完成这个非常简单的任务,不需要导入额外的npm依赖项。

只是想继续Paolo Moretti和Browserify的精彩回答。如果你正在使用一个编译器(例如babel, typescript),并且你有单独的文件夹存放源代码和编译过的代码,比如src/和dist/,你可以使用不同的解决方案

node_modules

目录结构如下:

app
  node_modules
    ... // normal npm dependencies for app
  src
    node_modules
      app
        ... // source code
  dist
    node_modules
      app
        ... // transpiled code

然后你可以让Babel等编译SRC目录到dist目录。

符号链接

使用符号链接,我们可以摆脱一些嵌套级别:

app
  node_modules
    ... // normal npm dependencies for app
  src
    node_modules
      app // symlinks to '..'
    ... // source code
  dist
    node_modules
      app // symlinks to '..'
    ... // transpiled code

关于babel——copy-files的警告:babel的——copy-files标志不能很好地处理符号链接。它可能会一直导航到…符号链接和隐性看到无尽的文件。一种变通方法是使用以下目录结构:

app
  node_modules
    app // symlink to '../src'
    ... // normal npm dependencies for app
  src
    ... // source code
  dist
    node_modules
      app // symlinks to '..'
    ... // transpiled code

通过这种方式,src下的代码仍然会有app解析到src,而babel将不再看到符号链接。