网站首页 > 基础教程 正文
大家好,我是Echa。
好消息,2023年1月26号 Deno 官方正式发布了v1.30版 ,距离上一个版本v1.29版本(2022年12月14号),短短只有46天。这惊人的更新迭代快中求稳的速度,Deno团队们春节都在没日没夜的敲代码,完善Deno底层框架业务逻辑,小编在这里竖起大拇指点32个赞。
Deno
官方网址:https://deno.land/
在线演示:https://deno.land/manual@v1.30.0/examples/hello_world
Github:https://github.com/denoland/deno
Deno 是一个简单、先进且安全的 JavaScript 和 TypeScript 运行时环境,其基于 V8 引擎并采用 Rust 编程语言构建。
- 默认安全设置。除非 显式开启,否则不能访问文件、网络,也不能访问运行环境。
- 天生支持 TypeScript。
- 只有一个唯一的可执行文件。
- 自带实用工具,例如依赖检查器 (deno info) 和代码格式化工具 (deno fmt)。
- 有一套经过审核(审计)的标准模块, 确保与 Deno 兼容: deno.land/std
- 有大量的 企业对使用 Deno 感兴趣
如下图:
2020 年 5 月 14 日,可能是前端开发史上里程碑式的一天,因为一个名为 Deno 的库 v1.0 版本正式发布了。
小编清楚的记得,第一次网上刷到Deno 会颠覆 Nodejs大标题,自己的手受大脑控制,点进去看了看,好奇问自己 Deno 是个什么玩意?
文章说这可能是一个颠覆 Node.js (后文简称 Node)的库,能颠覆整个前端开发生态的库。
Deno vs Node如下图:
这么吊吗?这是谁开发的?这个库到底有啥用?小编带着很多疑问继续往下看。
其实 Deno 就是 Node 的爸爸 Ryan Dahl 主导开发的,主要原因是他觉得最早在开发 Node有很多设计不好的地方,于是....
Node.js 之父又是谁?
没错!就是这个叫 Ryan Dahl 的男人在 2009 年创造了 Node。你看,其实也不是说大神就都没头发,这位大神毛发不是挺旺盛的嘛!不过既然是在 2009 年缔造的 Node,那么就不得不吐槽那时候的 JavaScript 了。在 2009 年的 JavaScript 啥样大家都知道,ES5.0(不成熟的ES5)在 09 年年底才刚刚发布,而 ES 5.1(咱们现在用的ES5)在 2011 年 6 月才开始发布并成为 ISO 国际标准。
想象一下即使现在有了 ES6 - ES20212这么新的版本,JavaScript 依然经常被大家拿来吐槽,更别提那个ES5都没普及的年代了。在那时候既没有合适的异步方式也没有模块化,也没有什么包管理啥的。那么这样的JS写大型项目或服务端项目简直就是一场灾难,于是乎就产生了各种模块化方案(Node采用了 CommonJS),也有了 npm、node_modules 等各种历史遗留问题。一方面是当年的 Ryan Dahl 技术没有现在好,思想也没有现在这么全面、另一方面当年的 JavaScript 本来就很坑,用它创造出来的东西肯定不会很完美的。
但是如今的 JavaScript 生态越来越发展壮大,虽然现在还是很坑,不过比起以前的 JavaScript 来说简直强百倍。不仅有了自己的模块化,还有了Promise、Proxy、Bigint、块级作用域等一系列非常实用的特性、而且还有更好的 TypeScript 来为 JavaScript 负重前行。而 Node 的历史包袱实在太重,即使想支持一下标准的模块化都不得不把 .js 变成 .mjs 以保持兼容。
细心的粉丝朋友们可能会发现 deno 这四个字母就是 node 的四个字母两两颠倒了一下:
- de + no = Deno 和 no + de = Node
- 颠倒 Node 字母的寓意是要颠覆Node吗?
- 其实也差不多,它的意思是:Destroy Node (毁灭Node!)
- 看来 Ryan Dahl 对他的Deno很有信心,我是希望它能真的干掉 Node 的,因为它的优点实在是太过于突出啦!
好了,这Deno由来的话题,小编不扯远了。扯远了一个晚上都聊不完。言归正传,先简单回顾一下Deno 最近前面v1.29版本和v1.28版本内容,具体如下:
Deno v1.28 正式版可稳定兼容NPM组件,这是一个重要的功能更新,因为这代表Deno开发者将可以使用超过130万个NPM组件,使用熟悉的持久资料模块,像是Prisma、Mongoose和MySQL,甚至是前端框架React、Vue来构建应用程序。
由于Deno是为了解决Node.js技术债,由Node.js之父Ryan Dahl重新创建的JavaScript、TypeScript执行环境,因此社群在两者的兼容性上存在一些意见分歧,但是开发者仍希望可以有一个简单的方法,能够方便地使用NPM组件。
Deno v1.29发布,支持自定义registry、提升质量:
- 改进 npm 兼容性
- REPL 变更
- 改进项目质量
- DenoAPIs 变更
- 将附带的 TypeScript 升级到 4.9
- 标准库模块变更
接下来小编详细介绍一下Deno v1.30发布内容:
- 对内置 Node.js 模块的支持
- Node/npm 和 LSP 的修复
- 对 Deno API 的改变
- 移除内部私有API Deno.core
对内置 Node.js 模块的支持
在 Deno 中,npm 包已经可以通过 Deno 的 Node.js 兼容层访问内置的 Node.js 模块,如 fs、path、process 等等。
在这个版本中,这些模块通过 node: specifiers 暴露给 Deno 代码:
import { readFileSync } from "node:fs";
console.log(readFileSync("deno.json", { encoding: "utf8" }));
如果你同时使用 Deno 和 Node.js 的代码,node: 方案将在两个运行时中工作。
deno.json成为一个导入映射
这个版本带来了对配置文件的重大更新,现在可以直接使用 deno.json 文件作为导入映射。
在以前的版本中,可以通过指定 importMap 键和导入映射文件的路径来告诉 Deno 去哪里寻找导入映射文件。
许多用户发现它很有用,但是这种方法意味着有两个配置文件。为了更简洁,你现在可以在你的配置文件中指定 imports 和 scopes 键,Deno 将自动开始把配置文件当作导入映射。
Node/npm 和 LSP 的修复
这个版本包括超过 25 个与 npm 功能和 Node-API 相关的错误修复。此外,LSP 继续得到改进,有超过 10 个 bug 修复。
对DenoAPI 的改变
对稳定 API 的改变:
- Deno.permissions APIs 获得了同步对应部分
Deno.permissions.querySync({ name: "read", path: "./log.txt" }) 。
Deno.permissions.revokeSync({ name: "read", path: "./log.txt" })。
Deno.permissions.requestSync({ name: "read", path: "./log.txt" });
- Deno.writeFile() 和 Deno.writeTextFile() 现在接受 ReadableStream 作为第二个参数。
const stream = new ReadableStream({
pull(controller) {
controller.enqueue(new Uint8Array([1]));
controller.enqueue(new Uint8Array([2]));
controller.close();
},
});
await Deno.writeFile("/tmp/test.txt", stream);
assertEquals(Deno.readFileSync(filename), new Uint8Array([1, 2]));
- 增加了一个新的 Deno.env.has(name) API
Deno.env.set("TEST_VAR", "A");
assert(Deno.env.has("TEST_VAR"));
Deno.env.delete("TEST_VAR");
assert(!Deno.env.has("TEST_VAR"));
API 稳定化:
Deno.Listener.ref() 和 Deno.Listener.unref() 现在已经稳定。使用这些 API 时不再需要 --unstable 标志。
对不稳定的 API 的改变:
- 在 new Deno.Command({}).spawn() 中,stdin 选项的默认值被改为 "inherit” 意味着如果你没有特别配置这个选项,标准输入将从父进程中继承。
- Deno.dlopen 添加对按值传递结构的支持:
const Rect = ["f64", "f64", "f64", "f64"];
const dylib = Deno.dlopen("./dylib.so", {
make_rect: {
parameters: ["f64", "f64", "f64", "f64"],
result: { struct: Rect },
},
});
const rect_sync = dylib.symbols.make_rect(10, 20, 100, 200);
assertInstanceOf(rect_sync, Uint8Array);
assertEquals(rect_sync.length, 4 * 8);
assertEquals(Array.from(new Float64Array(rect_sync.buffer)), [
10,
20,
100,
200,
]);
新的不稳定的 API:
这个版本增加了 3 个新的 API:
- Deno.osUptime() (需要 -allow-sys=osUptime 权限)
- Deno.Conn.ref()
- Deno.Conn.unref()
这些 API 需要 --unstable 标志,但我们计划在下一个版本中稳定它们。
移除内部Deno.core
这个版本删除了 Deno.core 命名空间。Deno.core 是一个私有的 API,没有稳定性保证。这一变化对大多数用户应该没有影响。
Deno fmt支持配置分号
Deno fmt 的一个长期以来被反复要求的功能是能够在没有分号的情况下进行格式化。现在可以通过使用 --options-no-semicolons 标志或在 Deno 配置文件的 fmt 配置中指定 "semiColons": false 来实现这一功能。
{
"fmt": {
"options": {
"semiColons": false
}
}
}
具体如下图:
猜你喜欢
- 2024-11-25 用 WasmEdge 和 Rust 在边缘云上构建高性能且安全的微服务
- 2024-11-25 通过浏览器工作台启动本地项目
- 2024-11-25 r2frida:基于Frida的远程进程安全检测和通信工具
- 2024-11-25 NPM 使用介绍
- 2024-11-25 使用Hexo在github上搭建静态博客
- 2024-11-25 Android动态调试(1)-Radare2和lldb
- 2024-11-25 Metasploit渗透测试之MSFvenom
- 2024-11-25 浅析CTF中的Node.js原型链污染
- 2024-11-25 首个SSRF漏洞开篇学习
- 2024-11-25 github webhook自动化部署
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)