如何在Node.js中使用路径别名?

25

假设我有以下代码:

var mod1 = require('../../../../ok/mod1');
var mod2 = require('../../../info/mod2');

这段代码不太简洁易读,我想知道是否有一种方法可以像Node.js中的webpack-resolve-root一样配置根解析器?

据我所知,NODE_PATH可以用来替换node_modules的根目录,但这不是我想要的。我希望能够按顺序解析多个文件夹。

3个回答

39

2021年更新答案。

Node.js子路径导入已添加至:v14.6.0,v12.19.0。

这使您可以将以下内容添加到package.json中。

"imports": {
  "#ok/*": "./some-path/ok/*"
  "#info/*": "./some-other-path/info/*"
},

并且在你的 .js 中

import mod1 from '#ok/mod1';
import mod2 from '#info/mod2';

它也可以与const mod = require('')一起使用。 - Expenzor
1
有没有办法让这个工作在节点根目录之外的外部文件夹上?例如:一个服务器和共享文件夹,其中服务器是一个具有子路径导入定义为共享文件夹的包。希望这个能够工作: "#shared/*": "../shared/src/*" - Oli414
3
这适用于TypeScript,但您确实需要使用“#”而不是“@”。tsconfig.json: "paths": { "#pkg2/*": ["./pkg2/*"] }, package.json: "imports": { "#pkg2/*": "./pkg2/*" } - Corey Alix
Node.js 16 版本有这个吗?只有 v14.6.0、v12.19.0。 - May'Habit
1
@May'Habit 是的,16有这个。 - Davey
显示剩余5条评论

15

有一个名为 module-alias 的npm包,可能可以实现您所需的功能。


1
使用此软件包是否仍然可以保留路径智能感知功能?(https://dev59.com/67Dla4cB1Zd3GeqP7F0b) - Florian Ludewig
2
请注意,该软件包存在一些问题。它会清除您的整个代码库。显然,这只会发生在少数用户身上。对于数据丢失问题目前还没有解决方案。在使用此模块之前,请确保提交所有更改。 - Ashwin R
"imports" 是正确的方法,请查看较新的答案。 - Corey Alix

-6
最好的方法是使用一个全局(配置)容器来处理这个问题。 在大多数情况下,您的应用程序将有一个配置文件。在此配置文件中,您可以添加一个属性,该属性将是包含所有文件/文件夹的绝对路径的对象。 由于配置文件在应用程序启动时使用,因此只需执行以下操作即可:
var config = require("./config.js");
//config = {... , path: {"someModule": "/absolute/path/to", "someModule2": "/absolute/path/to"...}}
global.CONFIG_CONTAINER = config

在您的应用程序中稍后,只需使用以下代码:

var myModule = require(CONFIG_CONTAINER.path.someModule)
// + concat if you are looking for a file

如果您有一些复杂的路径,并且需要一个更动态的系统,您可以在配置文件中实现一个函数来为您构建路径。(config.makePath = function(){...}) 这应该就是它的全部内容。

我不能使用这种方式。我是前端开发人员,使用webpack作为devtool编译用commonjs编写的源代码。 当我想编写单元测试时,我发现模块无法正确加载,因为我在require中使用的路径是由webpack-resolve-root解析的。 - Howard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接