

Deno 2.0引入Node.js的process全域变量并移除window全域变量,提升与Node.js程序的兼容性。相依管理功能添加前缀规范,以及子命令deno add和deno remove简化套件管理流程
Deno 2.0的开发已接近完成,进入候选版本的阶段。在Deno 2.0版本中,将有两大重要变更,第一是全域变量的改变,第二则是相依性管理的更新。当初Deno的出现,以改进Node.js的不足为主打,但是从这次全域变量的政策调整来看,Deno似乎从过去试图走出独特路线,转向更务实的妥协,逐渐回归与Node.js更相近的设计。
在Deno 2.0中,全域变量有两项重大变更,第一是移除window全域变量,第二则是引入Node.js的process全域变量。Deno从1.0版本就引入window全域变量,目的是希望Deno能够尽可能和浏览器兼容,但是没想到window却成为许多开发者的问题来源。window是浏览器环境中的全域对象,代表浏览器的全域范围,因此当前端JavaScript代码在浏览器中运行时,window可以正常运作,但是于服务器端环境却不适用。
Deno是一个服务器端的JavaScript运行环境,因此Deno中的window全域变量,常让开发者误以为在操作浏览器环境,window包含大量在浏览器中才具意义的API,因此当开发者不小心在Deno中使用,则会引发错误。有鉴于此,Deno 1.40开始便建议开发者不要使用window,改用globalThis或是self,而在Deno 2.0则会移除window全域变量。globalThis是ECMAScript标准中的统一全域对象,因此可在浏览器、Node.js和Deno中使用。
Deno 2.0的另一项全域变量改变,是引入Node.js重要全域对象process。process提供存取系统信息、环境变量、命令行参数等功能。原本在Deno中的设计,要求开发者使用process必须显式导入node:process,但对于仰赖process作为全域变量的Node.js程序和框架来说,这项要求带来额外的负担。
现在Deno为了兼容性需求,让更多应用程序可以轻松无缝移植到Deno,因此在Deno 2.0中引入process全域变量。不过官方仍建议开发者尽量使用显式导入方法,因此也添加一条新的lint规则,在编辑器中提示并且协助开发者快速进行修正。
Deno 2.0相依项目管理方面,添加了jsr:和npm:前缀以区分不同来源的套件,避免名称冲突。另外,Deno支持子路径规范,解决过去无法解析包含/子路径的问题。deno add与deno remove子命令的加入,简化了相依项目的添加和移除过程。而且当项目包含package.json,Deno则会优先将NPM相依项目添加到该文件,支持开发和生产相依项目分离管理。