我想要求我的文件总是通过我的项目的根,而不是相对于当前模块。
例如,如果查看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/
一些答案说,最好的方法是将代码作为包添加到node_module,我同意,这可能是最好的方法,失去../../../ in require,但实际上没有一个给出这样做的方法。
从2.0.0版本开始,你可以从本地文件安装一个包,这意味着你可以在根目录下创建一个文件夹,里面有你想要的所有包,
-modules
--foo
--bar
-app.js
-package.json
所以在包装上。Json,你可以添加模块(或foo和bar)作为一个包,而不需要发布或使用外部服务器,像这样:
{
"name": "baz",
"dependencies": {
"bar": "file: ./modules/bar",
"foo": "file: ./modules/foo"
}
}
之后你执行npm install,你可以使用var foo = require("foo")访问代码,就像你对所有其他包所做的一样。
更多信息可以在这里找到:
https://docs.npmjs.com/files/package.json#local-paths
下面是如何创建一个包:
https://docs.npmjs.com/getting-started/creating-node-modules
另一个答案是:
想象一下这个文件夹结构:
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文件夹,然后让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