相对路径
相对路径
模块导入中的相对路径
在使用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
,程序执行成功。
提示
vino
推荐在源代码中使用相对路径时以主程序目录为相对路径,这样可以避免工作目录变化时导致的程序执行错误。- 当项目中依赖的文件可能会随时变化时,请通过
config
来配置文件的绝对路径
设计原理
为什么模块导入和文件操作的相对路径是不同的?
首先,vino
是编译型的运行时,在执行程序时首先对源代码进行编译,然后执行字节码文件,模块的导入import
是由编译器进行处理的,编译器的目标是源代码。所以,源码文件及其之间的目录结构对编译器是可见的,从而可以根据源文件之间的相对路径加载和编译源代码。
其次,文件操作是基于函数来执行,函数是由vino
虚拟机(运行时)来执行,虚拟机的目标是字节码,而字节码文件只有1个,对于虚拟机来说,并不存在多个文件及其之间的相对路径了。
总结
import
语句是在编译期执行,其相对路径是源文件自身- 所有函数调用都在运行期执行,其相对路径都是工作目录