node.js - 在带有 ES 模块的 Node.js 中使用相对路径导入

标签 node.js es6-modules mjs

过去,每当我想在 Node.js 应用程序中使用相对路径时,我都会使用 app-module-path。如果我通过 .mjs 格式使用 ES 模块,如何在特定目录路径变为相对路径的情况下获得相同的功能?

以另一种方式,我是否能够为目录分配一个别名,以便所有相对路径都相对于该别名,就像 ./ 是相对于路径的别名一样当前目录。

最佳答案

可以通过猴子修补内置 module 模块,为使用 require 加载的 CommonJS 模块的某些路径提供别名。

ES 模块提供了一种通过指定 custom ES module loader 来更改模块加载行为的方法,如 this related answer 中所述.

这样根源路径(将相对于加载器位置指定)可以映射到某些别名( @ is conventional 对于前端项目):

custom-loader.mjs

import path from 'path';

const ROOT_PATH = new URL(path.dirname(import.meta.url) + '/src').pathname;

export function resolve(specifier, parentModuleURL, defaultResolver) {
    specifier = specifier.replace(/^@/, ROOT_PATH);
    return defaultResolver(specifier, parentModuleURL);
}

其用法如下:

node --experimental-modules --loader ./custom-loader.mjs ./app.mjs

请注意,这提供了一种对于 ES 模块来说并不自然的行为,这可能会影响 IDE 等其他工具处理此代码的方式。

关于node.js - 在带有 ES 模块的 Node.js 中使用相对路径导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51452743/

相关文章:

javascript - 如何在 JavaScript 中为默认导入设置别名?

javascript - 无法在 Node.js ES6 中使用 eval 创建变量

angularjs - 有没有事件表明上传的文件是用CollectionFS写的?

node.js - 在 nodejs 服务器中处理绝对 url

node.js - 如何从 Node.js 连接到 SockJS 服务器?

javascript - 有条件导入: import if exists

node.js - 我应该在 Node 服务器上的哪里存储 secret 字符串?

node.js - ES6 类函数中导入模块

node.js - 如何使用nodemon运行ECMAScript(mjs文件)?