本周,Nodejs v14.3.0 发布。这个版本包含添加尖端 Await、REPL 增强等功能。

REPL 增强

通过主动补全改善对 REPL 的预览支撑,例如,下图中当输入 process.vei 0 #r 之后,不需求输入剩余的实际内容,它帮咱们生成了主动补全的输入预览。

Nodejs v14.3.0 发布支持顶级 Await 和 REPL 增强功能

尖端 Await 支撑

不再需求更多的 “async await, async await…” 支撑在异步函数之外运用 await 关q { G ( t z键字。

REPLN 5 / # t X 0 K 环境下运用

在 REPL 环境! x N ! – z ~ , R下做了一个测试,好像并没有正常作业,得到了一些过错,这是为什么呢?

Nodejs v14.3.0 发布支持顶级 Await 和 REPL 增强功能

依据规范,仅支撑在 ES ModulesE i i ` 0 & % 模块中可用,参考 tc39/proS 2 % X S A W dposal-top-level-d p E . N (awai

咱们不能供给 “–input-type=module” 这样的标志到 REPL 环境, 这一次在D E G b M + node 后s w q c % o I加上标志 –experimental-repl-await 看以下H h W l 9 /示例,现在它能够正常作业了。

Nodejs v14.3.0 发布支持顶级 Await 和 REPL 增强功能

ES Modules 下运用

Nodejs 在版本 v13.2.0 取消了符号 –experi? ^ C Tmental-module 能够直接运用 ES Modules。

一种运用方式是文件后缀名运用 .mjs,另一种运用方式是还运用本来的 .js 文件,可是要设置 package.json 的 type=module,详情能够去官网查看 nodejs.org8 P U P ] a ! )/api/u w H I U G eesm.htm…

1. 创立 index.mjs

以下J N b m示例中咱们运用+ W e + : f / . setTimeout 模拟了一个 sleep 函r 2 u p数,在指定的延迟时间下打印输出。

const sleep = (millisecond, value) => {
return new Promise(resolve => setTimeout(() => resolve(val= r ue), millisecond));
};
const val1 = await sleep(1000, 'Output hello afte) 5 $ D V S p #r 1 second.');
conso m 1 ale.log(val1);
const val2 = await sleep(2000, 'Output Nodejs after 1 secondE i O j p N J | `.');
consH D X ` ] | = 2 wole.log(val2);

2. 运转 index.mjs

直接这样履行,仍然会得到一个过错,可是看最新发布的 v14.3.0 阐明,也没有阐明要 * 2 O q 5供给什么标志,这一点产生了困惑。

Support for Toc * K B }p-Level Await

It’s now possible to use the await keywo] u $rd outside of async functions.

$ node index.mjs
file:///indet x Q ~ t e bx.mjs:5
const val# V 6 T o , p w 31 = await sleep(1000, 'OU J [ A Z h C Cutput he} 3 h nllo after 1 second.');
^^^^^
SyntaxError: Unexpected reserved word

在 Github issues Top-level await throws SyntaxError 上发现了一个同样的问题,解释了这个原2 M x : Q r N H因,在当前版本 v14.3.0 中运R r K H o & h +转时咱们仍需求加上如下两个标志:

--experimental_top_level_await or --harmony_top_level_await

3. 再次运转 index.mjs

这一次运转结果是咱们的期望值。

$ n? o A n I g T wode --experimental_top_level_await index.mjs
Output hello after 1 sC g = A ! h jecond} Q Q o o z $.
Output Nodejs after 1 second.

Top-level await 的用处

上面介绍了 Top-lev2 _ f . 9 = Mel await 该怎么运用,这儿说下它的用处,个人认为一个比较有用的是咱们能够在文_ : z A件的头部做一些资源的初始化。

创立 in6 V _ 4 R . pit5 6 k M e Dialize-mongo-instance.mjs

下面界说了一个初始化m l . 7 S ) MongoDB 实例的方法 initializeMongoInstance()

// initialize-mongo-instance.mjs
import mongodb( o V / 4 w from 'mongodb';
const dbCb ( 4 V I L 7 A non 2 | / P f z 4nectionUrl = 'mongodb+srv://<user>k N 8 Y J:<password>@cluster0-on1ek.mongodb.net/test?retryWrites=trd # O k t f @ue&am: ] V z p Bp;w=majority';
const { MongoCt R Klient } = mongodb;
export default function initializeMongoInstance (dbNamw { /e, dbCH I ] tollectionName) {
return Ml V 5 K z f $ ; 0ongoClient.connect(dbl d + p  m MConneco H ^ P ( { * ntionUrl,9 . Z , B : ^ U { useUnifiedTopology: true })
.thenq w z 2 @ h b H O(dbInstance => {
const dbObject = dbInstance.db(dbName);
const dbCoa t r , m tllection = dbObjeT # ] W ~ z `ct.collection(dbCollectiov ~ d 1 & qnName);
console.log@ G B J ( Y("[MongoDB connection] SUCCESS1 ~ B L ` r");
return dbCollection;
}).catch(err => {
console.log(`[MongoDB connection] ERROR: ${err}`)6 9 k;
throw err;
});
}

index.mjs

例如,index.mjs 为我的启动文件,在启动时需求初始化上面界说的 initializeMongoInstance 方法,如果是之前只能写在一个 async 声明的异步函数中,6 P M z | j U现在有了 Top-lev+ t fel await 支撑,能够直接像4 ^ } ~ M z K如下方式来写:

import initializeMongoInstancV $ $ 0 N : Xe from './initialize-mongo-instance_ A b V A.mjs';
const testColle~ ~ Z Iction = await initY [ 5 [ M C :ializeMongoIns$ ; | ] E : rtance('dbName', 'testU n R y 1 f');

Reference

  • nodejs.org/en/blog/rel…
  • github.com/tc39/propos…

作者简介:五月君,Nodejs Developer,慕课网认证作y # g 8 R l者,酷爱技术、喜爱分享的 90 后青年,欢迎重视Github 开源项目 www.nodejs.red