【问题标题】:Import ES6 Modules with absolute paths in NodeJS without using Babel/Webpack在不使用 Babel/Webpack 的情况下在 NodeJS 中导入具有绝对路径的 ES6 模块
【发布时间】:2021-03-10 09:42:57
【问题描述】:

我有一个普通的旧 NodeJS 项目(使用 Typescript),我真的很难找出如何为本地文件执行 ES6 导入,而不必执行 "../../../foo/bar" all时间。

有很多类似的问题,但似乎都围绕着我没有使用的 babel/Webpack。

如果我执行以下操作:

import foo from `/bar`

它在我的 PC 的根文件夹(例如 c:/bar)中查找它并失败。

我尝试使用 .env 文件,并将 NODE_PATH 设置为各种铰链(“/”、“.”等),但没有成功。我也尝试在我的 package.json 中设置“type: 'module'” 并且我的 tsconfig.json 文件有 {"baseUrl": "."}

所以我想我已经尝试了所有能找到的答案。我只是在错误的组合中使用它们还是解决方案有所不同?

【问题讨论】:

  • 我一直在做"../../../foo/bar",VScode 可以帮助我。它会在我输入时显示路径建议,我这样做没有问题
  • NODE_PATH 不工作宽度 ES6 模块

标签: javascript node.js typescript node-modules es6-modules


【解决方案1】:

这是我使用的两个技巧,Node.js 和原生 ES 模块。

  1. file: 依赖关系

如果你想从下两层的子包访问<project root>/bar,请将其添加到package.json 依赖项中:

    "@local/bar": "file:../../bar",

..使bar 可用于上述子包为@local/bar

虽然相对路径仍然存在,但它们现在都在 package.json 文件中,并且源永远不需要知道..

  1. 使用动态import()

选择一个常量的根文件夹路径并执行以下操作:

const foo = await import(`${rootPath}/bar`);

【讨论】:

    【解决方案2】:

    我不确定您所说的“无需执行"../../../foo/bar" 的本地文件”是什么意思

    让我解释一下 Javascript 如何处理导入。这是一个基本的文件夹结构。

    C:Users/NAME/Project/randomfolder/bar.js
    
    
    - Project
      - Random Folder
        - foo.js
      - bar.js
    

    选项 1 对于 95% 的工作来说,这可能是更好的选择

    假设您正在尝试将 foo.js 导入 bar.js,我们首先使用 . 获取 bar.js 的当前位置,所以它会是

    import foo from "./Random Folder/foo.js"
    

    如果您采用另一种方式,. 仍用于表示获取文件夹结构中的当前位置,但您传递了第二个 . 所以 .. 然后是 / 去上一个文件夹。因此,要将 bar.js 导入 foo.js,它看起来像这样:

    import bar from "../bar.js"
    

    我们正在上一个文件夹,然后寻找我们想要的文件。

    选项 2

    但是如果你知道你的文件夹结构会非常大并且你总是会向上或向下导入几个文件夹为什么不创建一个变量然后使用字符串文字。

      let folder = `../../../`
      import test from `${folder}foo`
    

    你有几个选择来处理你想做的事情。

    选项 3 对于 NodeJS 和模块

    如果您使用 NodeJS 并且想要获取非相对路径,请使用 app-root-path 模块。它使您始终可以获取项目根目录,然后相应地深入研究文件。这可以通过字符串文字来完成。

    var appRoot = require('app-root-path');
    import foo from appRoot + "/foo/bar/folders/bla/bla"
    
    or
    
    import foo from `${appRoot}/foo/bar/folders/bla/bla` <-- string literals
    
    

    【讨论】:

    • 不幸的是,这两个选项仍然使用相对 url,这意味着如果我将文件移动到不同的文件夹,我必须更新每个导入。我需要的是能够使用我的项目的根作为起点(而不是我的硬盘驱动器的根),例如import foo from '/controllers/bar 其中控制器文件夹位于我项目的顶层。 ' 然后,无论我把我的 'bar' 文件放在文件夹结构中的什么地方,这都可以工作。
    • 由于您使用的是 NodeJS,因此您可以使用一个名为 app-root-path 的包:npmjs.com/package/app-root-path 然后您需要做的就是为 appRoot 路径声明一个变量并将其添加到那里。将更新我的回答
    • 您如何设法使模板文字与 import 一起使用?当我在 Node 14.16.1 上尝试这种语法时,我得到了 SyntaxError: Unexpected template string。插值适用于顶级 await + 动态导入语法,但我发现您的更具可读性。
    猜你喜欢
    • 2021-06-11
    • 2020-12-30
    • 1970-01-01
    • 2021-11-27
    • 2016-01-23
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2018-08-21
    相关资源
    最近更新 更多