node.js 怎么require"绝对路径"?

//文件树

/app
  ├components
  | ├login
  | |    └index.js
  | ├video
  | |    └index.js
  | └posts
  |      └index.js
  ├config
  ├containers
  | ├login
  | |    └index.js
  | ├video
  | |    └index.js
  | └posts
  |      └index.js
  └src

比如我要在containers -> login -> index.js加载components-> login -> index.js,我要这样写:

require('../../components/login');

有没有可以直接加载绝对路径的方法?类似这样:

require('/components/login');

或者其他方案?

阅读 14.2k
4 个回答

你需要明白的一件事情,你的node服务是放在服务端上的,哪里来的唯一的绝对路径(这个跟前端浏览器使用requirejs很一样),只有相对路径(相对当前服务器而言)。

不过可以结合__dirname 和 path 写一个通用的方法来取路径

在你nodejs入口文件例如 app.js 里面

global.prefixPath = path.resolve(__dirname, 'XXX')

后面使用的时候 就可以 require(global.prefixPath + 'XXX')

https://nodejs.org/dist/lates...

require() 可以用绝对路径的,可以这样:

var prefix = '/path/to/app';

require(preifx + '/components/login');

如楼上所说,不建议使用绝对路径。

这个问题我也想了很久:

  • require(ROOT_PATH + xxx)这种形式并不优雅(自行脑补一大坨require(ROOT_PATH + xxx)……对我这种DRY代码强迫症完全忍不了)
  • 那就稍微装饰一下嘛,但是这样的话do函数本身也需要require进来……
do(require, {from: ROOT_PATH})( (t)=>{
    var User = t('model/user');
    var Post = t('model/post');
});
  • 或者修改Module.require使其直接从ROOT_PATH开始找文件(npm上有好几个这样的module),这会带来潜在的问题,因为require的含义发生了改变,不利于别人阅读你的代码,工程上不能这样乱搞
  • 还有的在Module上挂接了新的func requireFromRoot,但是module闭包的args里不直接提供这个,就只能这样写module.requireFromRoot(xxx),不够简洁

因此这些都不是好的解决方案。

刚刚灵光一现,既然不能改变现有代码的含义,还需要简洁一些,那不妨为require增加新的语义,这样既不会影响现有的代码,也便于使用。

基于这个想法,我写了一个非常简单的module best-require

npm install best-require --save

示例

require(':controllers/posts');
require('~/application/apis/config');

具体用法看说明啦
https://www.npmjs.com/package...

node在执行的过程中会有一个变量和一个可以产生路径的方法:

process.cwd() 是当前执行node命令时候的文件夹地址
__dirname 是被执行的js 文件的地址

直接拼吧

require('f:/code/components/login');
require(path.resolve(process.cwd(), '../../components/login'));
// ...
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题