【Day 26】关於 Deno 与 NodeJS 的这些年和那些事

https://ithelp.ithome.com.tw/upload/images/20201014/20109963EeoAMWDT8V.jpg

前言

可能看这系列的读者会觉得,这主题也太跳了吧~~Deno 不是基於 Typescript 的语言吗? 怎麽一下子是 React,一下又转成 Typescript? 是的, Deno 确实是基於 Typescript,但它还是 Node 之父 Ryan Dahl 的新专案呢~~(好拉~小编我说到底就是想写XD)

NodeJS 目前也算是程序语言中最火的语言之一,但是 NodeJS 的作者 Ryan Dahl 却在 2018 年的 JSConf 上发表了一个关於 NodeJS设计错误的演讲,接着 Deno 问世了,Deno 是一只很可爱的恐龙XD~~好拉,Deno 是来自於 Node 的字母重新排列组合 (Node = no + de),表示要拆了 NodeJS (de = destroy, no = NodeJS)。网路上不少流传 Deno 会取代 NodeJS,Deno 确实有不少优点(待会会介绍),但是 NodeJS 发展到现在,不论是社群的支持、公司专案上的应用都已经是十分蓬勃,短时间内要被取代是不可能的。

关於 NodeJS 的问题

1. 没有坚持使用 Promise

Javascript 原生就具有 Callback 这项功能,而 NodeJS 也继承了这样的做法,也因此有了後续着名的 Callback Hell(回调地狱)这件事,而 Deno 在设计上一开始就支援 Promise 跟 Async/Await

一句话就能完成读档的功能啊~~~

const data = await Deno.readFile(“./file.txt”);
console.log(data);

2. 没有足够的安全性

事实上 NodeJS 跟 Deno 都是基於 V8 开发,也就是 Google 的核心套件,浏览器的安全性很高。但是在 NodeJS 的设计里,当我们运行像是 node index.js,index.js 里又拥有你所有的权限,此时如果刚好遇上 JS 档案是病毒档案(maybe 是脚本不安全),很可能此时就被黑客勒索了,在浏览器的世界中这种安全性问题并不该发生,只是当初 NodeJS 并没有加入这些安全机制。而 Deno 的设计里,当 Deno 编译时,它会自动去下载需要 import 的档案,然後存在缓存内,脚本需要在你允许的状况下才能去跑server起来或是读取你的(特定)档案( —allow-net —allow-write),也称 Deno 这种机制为沙盒机制(SandBox)

3. 错误的坚持使用 GYP 以及 没有提供 FFI

Chrome V8 在 2008 年问世,当时有一种 GYP (Generate Your Projects),所以当 NodeJS 2009 年问世时自然的就使用了 GYP,但後来 V8 转用了 (Generate Ninja),这时候就剩下 Node 成为唯一用户了,数据上显示 GN 比 GYP 快了将近 20 倍,在 Node 中很多套件底层都需要使用 GYP (因为套件要跨平台所以都会使用到),GYP 主要是用来编译原生 C++ 的模组的,这也可说是 Node 核心最大的问题了。 Deno 在这里就改用正常多了的 FFI (Foreign Function interface)

4. 错误的引入模组 以及 可以随时随地的引用

在我们 npm install 後,要引入 Module,通常会使用 request('Module') 的方式,但事实上在於浏览器中 <script> 内的 tag 是不能省略 .js 的,这使得 NodeJS 要多执行几次没必要的档案系统查询功能,才能知道我们要 import 什麽档案,也导致运行变慢的状况发生。

另外一个状况是,就算没有在 package.json 里注名的 dependency,在 Node 里却可以随时随地的引用。

5. 黑洞般的 node_module

https://ithelp.ithome.com.tw/upload/images/20201014/201099632kYzWJ1Cox.png

看到这张图,使用 NodeJS 的读者应该很有感,我真正撰写的档案才几 MB,为什麽 node_module 是好几倍Σ( ° △ °|||),到底载了什麽下来啊~~这是因为 Node 里的 Vendored-by-default 机制搞的鬼,当你下载一个 Module 的时候,它会自动的将依赖於那个 Module 的 Module 都下载下来,这也导致处理 node_module 方式变得很麻烦。 而 Deno 方便多了,根本就不用npm 安装了,只要 import url 进来就可以了。

import { serve } from "https://deno.land/[email protected]/http/server.ts";

6. package.json 与 npm

NPM 安装套件 + NodeJS 的主程序使用 require() 读取 package.json 载入,导致了 npm 的中央集权,而 npm 仓库里参差不齐的套件,可能引发一连串的灾害,以及 require(‘module') 定义不明确,导致引入这功能很混乱(不一定是 package.json定义的,可能是私有的模组); 加上 package.json 并没有公认管理档案的标准,因此导致一个资料夹里的可能掺杂了很多奇怪的资讯,像是名称、版本、说明,就像杂物间一样的乱。

7. index.js

因为在 package.json 就可以控制 main 要是哪个档案,因此默认加载 index.js 是没有必要的。

结论

  • 介绍了 NodeJS 的问题
  • 介绍了 Deno 的解决机制

/images/emoticon/emoticon18.gif要开始燃烧了~冲刺


<<:  [Day30] grid z-index 分层 / order 顺序

>>:  Elastic Stack第三十重

[Day - 25] - Spring Reactor Processor 之交易所OrderBook实作与设计

Abstract 好的,我们已先行叙述过Flux及Mano两项角色套件,最後,我们开始进行介绍Rea...

[Day 1] 主角总是最後登场的 (後端篇)

其实只是拖延症点到满等的我,说是主角其实只是拖延症发作 我通常都是先撰写前端篇才写後端篇,所以看官们...

【Day 11】分散式系统小总结

今天沙滩车太累ㄌ好想弃赛 透过这八堂课,也算是对分散式系统有一些初步认识, 之後再找时间接着看 M...

Day1-网路与K8s的奇怪漂流

小弟大概五年工作经验从修PC玩玩LinkIt开始,模仿过Boss Sensor与Agoda的推荐算法...

DAY 26 Big Data 5Vs – Veracity(准确性) AGQ

延伸介绍昨天的架构: 如果要对Log做视觉化的分析监控,许多人第一个想到的或许就是ELK架构*。这三...