Deno 中使用文件系统 API 的踩坑与修复

阅读时长 6 分钟读完

前言

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 格式的字符串返回,从而避免了编码问题。

3. 文件夹路径格式问题

在 Deno 中,文件夹路径常常需要进行格式化和拼接,否则会出现路径格式错误的问题。例如在 Windows 下,需要将路径分隔符由 Linux 中的 / 替换为 Windows 中的 \\

const dirPath = "C:\\path\\to\\dir";

另外,需要注意,Deno.mkdir() 只能一次性创建一个目录。如果需要递归创建目录结构,需要手动拆分路径,分别创建每一级父级目录。

-- -------------------- ---- -------
----- ------------------ - ----- ----- -------- ------------- -- -
  ----- --- - --------
  ----- -------- - ----------------

  -- --------- --- --- -
    ----- ----------------
  - ---- -
    ----- --------- - ------------ ----------
    ----- ------ - ------------------ - ---

    --- -
      ----- ---------------------
    - ----- --- -
      ----- ------------------------------
    -

    ----- ---------------------------
  -
--

4. 内存泄漏和资源未释放

在 Deno 中,无论是文件系统还是网络调用,都是异步非阻塞的,在处理大量文件操作时,注意内存泄漏和资源未释放问题。例如,下面的代码中,我们使用 Deno.readFile()Deno.writefile() 方法读取并写入文件,用 for 循环多次执行该代码段,会产生不同的异步任务 ID。如果没有显式地释放内存或清理资源,将会持续占用较大内存。

修复方法

针对上述问题,我们提供以下修复方法:

1. 合理授权

在使用 File System API 前,应该考虑针对相关路径和操作,添加合适的权限,例如:

2. 格式化路径

针对目录路径的格式化,建议使用 Deno.buildPath API,在不同操作系统下自动适应路径分隔符,避免因为分隔符不同导致路径出错。

3. 手动释放内存

在创建大量文件对象时,建议手动释放文件对象占用的内存,例如使用Blob()对象来进行文件的读写操作,使用完必须调用URL.revokeObjectURL(url)来释放内存,例如:

-- -------------------- ---- -------
----- ------ - ----- ---------------------------------
----- ---- - --- ----------- --------------- - ----- ------------ ---
----- --- - --------------------------

----- ----------- - ----- ------------------------------------- - ------- ------ ------- ---
----- -------------------------------------------------------
----- --------------------- -------------------------- ------ - - ------

-- ------ ------ -----
-------------------------

4. 适当扩展

Deno 内置的文件系统 API 并不能满足所有的需求,为了满足更加定制化的需求,他采用同样的模块化架构,使我们可以像 Node.js 一样,采用社区支持的模块来扩展功能。建议多利用社区开源模块扩展自己的代码库,例如:

总结

在本文中,我们总结了使用 Deno 操作文件系统时容易遇到的踩坑及其修复方法。在实际使用中,需要综合考虑安全性、稳定性和可维护性等因素,结合正确的方法使用 API 才能避免错误和提高代码效率。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e394dcf6b2d6eab3f0ea58

纠错
反馈