精华内容
下载资源
问答
  • 它是 Node.js 的替代品。有了它,将来可能就不需要 Node.js 了。 这篇文章就是 Deno 的一个初步介绍,尝试回答为什么 Node.js 不能满足需要,以及 Deno 能够带给我们什么? 以下内容主要基于Bert Belder和Ryan ...

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

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

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

    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 库,来实现事件循环(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 -hdeno 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 的安装可以参考官网首页,但是你可以直接去 GitHub 仓库的发布页,下载编译好的可执行文件(上图)。

    下载 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 的远程脚本,这是官网给出的例子

    
    $ deno run \
    https://deno.land/std/examples/curl.ts \
    https://example.com
    

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

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

    
    $ deno run --allow-net \
    https://deno.land/std/examples/curl.ts \
    https://example.com
    

    15、

     

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

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

    (完)

    展开全文
  • 它是 Node.js 的替代品。有了它,将来可能就不需要 Node.js 了。 这篇文章就是 Deno 的一个初步介绍,尝试回答为什么 Node.js 不能满足需要,以及 Deno 能够带给我们什么? 以下内容主要基于Bert Belder和Ryan ...

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

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

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

    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 库,来实现事件循环(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 -hdeno 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 的安装可以参考官网首页,但是你可以直接去 GitHub 仓库的发布页,下载编译好的可执行文件(上图)。

    下载 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 的远程脚本,这是官网给出的例子

    
    $ deno run \
    https://deno.land/std/examples/curl.ts \
    https://example.com
    

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

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

    
    $ deno run --allow-net \
    https://deno.land/std/examples/curl.ts \
    https://example.com
    

    15、

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

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

    转载:http://www.ruanyifeng.com/blog/2020/01/deno-intro.html

    展开全文
  • 替代功能 同义词的替代功能是同义的初始功能。在特定的语境场合之下,根据表达或交际需要,在句子或语段中,可以选择同义进行相互替换。同义之间相互替代可以使语言避免单调乏味和不必要的重复,也可以避免...
  • 它是 Node.js 的替代品。有了它,将来可能就不需要 Node.js 了。这篇文章就是 Deno 的一个初步介绍,尝试回答为什么 Node.js 不能满足需要,以及 Deno 能够带给我们什么?以下内容主要基于 Bert Belder[2]和 Ryan ...

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

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

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

    0、

    b38822f6899dcfd7b692888f0e34f9c5.png

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

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

    1、

    196fd8f595e692dcd1523aa6f34b9ddd.png

    Deno 是 Ryan Dahl 在 2017 年创立的。

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

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

    2、

    caca78c1ede29dc1291036c604e73464.png

    首先,过去五六年,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、

    d33d02dceee62215371651070acb5972.png

    由于上面这些原因,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、

    47c4ec7ee389ff68bf8bded951eca515.png

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

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

    5、

    2d9d0952d23e4474048c7e76eafe0ac8.png

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

    6、

    6bce1da9ba3cefd50e66f2a36e81b170.png

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

    7、

    ed60f343a4d3b477e9aaaf5dc939b21a.png

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

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

    • --allow-read:打开读权限,可以指定可读的目录,比如--allow-read=/temp
    • --allow-write:打开写权限。
    • --allow-net=google.com:允许网络通信,可以指定可请求的域,比如--allow-net=google.com
    • --allow-env:允许读取环境变量。

    8、

    d5977ddeaf60d97edcc54b65d00c2db1.png

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

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

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

    9、

    5f650af89d60250b56b4073cdb0b46ae.png

    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、

    99f8b05fbfddfdc56e1c03d727cc0687.png

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

    import React from "react";
    import { Box, Grid } from "@material-ui/core";
    import { initializeApp } from "firebase/app";

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

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

    11、

    84fb819eebea89d6836c33f88f299964.png

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

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

    12、

    becc9c6ccd2e1e0fbde72162db2ea1a5.png

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

    执行deno -hdeno 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、

    951f6cdd4befd5fe8999cb8873ec95a7.png

    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、

    3328c7df79f454e0cad022c28d78f91e.png

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

    $ deno run 
    https://deno.land/std/examples/curl.ts
    https://example.com

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

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

    $ deno run --allow-net 
    https://deno.land/std/examples/curl.ts
    https://example.com

    15、

    8359cc07fa53d30880341629961906a6.png

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

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

    参考资料

    [1]

    Deno: https://deno.land/

    [2]

    Bert Belder: https://www.youtube.com/watch?v=puXyo1jGQys

    [3]

    Ryan Dahl: https://www.youtube.com/watch?v=1gIiZfSbEAE

    [4]

    Tokio: https://github.com/tokio-rs/tokio

    [5]

    官网首页: https://deno.land/

    [6]

    发布页: https://github.com/denoland/deno/releases

    [7]

    例子: https://deno.land/std/examples/curl.ts

    展开全文
  • 它是 Node.js 的替代品。有了它,将来可能就不需要 Node.js 了。这篇文章就是 Deno 的一个初步介绍,尝试回答为什么 Node.js 不能满足需要,以及 Deno 能够带给我们什么?以下内容主要基于 Bert Belder[2]和 Ryan ...

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

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

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

    0、

    3a1b8233efc07ddc18ec2ecbe643c5b6.png

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

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

    1、

    68b4fced5ff0fa01757b257f89247bdb.png

    Deno 是 Ryan Dahl 在 2017 年创立的。

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

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

    2、

    717e58590e5a52cc033e8cecbbcee014.png

    首先,过去五六年,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、

    e750fd7bb5e01e120ea7d5bd6c46693a.png

    由于上面这些原因,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、

    70b8b52d6619da3bf440cd785441ce46.png

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

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

    5、

    c7f032d065f943bf5241e3c75eff99a3.png

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

    6、

    3e02c8c083e365e47a7d31835a0a81fd.png

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

    7、

    e1f962448451d1c60d276ade2117ea5f.png

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

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

    • --allow-read:打开读权限,可以指定可读的目录,比如--allow-read=/temp
    • --allow-write:打开写权限。
    • --allow-net=google.com:允许网络通信,可以指定可请求的域,比如--allow-net=google.com
    • --allow-env:允许读取环境变量。

    8、

    a0cd0eced12b8e49fdae79811251c6b8.png

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

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

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

    9、

    8fea149ccfe4f56b6178b58d9ce369bb.png

    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、

    69b887d4161d89f3516ecc3b6f60391b.png

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

    import React from "react";
    import { Box, Grid } from "@material-ui/core";
    import { initializeApp } from "firebase/app";

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

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

    11、

    4d78f5101df90dd29e537e40bfb254c6.png

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

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

    12、

    245958357d01d8eee872a888eadb52ea.png

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

    执行deno -hdeno 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、

    4e6e8b7918635b1ddbc31986a90471bc.png

    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、

    57f2fe924f377056fe460a2de3ecaeeb.png

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

    $ deno run 
    https://deno.land/std/examples/curl.ts
    https://example.com

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

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

    $ deno run --allow-net 
    https://deno.land/std/examples/curl.ts
    https://example.com

    15、

    53e8d5c82030a98d56efe591e4ab9780.png

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

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

    参考资料

    [1]

    Deno: https://deno.land/

    [2]

    Bert Belder: https://www.youtube.com/watch?v=puXyo1jGQys

    [3]

    Ryan Dahl: https://www.youtube.com/watch?v=1gIiZfSbEAE

    [4]

    Tokio: https://github.com/tokio-rs/tokio

    [5]

    官网首页: https://deno.land/

    [6]

    发布页: https://github.com/denoland/deno/releases

    [7]

    例子: https://deno.land/std/examples/curl.ts

    展开全文
  • 屏蔽功能实现

    千次阅读 2013-11-20 23:27:26
    自己当时想过用字符串去替代的方式(replaceAll)去实现,但是这种效率又非常低,也不能保证最长匹配,这就是自己当时最初想法。最近自己做一个项目中,需要对一些内容做屏蔽,自己又对这个问题做了一次分析,...
  • (未经测试Java替代版本) 库和开发工具 怎么跑 考虑到项目.war文件是通过编译和构建,因此未生成Project .jar文件。 有关如何编译和部署.war存档信息,请参见 或者 可通过访问该程序。 (最初可能需要花费...
  • 绿色环保演讲1500字 谁不希望脚下大地绿草如茵,谁不希望身边湖水清澈明净,所以绿色环保很重要,那么对于绿色环保话题发言要说些什么内容才精彩呢?今天小编向你推荐绿色环保演讲1500字,希望对你有所帮助...
  • // 导入用户自定义词典:自定义词典路径,bOverwrite=true表示替代当前自定义词典,false表示添加到当前自定义词典后 public int NLPIR_ImportUserDict(String sFilename, boolean bOverwrite); //获取关键字 ...
  • 很多支持用户发表文本内容的网站,比如 BBS,大都会有敏感过滤功能,用来过滤掉用户输入的一些淫秽、反动、谩骂等内容。你有没有想过,这个功能是怎么实现的呢? 实际上,这些功能最基本的原理就是字符串匹配算法...
  • 相比Mac自带spotlight,alfred mac版完全可以将其替代。Alfred 4 Mac配合快捷键提高您工作效率,其可以快速搜索本地程序、查找文件、剪贴板管理、使用搜索引擎搜索、查询词典、发送邮件、音乐控制等等,功能...
  • (在升级会员中心时处理) 13、DEDE 搜索功能不准确(词库没有的词或被拆开中文字不会做搜索导致); 14、投票系统VOTE.PHP程序中没有对投票时未选择选项做程序处理! 15、未审核文章出现会员空间,导致...
  • (在升级会员中心时处理) 13、DEDE 搜索功能不准确(词库没有的词或被拆开中文字不会做搜索导致); 14、投票系统VOTE.PHP程序中没有对投票时未选择选项做程序处理! 15、未审核文章出现会员空间,导致...
  • 特定字词的自定义替代 内置例外列表(东京,大阪等) 在UniDic中可用时使用外国拼写 专有名词大写 slug模式用于生成URL 不支持的内容: 传统赫本从N到M:新桥 巨圆或抑扬音:Tōkyō,Tôkyô 护照赫本:佐藤...
  • python中变量使用

    2020-11-04 14:05:12
    所以当你放进新东西时,旧东西就会被替代掉。 3.变量命名规则 1)只能是一个 2)只能包含字母、数字和下划线 3)不能以数字开关 4)尽量描述包含数据内容 示例:milktea_name 题目:打印一个奶茶标识 ...
  • 是一个新“性感”流行,没有特定含义,但通常用于替代统计,科学计算,文本和数据挖掘与可视化,机器学习,数据处理和仓储以及任何形式检索算法。 此精选列表包括使用各种数据科学应用程序教程,库和信息源...
  • adaptor和adapter都是适配器意思,adapter是正(adaptor是英式用法,是变异),因此对下面的内容都修正为adapter 随着系统交互越来越多,通过接口相互调用是难免。近来分析几个程序发现一个不好代码...
  • 关于人工智能写作发展以及看法

    千次阅读 2018-08-21 09:48:04
    现在也可以用来写小说和写网络文章,团队将准备小说故事情节并为人工智能提供替代词,并且机器将这些元素组合成完整句子。 众所周知,写稿机器人并不是一台机器实体,而是一套由人设计出来软件...
  • 再生运动是伊斯坦布尔不可替代的必要条件,不仅要防止地震破坏和提高身体素质,而且要提高生活质量,减少社会脆弱性并维持社会和身体可持续性。 在土耳其,自1980年代以来,根据不同机构和利益相关者说法,城市...
  • 该项目提供了一个Dockerfile,可用于构建一个完全隔离容器,其中包含您需要使用所有内容。 您可以从Docker Hub提取预构建映像( docker pull itsmattgibbs/simulacrum ),也可以克隆Simulacrum存储库并自己...
  • shell中EOF用法

    2017-11-07 16:52:00
    此分界符可以是所定义任何字符串,其实,不一定要用EOF,只要是‘内容段’中没有出现字符串,都可以用来替代EOF,完全可以换成abcd之类字符串,只是一个开始和结束标志而已 常用<1...
  • 显示警告列表,例如缺少标题/描述,内容稀疏,关键字填充页面,不含替代文本图像,混合内容等等。 网站地图 导出xml网站地图以提交给搜索引擎(以及其他格式)。选择包括图像和pdf文件。为您优先级设置规则/...
  • 显示警告列表,例如缺少标题/描述,内容稀疏,关键字填充页面,不含替代文本图像,混合内容等等。 网站地图 导出xml网站地图以提交给搜索引擎(以及其他格式)。选择包括图像和pdf文件。为您优先级设置规则/更改...
  • shell学习---EOF用法

    2018-09-18 15:51:19
    此分界符可以是所定义任何字符串,其实,不一定要用EOF,只要是‘内容段’中没有出现字符串,都可以用来替代EOF,完全可以换成abcd之类字符串,只是一个开始和结束标志而已. 常用&lt;...

空空如也

空空如也

1 2 3 4 5 6
收藏数 119
精华内容 47
关键字:

内容的替代词