随着我们继续 Deno 2 的开发之旅,这个次要版本主要侧重于提高与 npm 和 Node.js 的兼容性,提高整体生活质量和开发人员体验,并为未来的性能增强奠定基础。
此版本中最重要的更新包括三个备受期待的功能:
除了上述功能外,还有许多其他值得一提的改进和错误修复:
deno compile
支持 npm 包
自从 v1.6, deno compile
允许您将项目编译成单个二进制可执行文件。 由于多种原因,这种发展已被证明是重要的,因为它使开发人员能够:
- 在所有主要平台上分发和执行二进制文件,无需安装 Deno 或依赖项
- 在可执行文件中包含资产以提高可移植性
- 使用单个二进制文件简化部署
- 实现更快的启动时间
从那以后,我们一直在做 deno compile
更有用,通过
添加对网络工作者和动态导入的支持,以及今天,通过支持 npm 包。
这是一个创建单个二进制可执行文件的示例 cowsay
:
$ cat main.ts
import { say } from "npm:cowsay@1.5.0";
console.log(say({ text: "Hello from Deno!" }));
$ deno compile --allow-read main.ts
$ ./main
__________________
< Hello from Deno! >
------------------
^__^
(oo)_______
(__) )/
||----w |
|| ||
cowsay
是一个简单的例子,但你可以使用 deno compile
有更复杂的项目。 咱们试试吧 vite
:
$ deno compile --allow-read --allow-write --allow-env --allow-net npm:vite
$ ./vite
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h to show help
或者可能 eslint
?
$ deno compile --allow-read --allow-write --allow-env --allow-net npm:eslint
$ cat .eslintrc.js
module.exports = {
"env": {
"es2021": true,
"node": true
},
"extends": "eslint:recommended",
"overrides": [
],
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"rules": {
}
}
$ cat foo.js
function foo() {
}
$ ./eslint
/dev/foo.js
1:10 error 'foo' is defined but never used no-unused-vars
✖ 1 problem (1 error, 0 warnings)
使用之间的区别 deno compile
创建一个 eslint
二进制和
npm install -g eslint
是 Deno 包 eslint
及其所有依赖项和配置以及实际 deno
可执行。 这意味着生成的可执行文件确保其依赖项不会被意外更改,并继续以相同的方式工作,而不会受到系统上其他依赖项的干扰。 此外,我们的测试表明二进制文件来自 deno compile
往往比使用本地缓存的依赖项执行相同的程序启动更快。
还有更多工作需要改进 deno compile
,包括最小化总二进制大小,我们打算在即将发布的版本中解决这个问题。
你有具体的反馈意见吗 deno compile
?
让我们知道.
全局支持 deno.json
和 CLI 标志
球体 现在在配置文件中支持 deno.json
, deno task
和用于指定文件的 CLI 参数。 glob 语法是跨平台的,因此您可以放心地在 Windows、macOS 和 Linux 上使用它。
在 deno.json
, 您可以使用 *
匹配路径中任意数量的字符,
?
匹配单个字符,和 **
匹配任意数量的目录:
{
"fmt": {
"include": ["data/example?.txt"],
"exclude": ["testdata/**/*.ts"]
}
}
您还可以使用 glob 模式作为 CLI 参数. 这是上面的例子,但是使用 deno fmt
:
$ deno fmt --exclude="testdata/**/*.ts" "data/example?.txt"
⚠️ 请注意,我们将 glob 放在引号中以防止 shell 扩展它。
和 deno task
,除了上面的glob语法,你还可以使用方括号来匹配一个范围的字符:
{
"task": {
"files": "echo **/*.ts",
"data": "echo data[0-9].txt"
}
}
带有 IP 地址的 TLS 证书
最想要的功能之一终于来了。 您现在可以使用包含 IP 地址的 TLS 证书。
这对于经常使用 IP 地址而不是域名的 Kubernetes pod 以及需要服务器 IP 地址以避免对名称解析的循环依赖的 HTTPS/TLS 上的 DNS 非常有用。
在 Deno v1.34 中,任何使用 TLS 的 API 都可以使用 IP 地址。 例如:
const resp = await fetch("https://1.1.1.1");
console.log(await resp.text());
配置文件改进
排除所有子命令的文件或文件夹
以前,如果您希望 Deno 忽略每个子命令的文件或文件夹,则必须重复指定它:
{
"fmt": {
"exclude": ["target/"]
},
"lint": {
"exclude": ["target/"]
},
"test": {
"exclude": ["target/"]
},
"bench": {
"exclude": ["target/"]
}
}
从此版本开始,您可以使用顶级 exclude
财产:
{
"exclude": ["target/"]
}
谢谢至 @围巾005 用于实现此功能。
nodeModulesDir
财产
A nodeModulesDir
现在可以在 deno.json
用于显式启用或禁用 Deno 使用的文件 node_modules
目录。
{
"nodeModulesDir": true
}
如果您将 Deno 与 package.json 一起使用,并且 node_modules
目录,建议启用此设置,因为它将提供更好的体验。 例如,启用它后,Deno 的语言服务器将使用本地
node_modules
用于缓存和解析包的目录。
语言服务器改进
deno 1.33 在语言服务器中引入了文档预加载,它会在初始化时预加载工作区中的模块,以便 Deno 了解它们及其内容。
在某些情况下,默认的 1000 个文件系统条目限制要么太少要么太多,因此现在可以通过设置 deno.documentPreloadLimit
财产。
{
"deno.enable": true,
"deno.documentPreloadLimit": 2000
}
此外,语言服务器的内部 TypeScript isolate 的默认最大内存限制增加到 3GB,以匹配 VS Code 默认的 TypeScript。 最后,这个限制可以通过在 VSCode 扩展中配置
deno.maxTsServerMemory
:
{
"deno.enable": true,
"deno.maxTsServerMemory": 3072
}
Deno API 更改
Deno.serve()
上个月,我们暗示我们计划稳定 Deno.serve()
应用程序接口。 然而,经过深思熟虑,我们决定将稳定期再推迟一个月,以使该 API 更加向前兼容。
的签名 Deno.serve()
已更改为返回一个实例
Deno.Server
代替 Promise
. Deno.Server
有一个 finished
那是一个财产 Promise
,它在服务器关闭时解决(使用
AbortSignal
). 这为以编程方式控制服务器提供了更大的灵活性。
const ac = new AbortController();
const server = Deno.serve(
{ signal: ac.signal },
(_req) => new Response("Hello world"),
);
setTimeout(() => {
ac.abort();
}, 1000);
await server.finished;
console.log("Server has shut down");
此外, Deno.Server
有 ref()
和 unref()
方法。 您可以使用这些方法来控制服务器是否应该让进程保持活动状态。
Deno.createHttpClient()
这个不稳定的 API 现在公开了一些选项,允许更好地控制创建的客户端:
const client = Deno.createHttpClient({
poolMaxIdlePerHost: 10,
poolIdleTimeout: 10_000,
http1: false,
http2: true,
});
const resp = await fetch("...", { client });
Deno.FileInfo
这 Deno.FileInfo
界面现在包括以下新字段:
Deno.FileInfo.isBlockDevice
Deno.FileInfo.isCharDevice
Deno.FileInfo.isFifo
Deno.FileInfo.isSocket
这些字段在 Linux 和 macOS 上可用。 在 Windows 上,它们总是 null
.
谢谢至 田川弘隆 为贡献。
改进 npm 和节点兼容性
npm 支持还有其他一些显着改进:
deno vendor
处理 npm 说明符,遇到它们时将不再出错。deno task
跑pre
和post
从类似于 npm 的 package.json 文件执行脚本时存在的脚本。 谢谢
马文·哈格迈斯特 用于实现此功能。
我们还填充了一些内置的 Node.js API:
crypto.createDiffieHellman
crypto.createDiffieHellmanGroup
http.Server.unref
Module.runMain
performance.markResourceTiming
process.release
worker_threads
此外,以下 N-API 符号现在可以正常工作:
napi_async_init
napi_async_destroy
napi_add_finalizer
V8 11.5 和 TypeScript 5.0.4
最后,Deno v1.34 附带了 V8 11.5 和 TypeScript 5.0.4。
1685019595
#deno #编译支持 #npm #包
2023-05-25 10:16:00