当前位置: 首页 > 知识库问答 >
问题:

使用Node.js中的相对路径导入ES模块

羊光辉
2023-03-14

过去,每当我想在Node.js应用程序中拥有相对路径时,我都会使用app module path。如果我通过.mjs格式使用ES模块,在某个目录路径变为相对路径时,我如何具有相同的功能

另一种方法是,我是否能够将别名分配给目录,使所有相对路径都与该别名相关,就像/是相对于当前目录的路径的别名一样。

共有2个答案

太叔马鲁
2023-03-14

更高版本,适用于ES模块。

到目前为止,我找到的最简单的方法是使用实验性特性--loader

我使用类似的东西来要求从“@config”导入{SOME_CONSTANT},或者从“@server/connection”导入{createConnection}。

加载程序代码:

import path from 'path'
import fs from 'fs'

export function resolve (specifier, parentModuleURL, defaultResolver) {
  specifier = specifier.replace(/^@/, path.resolve('.') + '/src/')
  specifier = fs.existsSync(specifier) && fs.lstatSync(specifier).isDirectory() ? `${specifier}/index` : specifier
  specifier += '.js'
  return defaultResolver(specifier, parentModuleURL)
}

然后node——实验模块——loader./moduleResolver.js./myScriptWithoutExtension

注意:如果您在最近的package.json中指定了type":"模块",则不需要使用. mjs扩展名。你可以保持无扩展。
注2:你可以用你通常放代码的地方替换src字符串,你甚至可以有一个基于process.env.NODE_ENV的分辨率。
注3:如果你给一个目录@,它将期望找到一个index.js文件

刘选
2023-03-14

通过对内置的modulemodule进行猴子补丁,可以为加载了require的CommonJS模块的某些路径提供别名。

ES模块提供了一种通过指定自定义ES模块加载器来更改模块加载行为的方法,如本相关答案中所述。

这样,根源路径(将相对加载程序位置指定)可以映射到某些别名(@是前端项目的常规):

定制加载程序.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)如何处理这段代码。

 类似资料:
  • 问题内容: 给定相对路径,如何导入Python模块? 例如,如果包含和,和包含,我怎么导入到? 这是一个视觉表示: 希望包含,但是重组文件夹层次结构不是一种选择。 问题答案: 假设你的两个目录都是真实的Python包(文件中确实有文件),那么这是一个相对于脚本位置包含模块的安全解决方案。 我假设你想这样做,因为你需要在脚本中包括一组模块。我在多个产品的生产环境中使用了此功能,并在许多特殊情况下工作

  • 问题 将代码组织成包,想用import语句从另一个包名没有硬编码过的包中导入子模块。 解决方案 使用包的相对导入,使一个模块导入同一个包的另一个模块 举个例子,假设在你的文件系统上有mypackage包,组织如下: mypackage/ __init__.py A/ __init__.py spam.py grok.py B/

  • 问题内容: 我正在python 2.7中开发自己的模块。它位于而不是或中。内部结构为: 包括课程。我遇到导入问题: 我没有将PythonPath设置为包括我的,因此,当server.http尝试包含client.PyCachedClient时,它将尝试从相对路径加载它并失败。我的问题是- 我应该如何以良好的pythonic方式设置所有路径/设置?我知道每次打开控制台并尝试运行服务器时都可以在she

  • 我有一个问题与汇总和汇总插件节点解决。 如果我有这种类型的进口: 它被转换为: 当我尝试在使用Webpack的项目中使用它时,这会破坏捆绑包,因为文件夹显然不是我的Rollup-bundled包的文件夹的子文件夹(因为npm平坦了依赖项)。 我已经将所有的定义为。 这是我的相关配置: 如何使构建保持节点模块导入保持绝对路径?我想在写的时候保存它们,这样节点。js/webpack/wathever可

  • 问题内容: 我有一个ES6模块。将其作为参数执行即可: 是模块的输出。 与此相反,REPL中的以下输入等待进一步的输入: 我不明白为什么。 与以下相同: 尝试导致: 那么,如何在Node.js REPL中导入ES模块? 问题答案: 目前这是不可能的。ES模块应该从ES模块范围导入,而REPL不被认为是其中之一。随着时间的推移,这会有所改善,因为ES模块的支持是实验性的。在Node模块实现中和的使用

  • 本文向大家介绍Linux 相对路径和绝对路径的使用,包括了Linux 相对路径和绝对路径的使用的使用技巧和注意事项,需要的朋友参考一下 01. 概述 绝对路径和相对路径在shell环境中经常遇到,各有用处。有时候相对路径比较方便,有时候绝对路径比较方便。 02. 绝对路径(Absolute Pathname) 绝对路径必定由**/**开头 绝对路径是为档案/文件的所在位置做指向 在任何时候,都可以