相对路径

相对路径

模块导入中的相对路径

在使用import导入模块时,相对路径是相对于当前文件的路径。这意味着无论代码从哪个工作目录执行,模块的相对路径都是相对于当前文件所在的目录。

例如,假设文件结构如下:

/project
  ├── app.js
  └── lib
      ├── helper.js
      └── utils.js

在 helper.js 中导入 utils.js 模块:

// lib/helper.js
import utils from './utils.js'; // 相对于 lib/helper.js 文件

在 app.js 中导入 helper.js 模块:

// app.js
import helper from './lib/helper.js'// 相对于 app.js 文件

文件操作中的相对路径

在文件操作中,如果直接使用相对路径,它是相对于当前工作目录(即程序启动时所在的目录)。

假设文件结构如下:

/project
  ├── index.js
  ├── resources
  │   ├── logo.png
  │   └── data.json
  └── src
      ├── f1.js
      ├── f2.js
      └── f3.js

相对工作目录

示例1

index.js 中读取 resources/data.json 文件:

import {fs} from "core"
let file = fs.openFile("./resources/data.json")
console.log(file.read().toString());
[vino@localhost /home/vino/project]$ vino ./index.js

上述代码中,程序的执行时的工作目录是/home/vino/project,代码中的相对路径是./resources/data.json,最终读取的文件完整路径是/home/vino/project/resources/data.json,程序执行成功。

示例2

index.js 中读取 resources/data.json 文件:

import {fs} from "core"
let file = fs.openFile("./resources/data.json")
console.log(file.read().toString());
[vino@localhost /home/vino]$ vino ./project/index.js

上述代码中,程序的执行时的工作目录是/home/vino,代码中的相对路径是./resources/data.json,最终读取的文件完整路径是/home/vino/resources/data.json,程序执行报错no such file or directory

注意事项

如果在代码中直接使用相对路径,这可能会导致一些问题,尤其是在不同的目录中运行代码时。

相对主文件目录

nodejs中提供了__dirname来获取当前模块的绝对路径,程序在读取文件时,可以将相对路径基于__dirname转换为绝对路径。

vino中并不支持获取当前模块的绝对路径,这是因为vino是编译型语言,当我们将vino代码编程成一个字节码文件后,原来源代码的所有目录都会消失。

vino中提供了一个全局对象vino,该对象中包含了属性dirname返回当前主程序所在目录的绝对路径,我们可以将代码中的相对路径以主程序目录为参考。

示例1

index.js 中读取 resources/data.json 文件:

import {fs} from "core"
let file = fs.openFile(vino.dirname+"/resources/data.json")
console.log(file.read().toString());
[vino@localhost /home/vino/project]$ vino ./index.js

上述代码中,程序的执行时主程序的路径是/home/vino/project,代码中的相对路径是./resources/data.json,最终读取的文件完整路径是/home/vino/project/resources/data.json,程序执行成功。

示例2

index.js 中读取 resources/data.json 文件:

import {fs} from "core"
let file = fs.openFile(vino.dirname+"/resources/data.json")
console.log(file.read().toString());
[vino@localhost /home/vino]$ vino ./project/index.js

上述代码中,程序的执行时主程序的路径是/home/vino/project,代码中的相对路径是./resources/data.json,最终读取的文件完整路径是/home/vino/project/resources/data.json,程序执行成功。

提示

  1. vino推荐在源代码中使用相对路径时以主程序目录为相对路径,这样可以避免工作目录变化时导致的程序执行错误。
  2. 当项目中依赖的文件可能会随时变化时,请通过config来配置文件的绝对路径

设计原理

为什么模块导入和文件操作的相对路径是不同的?

首先,vino是编译型的运行时,在执行程序时首先对源代码进行编译,然后执行字节码文件,模块的导入import是由编译器进行处理的,编译器的目标是源代码。所以,源码文件及其之间的目录结构对编译器是可见的,从而可以根据源文件之间的相对路径加载和编译源代码。

其次,文件操作是基于函数来执行,函数是由vino虚拟机(运行时)来执行,虚拟机的目标是字节码,而字节码文件只有1个,对于虚拟机来说,并不存在多个文件及其之间的相对路径了。

总结

  1. import语句是在编译期执行,其相对路径是源文件自身
  2. 所有函数调用都在运行期执行,其相对路径都是工作目录
更新时间 7/18/2024, 10:06:52 PM