转自:微点阅读  https://www.weidianyuedu.com

这几天假期,我学习了一下 Deno[1]。它是 Node.js 的替代品。有了它,将来可能就不需要 Node.js 了。

这篇文章就是 Deno 的一个初步介绍,尝试回答为什么 Node.js 不能满足需要,以及 Deno 能够带给我们什么?

以下内容主要基于 Bert Belder[2]和 Ryan Dahl[3]的最新演讲。

0、

进入主题之前,先说一下 Deno 这个词怎么发音。

两种发音,“德诺”和“蒂诺”,我都听到过。看起来,“蒂诺”这个发音应该更合适一些,因为 Deno 的标志是一只恐龙。恐龙(dinosaur)的英文缩写正是 dino。

1、

Deno 是 Ryan Dahl 在 2017 年创立的。

Ryan Dahl 也是 Node.js 的创始人,从 2007 年一直到 2012 年,他后来把 Node.js 移交给了其他开发者,不再过问了,转而研究人工智能。

他始终不是很喜欢 Python 语言,久而久之,就想搞一个 JavaScript 语言的人工智能开发框架。等到他再回过头捡起 Node.js,发现这个项目已经背离了他的初衷,有一些无法忽视的问题。

2、

首先,过去五六年,JavaScript 语言脱胎换骨,ES6 标准引入了大量新的语法特性。其中,影响最大的语法有两个:Promise 接口(以及 async 函数)和 ES 模块。

Node.js 对这两个新语法的支持,都不理想。由于历史原因,Node.js 必须支持回调函数(callback),导致异步接口会有 Promise 和回调函数两种写法;同时,Node.js 自己的模块格式 CommonJS 与 ES 模块不兼容,导致迟迟无法完全支持 ES 模块。

其次,Node.js 的模块管理工具 npm,逻辑越来越复杂;模块安装目录 npm_modules 极其庞杂,难以管理。Node.js 也几乎没有安全措施,用户只要下载了外部模块,就只好听任别人的代码在本地运行,进行各种读写操作。

再次,Node.js 的功能也不完整,导致外部工具层出不穷,让开发者疲劳不堪:webpack,babel,typescript、eslint、prettier……

3、

由于上面这些原因,Ryan Dahl 决定放弃 Node.js,从头写一个替代品,彻底解决这些问题。deno 这个名字就是来自 Node 的字母重新组合(Node = no de),表示“拆除 Node.js”(de = destroy, no = Node.js)。

跟 Node.js 一样,Deno 也是一个服务器运行时,但是支持多种语言,可以直接运行 JavaScript、TypeScript 和 WebAssembly 程序。

它内置了 V8 引擎,用来解释 JavaScript。同时,也内置了 tsc 引擎,解释 TypeScript。它使用 Rust 语言开发,由于 Rust 原生支持 WebAssembly,所以它也能直接运行 WebAssembly。它的异步操作不使用 libuv 这个库,而是使用 Rust 语言的 Tokio[4]库,来实现事件循环(event loop)。

4、

你可能会问,为什么使用 Rust,而不是 C (Node.js 的开发语言)?

主要原因是 Rust 提供了很多现成的模块,对 Deno 项目来说,可以节约很多开发时间。

5、

Deno 本身也是 Rust 的一个模块。如果你想在 Rust 里面使用 V8 引擎,就可以加载 Deno。它等于是一个 V8 的包装层,提供一些底层 API,让你跟 V8 引擎互动。

6、

Deno 只有一个可执行文件,所有操作都通过这个文件完成。它支持跨平台(Mac、Linux、Windows)。

7、

Deno 具有安全控制,默认情况下脚本不具有读写权限。如果脚本未授权,就读写文件系统或网络,会报错。

必须使用参数,显式打开权限才可以。

--allow-read:打开读权限,可以指定可读的目录,比如--allow-read=/temp。

--allow-write:打开写权限。

--allow-net=google.com:允许网络通信,可以指定可请求的域,比如--allow-net=google.com。

