如何在NodeJS中使用项目根目录路径而非相对路径导入JS文件?
在NodeJS中使用项目根目录路径导入JS文件的解决方案
问题描述
如何在NodeJS中使用项目根目录路径导入JavaScript文件?(而非相对路径)
换句话说,团队正尝试从语法风格A转换为语法风格B:
语法风格A
const source = require('../../../../../../source.js');
语法风格B
const source = require('src/source.js'); // "src"是项目根目录的直接子文件夹
查阅了大量相关内容,但没有一个能满足项目需求……
项目需求
- 需求1:不使用外部包(如Babel.js或Webpack),磁盘空间有限,且无法通过
npm install安装任何工具。 - 需求2:JavaScript文件应能使用“项目根目录”路径导入其他JS文件,而非相对路径(避免冗长的相对路径,如
../../../../../../../script.js,这类路径难以管理)。 - 需求3:在源代码中右键点击导入的类,应弹出包含“转到定义”选项的上下文菜单(可直接跳转到导入文件);在IDE中移动JS文件时应自动更新所有引用,可使用任意IDE。
- 需求4:采用统一的导入方式,使用NodeJS的
require关键字导入(而非JavaScript的import关键字)。
项目结构
以下是项目设置,package.json由WebStorm生成,未做修改。
Project_Root ├─ src │ └── a1 │ └── a2 │ └── a3 │ └── Worker.js ├── subFolder1 │ └── SubWorker.js ├─ main.js └─ package.json
代码示例
main.js
const Worker = require('./src/a1/a2/a3/Worker.js'); Worker.doWork();
Worker.js
// 如果替换为项目根目录路径,例如: // const SubWorker = require('src/subFolder1/SubWorker.js'); // 脚本会报错:"Error: Cannot find module './src/subFolder1/SubWorker.js'." const SubWorker = require('../../../subFolder1/SubWorker.js'); module.exports = class Worker { static doWork() { console.log("doing work"); SubWorker.doMoreWork(); } }
SubWorker.js
module.exports = class SubWorker { static doMoreWork() { console.log("doing more work"); } };
已尝试的方案
方案1:path.resolve
尝试了相对路径转绝对路径的方案,程序报错:Error: Cannot find module './src/subFolder1/SubWorker.js',在WebStorm 2022.3.2和VS Code 1.76.2中均可复现。
方案2:app-module-path
使用app-module-path满足了部分需求,但程序无法运行,报错:Error: Cannot find module 'src/subFolder1/SubWorker.js',在WebStorm 2022.3.2和VS Code 1.76.2中均可复现。
方案3:动态路径拼接
尝试了动态拼接根路径的方法,代码如下,但失败情况与方案1相同:
const rootPath = 'src/subFolder1'; const SubWorker = require(`${rootPath}/SubWorker.js`);
方案4:子路径导入
该方案使用import而非require,违反需求4,不符合要求。
预期结果
NodeJS作为主流后端语言,期望IDE能提供完善的导入支持,从项目根目录引用源文件应该是无需Babel.js或Webpack就能实现的简单操作,目前不清楚问题出在哪,已遵循以下标准实践:
- 使用了最新版本的主流NodeJS IDE(WebStorm 2022.3.2和VS Code 1.76.2)
- 通过WebStorm的“创建新NodeJS项目”向导创建项目
- 使用最新版本的NodeJS(v18.15.0,运行在Windows 10 v21H2系统上)
相关未解决内容
以下Stack Overflow帖子相关,但未解决本问题:
- NodeJS - Relative File Paths:失败情况与方案1相同
- Project root based relative paths for NodeJS modules:使用
import而非require,违反需求4 - is it possible to get rid of the relative paths on imports?:置顶回答使用Babel.js,违反需求1
- How to import a JavaScript file to another JavaScript file:未涉及相对路径与项目根目录路径的对比问题
- How to use absolute/dynamic paths in NodeJs:使用
import而非require,违反需求4 - how to use absolute paths instead of relative paths in React or Next.js?:未使用React或Next.js,不适用
- JavaScript Import file by absolute path:使用
import而非require,违反需求4 - javascript file with absolute file path:讨论的是客户端浏览器脚本,本问题是服务器端NodeJS脚本
内容的提问来源于stack exchange,提问作者howard_9
相关产品推荐
相关产品推荐

