Replacements for fs-extra
fs and fs/promises (native, Node.js)
Modern Node.js includes built-in fs and fs/promises APIs that cover what fs-extra historically provided.
js
import fsExtra from 'fs-extra'
import * as fs from 'node:fs'
import * as fsPromises from 'node:fs/promises'copy
js
await fsExtra.copy(src, dest)
await fsPromises.cp(src, dest, { recursive: true }) NOTE
If src is a file and dest is an existing directory, fs-extra throws; fs.cp copies into the directory.
copySync
js
fsExtra.copySync(src, dest)
fs.cpSync(src, dest, { recursive: true }) remove
js
await fsExtra.remove(path)
await fsPromises.rm(path, { recursive: true, force: true }) IMPORTANT
Remember to set { recursive: true, force: true } to match the behavior of fs-extra.
js
fsExtra.removeSync(path)
fs.rmSync(path, { recursive: true, force: true }) mkdirs / mkdirp / ensureDir
js
await fsExtra.mkdirs(dir)
await fsPromises.mkdir(dir, { recursive: true }) mkdirsSync / mkdirpSync / ensureDirSync
js
fsExtra.mkdirsSync(dir)
fs.mkdirSync(dir, { recursive: true }) pathExists
js
await fsExtra.pathExists(path)
await fsPromises.access(path).then(() => true, () => false) pathExistsSync
js
fsExtra.pathExistsSync(path)
fs.existsSync(path) outputFile
js
await fsExtra.outputFile(file, data)
await fsPromises.mkdir(path.dirname(file), { recursive: true })
await fsPromises.writeFile(file, data) outputFileSync
js
fsExtra.outputFileSync(file, data)
fs.mkdirSync(path.dirname(file), { recursive: true })
fs.writeFileSync(file, data) readJson
js
await fsExtra.readJson(file)
await fsPromises.readFile(file, 'utf8').then(JSON.parse) writeJson / outputJson
js
await fsExtra.writeJson(file, obj)
await fsPromises.mkdir(path.dirname(file), { recursive: true })
await fsPromises.writeFile(file, JSON.stringify(obj, null, 2)) ensureFile / createFile
js
await fsExtra.ensureFile(file)
await fsPromises.mkdir(path.dirname(file), { recursive: true })
await fsPromises.access(file).catch(() => fsPromises.writeFile(file, '')) ensureFileSync / createFileSync
js
fsExtra.ensureFileSync(file)
fs.mkdirSync(path.dirname(file), { recursive: true })
fs.writeFileSync(file, '') ensureLink / createLink
js
await fsExtra.ensureLink(src, dest)
await fsPromises.mkdir(path.dirname(dest), { recursive: true })
await fsPromises.link(src, dest) ensureLinkSync / createLinkSync
js
fsExtra.ensureLinkSync(src, dest)
fs.mkdirSync(path.dirname(dest), { recursive: true })
fs.linkSync(src, dest) ensureSymlink / createSymlink
js
await fsExtra.ensureSymlink(src, dest)
await fsPromises.mkdir(path.dirname(dest), { recursive: true })
await fsPromises.symlink(src, dest) ensureSymlinkSync / createSymlinkSync
js
fsExtra.ensureSymlinkSync(src, dest)
fs.mkdirSync(path.dirname(dest), { recursive: true })
fs.symlinkSync(src, dest) emptyDir / emptydir
js
await fsExtra.emptyDir(dir)
await fsPromises.rm(dir, { recursive: true, force: true })
await fsPromises.mkdir(dir, { recursive: true }) move
js
await fsExtra.move(src, dest)
await fsPromises.rename(src, dest) NOTE
Does not work cross-device; add cp + rm fallback.
For example:
js
try {
await fsPromises.rename(src, dest)
} catch (err) {
if (err.code === 'EXDEV') {
await fsPromises.cp(src, dest, { recursive: true })
await fsPromises.rm(src, { recursive: true, force: true })
} else {
throw err
}
}