--allow-env:允许读取环境变量。

8、

Deno 支持 Web API,尽量跟浏览器保持一致。

它提供 window 这个全局对象,同时支持 fetch、webCrypto、worker 等 Web 标准,也支持 onload、onunload、addEventListener 等事件操作函数。

此外,Deno 所有的异步操作,一律返回 Promise。

9、

Deno 只支持 ES 模块,跟浏览器的模块加载规则一致。没有 npm,没有 npm_modules 目录,没有require命令(即不支持 CommonJS 模块),也不需要package.json文件。

所有模块通过 URL 加载,比如import { bar } from "https://foo.com/bar.ts"(绝对 URL)或import { bar } from "./foo/bar.ts"(相对 URL)。因此,Deno 不需要一个中心化的模块储存系统,可以从任何地方加载模块。

但是,Deno 下载模块以后,依然会有一个总的目录,在本地缓存模块,因此可以离线使用。

10、

由于 Deno 只支持从 URL 加载模块,导致 Node.js 的模块加载写法都会失效。

import React from "react";

import { Box, Grid } from "@material-ui/core";

import { initializeApp } from "firebase/app";

上面的写法在 Deno 里面都是非法的。

Deno 的所有模块都要通过入口脚本加载,不能通过模块名加载,所以必须带有脚本后缀名。

11、

Deno 原生支持 TypeScript 语言,可以直接运行,不必显式转码。

它的内部会根据文件后缀名判断,如果是.ts后缀名,就先调用 TS 编译器,将其编译成 JavaScript;如果是.js后缀名,就直接传入 V8 引擎运行。

12、

Deno 内置了开发者需要的各种功能,不再需要外部工具。打包、格式清理、测试、安装、文档生成、linting、脚本编译成可执行文件等,都有专门命令。

执行deno -h或deno help,就可以显示 Deno 支持的子命令。

deno bundle:将脚本和依赖打包

deno eval:执行代码

deno fetch:将依赖抓取到本地

deno fmt:代码的格式美化

deno help:等同于-h参数

deno info:显示本地的依赖缓存

deno install:将脚本安装为可执行文件

deno repl:进入 REPL 环境

deno run:运行脚本

deno test:运行测试

13、

Deno 的安装可以参考官网首页[5],但是你可以直接去 GitHub 仓库的发布页[6],下载编译好的可执行文件(上图)。

下载 Deno 以后,查看一下版本。

$ deno --version

deno 0.31.0

v8 8.1.108

typescript 3.7.2

命令行直接运行deno,就会进入 REPL 环境。

$ deno

> console.log(1,2,3)

1 2 3

undefined

>

14、

下面,运行一个 TypeScript 的远程脚本,这是官网给出的例子[7]。

$ deno run \

上面例子中,Deno 执行远程脚本curl.ts,用这个脚本去抓取网址example.com。但是,运行后报错,表示没有网络通信的权限。

我们给予 Deno 网络通信的权限,就可以顺利执行。

15、

现在,Deno 最新版本是 0.31。根据规划,1.0 应该会在今年上半年发布。

Deno 还处在密集开发中,功能不稳定,不建议用于生产环境。但是,它已经是一个可用的工具,大家可以多试用,熟悉它的用法。我相信,设计上的诸多优点,将会使它比 Node.js 更具优势。

