我想要求我的文件总是通过我的项目的根,而不是相对于当前模块。
例如,如果查看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/
只是想继续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将不再看到符号链接。
另一个答案是:
想象一下这个文件夹结构:
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从node_module目录加载的方式。
如果有人试图加载“thing”模块,他会做如下的事情
require('thing');
Node将在'node_module'目录中查找'thing'目录。
由于node_module通常位于项目的根,所以我们可以利用这种一致性。(如果node_module不在根节点上,那么您就会遇到其他令人头痛的问题。)
如果我们进入目录,然后从目录中返回,我们可以获得到节点项目根的一致路径。
require('thing/../../');
如果我们想访问/happy目录,我们会这样做。
require('thing/../../happy');
虽然这有点粗糙,但是我觉得如果node_modules加载的功能发生了变化,将会有更大的问题需要处理。这种行为应该保持一致。
为了使事情更清楚,我这样做,因为模块的名称并不重要。
require('root/../../happy');
我最近在angular2中使用了它。我想从根目录加载服务。
import {MyService} from 'root/../../app/services/http/my.service';