Deno 正式发布几天了哦,彻底弄明白它和 node 的区别
前言
Deno 已经正式发布了!
我说这句话时候,是不是很多前端 和 NodeJS 工(码)程(农)师已经按不住自己的40米大刀了。心中的不仅感慨前端是真的会造轮子,有了 node 还不够吗,还没学会 node 又搞了个 deno,node 和 deno 啥区别?!
的确,deno 和 node 形态很相似,要解决的问题似乎也相同,那他们到底有啥区别,这一切究竟是道德的沦丧还是 ry 的扭曲,让我们走进本篇文章,一探究竟。
一定要看到最后哦,最后有惊喜哦!
Deno VS Node
| Node | Deno | |
|---|---|---|
| API 引用方式 | 模块导入 | 全局对象 |
| 模块系统 | CommonJS & 新版 node 实验性 ES Module | ES Module 浏览器实现 |
| 安全 | 无安全限制 | 默认安全 |
| Typescript | 第三方,如通过 ts-node 支持 | 原生支持 |
| 包管理 | npm + node_modules | 原生支持 |
| 异步操作 | 回调 | Promise |
| 包分发 | 中心化 npmjs.com | 去中心化 import url |
| 入口 | package.json 配置 | import url 直接引入 |
| 打包、测试、格式化 | 第三方如 eslint、gulp、webpack、babel 等 | 原生支持 |
1.内置 API 引用方式不同
node 模块导入
node 内置 API 通过模块导入的方式引用,例如:
const fs = require("fs");
fs.readFileSync("./data.txt");
复制代码
deno 全局对象
而 deno 则是一个全局对象 Deno 的属性和方法:
Deno.readFileSync("./data.txt");
复制代码
具体 deno 有哪些方法,我们可以通过 repl 看一下:
deno # 或 deno repl 复制代码
进入repl后,输入Deno回车,我们可以看到:
{
Buffer: [Function: Buffer],
readAll: [AsyncFunction: readAll],
readAllSync: [Function: readAllSync],
writeAll: [AsyncFunction: writeAll],
writeAllSync: [Function: writeAllSync],
# .....
}
复制代码
这种处理的方式好处是简单、方便,坏处是没有分类,想查找忘记的 API 比较困难。总体来说见仁见智。
2.模块系统
我们再来看一下模块系统,这也是 deno 和 node 差别最大的地方,同样也是 deno 和 node 不兼容的地方。
node CommonJS 规范
我们都知道 node 采用的是 CommonJS 规范,而 deno 则是采用的 ES Module 的浏览器实现,那么我们首先来认识一下:
ES Module 的浏览器实现
具体关于 ES Module 想必大家都早已熟知,但其浏览器实现可能大家还不是很熟悉,所以我们先看一下其浏览器实现:
<body>
<!-- 注意这里一定要加上 type="module" -->
<script type="module">
// 从 URL 导入
import Vue from "https://unpkg.com/vue@2.6.11/dist/vue.esm.browser.js";
// 从相对路径导入
import * as utils from "./utils.js";
// 从绝对路径导入
import "/index.js";
// 不支持
import foo from "foo.js";
import bar from "bar/index.js";
import zoo from "./index"; // 没有 .js 后缀
</script>
</body>
复制代码
deno 的模块规范
deno 完全遵循 es module 浏览器实现,所以 deno 也是如此:
// 支持
import * as fs from "https://deno.land/std/fs/mod.ts";
import { deepCopy } from "./deepCopy.js";
import foo from "/foo.ts";
// 不支持
import foo from "foo.ts";
import bar from "./bar"; // 必须指定扩展名
复制代码
我们发现其和我们平常在 webpack 或者 ts 使用 es module 最大的不同:
可以通过 import url 直接引用线上资源;
资源不可省略扩展名和文件名。
关于第 1 点,争议非常大,有人很看好,觉得极大的扩展了 deno 库的范围;有人则不太看好,觉得国内网速的原因,并不实用。大家的看法如何,欢迎在评论区发表
赞 (0)