Deno入门教程:Node.js 的替代品相关推荐

  1. 以太坊DApp开发入门教程——Node.js和truffle框架打造区块链投票系统

    第一节 课程概述 本课程面向初学者,内容涵盖以太坊开发相关的基本概念,并将手把手地教大家如何构建一个 基于以太坊的完整去中心化应用 -- 区块链投票系统. 通过本课程的学习,你将掌握: 以太坊区块链的 ...

  2. 视频教程-Node.JS - socket.io教程-Node.js

    Node.JS - socket.io教程 全栈开发工程师,现职于北京一家学院的全栈教学主任. 8年前端开发经验.4年移动端开发经验.4年UI设计经验.3年一线教学经验. 精通Node.JS.PHP. ...

  3. java文件边读边写_[Java教程]node.js 利用流实现读写同步,边读边写

    [Java教程]node.js 利用流实现读写同步,边读边写 0 2017-09-10 13:00:14 //10个数 10个字节,每次读4b,写1blet fs=require("fs&q ...

  4. java爬虫拉勾网_[Java教程]node.js爬虫爬取拉勾网职位信息

    [Java教程]node.js爬虫爬取拉勾网职位信息 0 2017-03-14 00:00:21 简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京.上海.广州.深圳 ...

  5. php插入js教程,JavaScript_JavaScript入门教程(2) JS基础知识,在什么地方插入 JavaScript  Ja - phpStudy...

    JavaScript入门教程(2) JS基础知识 在什么地方插入 JavaScript JavaScript 可以出现在 HTML 的任意地方.使用标记,你可以在 HTML 文档的任意地方插入 Jav ...

  6. node.js htttp文件服务器 遇到目录时搜索目录内默认html页面 廖雪峰javascript教程node.js中http部分练习题

    廖雪峰javascript教程node.js中http部分最后的练习题: https://www.liaoxuefeng.com/wiki/1022910821149312/1023025830950 ...

  7. 推荐个NodeJS的入门教程 — Node入门/nodebeginner

    介绍 传送门在这里 >> Node入门 说明 教程内容是很高级且简短,即少我学完后可以用Nodejs写个本地mock服务器,用于API的mock测试 该教程一边由浅入深的介绍Nodejs的 ...

  8. Deno 会取代 Node.js 吗?

    [CSDN 编者按]几天前,Node 之父 Ryan Dahl 及 Deno 团队为我们正式带来了 Deno 1.0,据官方介绍,这是一个 JavaScript/TypeScript 运行时,使用 V ...

  9. 无涯教程:Node.js - Streams介绍

    无涯教程网:Stream流是使您可以连续地从源读取数据或将数据写入目标的对象,在Node.js中,有四种类型的流- Readable   -  用于读取操作的流. Writable    -  用于写 ...

最新文章

  1. Visual Studio 2005 Team System下载地址
  2. 字符串的html语言,html语言解析为属性字符串NSMutableAttributedString
  3. char[1] or char*
  4. POJ1258 Agri-Net【最小生成树】
  5. DFS(入门题,走迷宫)
  6. Webrtc入门——基于阿里云ubuntu 最新webrtc Android平台编译详细说明
  7. Angular应用里HTTP请求的错误处理
  8. springmvc新建拦截器
  9. 一个月学会Python的Quora指南和资料放送
  10. TensorFlow LeNet5
  11. Windows xp下IDT Hook和GDT的学习
  12. 求n!最后一位非零数
  13. [js高手之路]设计模式系列课程-委托模式实战微博发布功能
  14. BIOS 编译过程:C文件到EFI文件
  15. VBScript: Windows脚本宿主介绍
  16. image.getSubimage(x, y, width, height)函数解析
  17. MATLAB反色图像处理
  18. 小程序增加 文章 / 新闻 / 资讯 / 动态 功能,支持用户投稿
  19. 霓虹灯的c语言编写程序,用C语言编写单片机流水灯程序
  20. 金钏跳井,凸显贾府主子冷血,下人们离心离德是必然。

热门文章

  1. 计算飞机跑道长度C语言,中国各个机场跑道长度
  2. 百度、腾讯和阿里内部的级别和薪资待遇是什么样的?-转自知乎
  3. STM32F0两路AD配置参考
  4. 数据结构复习——绪论
  5. 微星强袭GE76 2022款评测
  6. 怎样做研究(一) 刘挺
  7. python网络通信效率_Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)...
  8. linux删除0kb文件夹,肿么删除.nomedia文件
  9. mysql中discount用法_MySQL 技巧:COALESCE 函数的使用
  10. 这些例子有点意思,可以研究一下哈