前言
Deno 是一个新型的 JavaScript 运行时,它由 Node.js 的创始人 Ryan Dahl 在 Chrome V8 引擎上重新构建而成。虽然还没有像 Node.js 那样广泛被应用于生产环境中,但是许多前端开发者已经开始借助 Deno 熟悉后端开发。在使用 Deno 进行文件系统操作时,有许多踩坑与修复的经验值得总结和分享。
踩坑
当我们在 Deno 中使用 File System API(即 Deno 标准库中的 Deno.readFile()
、Deno.writeFile()
、Deno.mkdir()
、Deno.readdir()
等方法)进行文件系统操作时,很容易遇到以下问题:
1. 没有权限访问文件系统
在 Deno 的沙箱模式下,只有明确授权访问文件系统的程序才能成功调用 File System API 进行文件操作。当我们使用 Deno.readFile()
等方法时,如果没有获取访问文件系统的权限,会出现类似于以下的错误:
signal: Uncaught PermissionDenied: read access to "/path/to/file" not allowed
此时需要添加 --allow-read=/path/to/file
参数来得到文件系统的读取权限才能执行读取操作。
2. 无法正常读写 UTF-8 编码的文件
在 Deno 中,文件的编码默认为 UTF-8,但是很多时候在读取或写入文件时会出现编码问题。例如,如果我们尝试读取一个 GB2312 编码的文本文件,就会发生乱码错误。
signal: Uncaught Error: Failed to decode file as UTF-8
这时需要使用 Deno.readTextFile()
方法,该方法将把读取内容当作 UTF-8 格式的字符串返回,从而避免了编码问题。
const text = await Deno.readTextFile("/path/to/file");
3. 文件夹路径格式问题
在 Deno 中,文件夹路径常常需要进行格式化和拼接,否则会出现路径格式错误的问题。例如在 Windows 下,需要将路径分隔符由 Linux 中的 /
替换为 Windows 中的 \\
。
const dirPath = "C:\\path\\to\\dir";
另外,需要注意,Deno.mkdir()
只能一次性创建一个目录。如果需要递归创建目录结构,需要手动拆分路径,分别创建每一级父级目录。
-- -------------------- ---- ------- ----- ------------------ - ----- ----- -------- ------------- -- - ----- --- - -------- ----- -------- - ---------------- -- --------- --- --- - ----- ---------------- - ---- - ----- --------- - ------------ ---------- ----- ------ - ------------------ - --- --- - ----- --------------------- - ----- --- - ----- ------------------------------ - ----- --------------------------- - --
4. 内存泄漏和资源未释放
在 Deno 中,无论是文件系统还是网络调用,都是异步非阻塞的,在处理大量文件操作时,注意内存泄漏和资源未释放问题。例如,下面的代码中,我们使用 Deno.readFile()
和 Deno.writefile()
方法读取并写入文件,用 for 循环多次执行该代码段,会产生不同的异步任务 ID。如果没有显式地释放内存或清理资源,将会持续占用较大内存。
for (let i = 0; i < 100000; i++) { await Deno.writeFile(`/path/to/file_${i}.txt`, await Deno.readFile(`/path/to/src_${i}.txt`)); }
修复方法
针对上述问题,我们提供以下修复方法:
1. 合理授权
在使用 File System API 前,应该考虑针对相关路径和操作,添加合适的权限,例如:
# 建议在命令行中显示全部权限,确保正确理解 deno run --allow-read=/path/to/file --allow-write=/path/to/file.js script.ts
2. 格式化路径
针对目录路径的格式化,建议使用 Deno.buildPath
API,在不同操作系统下自动适应路径分隔符,避免因为分隔符不同导致路径出错。
// 此代码能够自动适应操作系统分隔符 const dirPath = Deno.buildPath({ dir: "path/to", root: "C:" }); // 直接使用双反斜杠格式化路径(只适用于 Windows) const dirPath = "C:\\path\\to";
3. 手动释放内存
在创建大量文件对象时,建议手动释放文件对象占用的内存,例如使用Blob()
对象来进行文件的读写操作,使用完必须调用URL.revokeObjectURL(url)
来释放内存,例如:
-- -------------------- ---- ------- ----- ------ - ----- --------------------------------- ----- ---- - --- ----------- --------------- - ----- ------------ --- ----- --- - -------------------------- ----- ----------- - ----- ------------------------------------- - ------- ------ ------- --- ----- ------------------------------------------------------- ----- --------------------- -------------------------- ------ - - ------ -- ------ ------ ----- -------------------------
4. 适当扩展
Deno 内置的文件系统 API 并不能满足所有的需求,为了满足更加定制化的需求,他采用同样的模块化架构,使我们可以像 Node.js 一样,采用社区支持的模块来扩展功能。建议多利用社区开源模块扩展自己的代码库,例如:
// 文件压缩库 import unzipper from "https://deno.land/x/unzipper/mod.ts";
总结
在本文中,我们总结了使用 Deno 操作文件系统时容易遇到的踩坑及其修复方法。在实际使用中,需要综合考虑安全性、稳定性和可维护性等因素,结合正确的方法使用 API 才能避免错误和提高代码效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e394dcf6b2d6eab3f0ea58