(包清楚解疑)ES6中__dirname和__filename不见了吗?,到底怎么用

发布于:2025-03-16 ⋅ 阅读:(16) ⋅ 点赞:(0)

我们知道,在commonJs中,__dirname和__filename分别表示当前js文件所在目录路径和所在路径的绝对路径。可以直接使用,但是在ES6和Node v20.11.0之后,不能直接用了。

首先明确一下这两个变量为什么会用到:

当我们在使用Node进行读写文件的操作的时候,如果代码中使用的是相对目录(不使用这两个变量的时候),我们在用node命令运行代码的时候,会拼接node命令执行的目录和代码中的相对目录,假设我们随便找个目录(假设为E盘根目录),使用node .\nodeex\readAndWriteFile时,会拼接根目录(E)和'成绩.txt'就会出问题,如下图

只有当node命令和要执行的js文件在一个目录下,才会成功,如下图

这样很容易出错,那如果使用绝对路径呢?是没有任何问题的,但是可移植性太差了,而且会出现很长的一串路径,并且绝对路径每个文件夹连接的时候用的是'\\',非常不利于维护,如下图:

那有没有一种办法可以解决上面两种问题呢,有的,xd有的,在commonJs中,可以直接使用__dirname+相对路径的方法。

但是在ES6中,不能直接使用,需要从path中引入dirname,同时使用路径的时候最好不要直接拼接,可以使用join方法,完整代码奉上:

import { readFile, writeFile } from 'fs'
import { dirname, join } from 'path'
import { fileURLToPath } from 'url'

const __dirname = dirname(fileURLToPath(import.meta.url))
readFile(join( __dirname,'../成绩.txt'), 'utf8', (err, data ) => {
    if( err ) {
        return console.log(err.message)
    }
    const oldData = data.split(' ')
    const newData = []
    oldData.forEach( item =>{
        newData.push(item.replace('=', ':'))
    })
    writeFile(join(__dirname,'../成绩-ok.txt'), newData.join('\r\n'), 'utf8', (err) => {
        if( err) {
            return console.log(err.message)
        }
        console.log('写入成功!')
    })
})

那么__filename也是这样


网站公告

今日签到

点亮在社区的每一天
去签到