Mac环境下Node.js require路径疑问:/Public与./为何表现不同?
为什么
require('/Public/todoController')无法正常工作? 这个问题其实是Node.js模块加载机制里一个非常容易踩的坑,我来给你讲明白其中的门道:
首先得搞清楚Node.js里require路径的两种核心类型:
- 相对路径(以
.或..开头):比如你用的require('./todoController'),这种路径的解析基准是当前执行脚本所在的目录(也就是你的app.js所在的Public文件夹),所以它会正确找到同目录下的todoController.js,完全没问题。 - 绝对路径(以
/开头):而require('/Public/todoController')里的/,指的是你的Mac系统的根目录(就是Finder里的“Macintosh HD”根目录),而不是你项目的根目录!也就是说Node.js会去/Public/todoController.js这个位置找文件,但你的文件其实在你的项目根目录/Public/todoController.js,这俩根本不是同一个地方,自然就找不到文件了。
如果想基于项目根目录来加载模块,你可以试试这些办法:
- 用
__dirname或者process.cwd()来拼接路径,比如require(path.join(process.cwd(), 'Public/todoController'))(记得先const path = require('path')) - 可以设置
NODE_PATH环境变量指向你的项目根目录,这样Node.js会在这个路径下查找模块 - 或者使用第三方包(比如
app-root-path)来方便地获取项目根路径
内容的提问来源于stack exchange,提问作者Mike Kim
相关产品推荐
相关产品推荐

