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)