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)

相关推荐