Deno 已经正式发布了!
我说这句话时候,是不是很多前端 和 NodeJS 工(码)程(农)师已经按不住自己的40米大刀了。心中的不仅感慨前端是真的会造轮子,有了 node 还不够吗,还没学会 node 又搞了个 deno,node 和 deno 啥区别?!
的确,deno 和 node 形态很相似,要解决的问题似乎也相同,那他们到底有啥区别,这一切究竟是道德的沦丧还是 ry 的扭曲,让我们走进本篇文章,一探究竟。
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 等 | 原生支持 |
node 内置 API 通过模块导入的方式引用,例如:
const fs = require("fs"); fs.readFileSync("./data.txt"); 复制代码
而 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 比较困难。总体来说见仁见智。
我们再来看一下模块系统,这也是 deno 和 node 差别最大的地方,同样也是 deno 和 node 不兼容的地方。
我们都知道 node 采用的是 CommonJS 规范,而 deno 则是采用的 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 完全遵循 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 库的范围;有人则不太看好,觉得国内网速的原因,并不实用。大家的看法如何,欢迎在评论区发表
联系客服