国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Nodejs 14大版本中新增特性總結

開發 前端
以下內容也是基于筆者在日常 Node.js 工作和學習中所總結的,可能不全,同時也歡迎補充,有些功能之前也曾單獨寫過文章來介紹,接下讓我們一起看看都有哪些新的變化。

[[384503]]

 Node.js 是一個基于 Chrome V8 引擎 的 JavaScript 運行時。在 2020 年 10 月 27 日 Node.js v14.15.0 LTS 版已發布,即長期支持版本,其中包含了很多很棒的新功能,以下內容也是基于筆者在日常 Node.js 工作和學習中所總結的,可能不全,同時也歡迎補充,有些功能之前也曾單獨寫過文章來介紹,接下讓我們一起看看都有哪些新的變化?

Optional Chaining(可選鏈)

如果我們使用 JavaScript 不管是用在前端或者 Node.js 服務端都會出現如下情況,因為我們有時是不確定 user 對象是否存在,又或者 user 對象里面的 address 是否存在,如果不這樣判斷, 可能會得到類似于 Cannot read property 'xxx' of undefined 這樣的類似錯誤。 

  1. const user = {  
  2.   name: 'Tom',  
  3.   address: {  
  4.     city: 'ZhengZhou'  
  5.   }  
  6.  
  7. if (user && user.address) {  
  8.   console.log(user.address.city)  

現在我們有一種優雅的寫法 "可選鏈操作符",不必明確的驗證鏈中的每個引用是否有效,以符號 "?." 表示,在引用為 null 或 undefined 時不會報錯,會發生短路返回 undefined。 

  1. user.address?.city  
  2. user.address?.city?.length  
  3. // 結合 ?.[] 的方式訪問相當于 user.address['city']  
  4. user.address?.['city']  
  5. // 結合 delete 語句使用,僅在 user.address.city 存在才刪除  
  6. delete user.address?.city 

參考 https://v8.dev/features/optional-chaining

Nullish Coalescing(空值合并)

邏輯或操作符(||)會在左側為假值時返回右側的操作符,例如我們傳入一個屬性為 enabled:0 我們期望輸出左側的值,則是不行的。 

  1. function Component(props) {  
  2.   const enable = props.enabled || true; // true  
  3.  
  4. Component({ enabled: 0 }) 

現在我們可以使用 **空值合并操作符(??)**來實現,僅當左側為 undefined 或 null 時才返回右側的值。 

  1. function Component(props) {  
  2.   const enable = props.enabled ?? true; // 0  
  3.  
  4. Component({ enabled: 0 }) 

參考:https://v8.dev/features/nullish-coalescing

Intl.DisplayNames(國際化顯示名稱)

對于國際化應用需要用到的語言、區域、貨幣、腳本的名稱,現在 JavaScript 開發者可以使用 Intl.DisplayNames API 直接訪問這些翻譯,使應用程序更輕松的顯示本地化名稱。

Language(語言) 

  1. let longLanguageNames = new Intl.DisplayNames(['zh-CN'], { type: 'language' });  
  2. longLanguageNames.of('en-US'); // 美國英語  
  3. longLanguageNames.of('zh-CN'); // 中文(中國)  
  4. longLanguageNames = new Intl.DisplayNames(['en'], { type: 'language' });  
  5. longLanguageNames.of('en-US'); // American English  
  6. longLanguageNames.of('zh-CN'); // Chinese (China) 

Region(區域) 

  1. let regionNames = new Intl.DisplayNames(['zh-CN'], {type: 'region'});  
  2. regionNames.of('US'); // 美國  
  3. regionNames.of('419'); // 拉丁美洲  
  4. regionNames = new Intl.DisplayNames(['en'], {type: 'region'});  
  5. regionNames.of('US'); // United States  
  6. regionNames.of('419'); // Latin America 

Currency(貨幣) 

  1. let currencyNames = new Intl.DisplayNames(['zh-CN'], {type: 'currency'});  
  2. currencyNames.of('CNY'); // 人民幣  
  3. currencyNames.of('USD'); // 美元  
  4. currencyNames = new Intl.DisplayNames(['en'], {type: 'currency'});  
  5. currencyNames.of('CNY'); // Chinese Yuan  
  6. currencyNames.of('USD'); // US Dollar 

Script(腳本) 

  1. let scriptNames = new Intl.DisplayNames(['zh-CN'], {type: 'script'});  
  2. scriptNames.of('Hans'); // 簡體  
  3. scriptNames.of('Latn'); // 拉丁文  
  4. scriptNames = new Intl.DisplayNames(['en'], {type: 'script'});  
  5. scriptNames.of('Hans'); // Simplified 
  6. scriptNames.of('Latn'); // Latin 

參考:https://v8.dev/features/intl-displaynames

上述實例用到的國家代號和 code 都可從參考地址獲取。

Intl.DateTimeFormat(國際化處理日期時間格式)

Intl.DateTimeFormat API 用來處理特定語言環境的日期格式。 

  1. const date = new Date();  
  2. // Sunday, January 10, 2021 at 9:02:29 PM GMT+8  
  3. new Intl.DateTimeFormat('en-US', { dateStyle: 'full', timeStyle: 'long'}).format(date)  
  4. // 21/1/10 中國標準時間 下午9:02:29.315  
  5. new Intl.DateTimeFormat('zh-CN', {  
  6.   year: '2-digit',  
  7.   month: 'numeric',  
  8.   day: 'numeric',  
  9.   hour: 'numeric',  
  10.   minute: 'numeric',  
  11.   second: 'numeric',  
  12.   fractionalSecondDigits: 3,  
  13.   timeZoneName: 'long'  
  14. }).format(date) 

參考: 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat

String.prototype.matchAll (throws on non-global regex)

matchAll() 返回一個包含所有匹配正則表達式的結果,返回值為一個不可重用(不可重用意思為讀取完之后需要再次獲取)的迭代器。

matchAll() 方法在 Node.js v12.4.0 以上版本已支持,該方法有個限制,如果設置的正則表達式沒有包含全局模式 g ,在 Node.js v14.5.0 之后的版本如果沒有提供會拋出一個 TypeError 異常。 

  1. // const regexp = RegExp('foo[a-z]*','g'); // 正確  
  2. const regexp = RegExp('foo[a-z]*'); // 錯誤,沒有加全局模式  
  3. const str = 'table football, foosball, fo' 
  4. const matches = str.matchAll(regexp); // TypeError: String.prototype.matchAll called with a non-global RegExp argument  
  5. for (const item of matches) {  
  6.   console.log(item);  

參考:

https://node.green/#ES2020-features-String-prototype-matchAll-throws-on-non-global-regex

Async Local Storage(異步本地存儲)

Node.js Async Hooks 模塊提供了 API 用來追蹤 Node.js 程序中異步資源的聲明周期,在最新的 v14.x LTS 版本中新增加了一個 AsyncLocalStorage 類可以方便實現上下文本地存儲,在異步調用之間共享數據,對于實現日志鏈路追蹤場景很有用。

下面是一個 HTTP 請求的簡單示例,模擬了異步處理,并且在日志輸出時去追蹤存儲的 id。 

  1. const http = require('http');  
  2. const { AsyncLocalStorage } = require('async_hooks');  
  3. const asyncLocalStorage = new AsyncLocalStorage();  
  4. function logWithId(msg) {  
  5.   const id = asyncLocalStorage.getStore();  
  6.   console.log(`${id !== undefined ? id : '-'}:`, msg);  
  7.  
  8. let idSeq = 0 
  9. http.createServer((req, res) => {  
  10.   asyncLocalStorage.run(idSeq++, () => {  
  11.     logWithId('start');  
  12.     setImmediate(() => {  
  13.       logWithId('processing...');  
  14.       setTimeout(() => {  
  15.         logWithId('finish');  
  16.         res.end();  
  17.       }, 2000)  
  18.     });  
  19.   });  
  20. }).listen(8080); 

下面是運行結果,我在第一次調用之后直接調用了第二次,可以看到我們存儲的 id 信息與我們的日志一起成功的打印了出來。

image.png

便利性的同時也會犧牲一些性能上的代價。

ES Modules 支持

ES Modules 的支持總體上來說是個好事,進一步的規范了 Node.js 與瀏覽器的模塊生態,使之進一步趨同,同時避免了進一步的分裂。

在當前 Node.js v14.x LTS 版本中已移除試驗性支持,現在使用無需使用標志了,它使用 import、export 關鍵字,兩種使用方式:

使用 .mjs 擴展名 

  1. // caculator.mjs  
  2. export function add (a, b) {  
  3.   return a + b;  
  4. };  
  5. // index.mjs  
  6. import { add } from './caculator.js';  
  7. console.log(add(4, 2)); // 6 

告訴 Node.js 將 JavaScript 代碼視為 ES Modules

默認情況下 Node.js 將 JavaScript 代碼視為 CommonJS 規范,所以我們要在上面使用擴展名為 .mjs 的方式來聲明,除此之外我們還可以在 package.json 文件中 設置 type 字段為 module 或在運行 node 時加上標志 --input-type=module 告訴 Node.js 將 JavaScript 代碼視為 ES Modules。 

  1. // package.json  
  2.  
  3.   "name": "esm-project",  
  4.   "type": "module",  
  5.   ...  

前端的同學可能會對以上使用 ES Modules 的方式很熟悉。

Top-Level Await(頂級 await 支持)

頂級 await 支持在異步函數之外使用 await 關鍵字,在 Node.js v14.x LTS 版本中已去掉試驗性支持,現在使用也不再需要設置標志。 

  1. import fetch from 'node-fetch';  
  2. const res = await fetch(url) 

也可以像調用函數一樣動態的導入模塊。 

  1. const myModule = await import('./my-module.js'); 

對于異步資源,之前我們必須在 async 函數內才可使用 await,這對一些在文件頂部需要實例化的資源可能會不 好操作,現在有了頂級 await 我們可以方便的在文件頂部對這些異步資源做一些初始化操作。

Diagnostic report(診斷報告)

Diagnostic report 是 Node.js v14.x LTS 提供的一個穩定功能,在某些情況下會生成一個 JSON 格式的診斷報告,可用于開發、測試、生產環境。報告會提供有價值的信息,包括:JavaScript 和本機堆棧信息、堆統計信息、平臺信息、資源使用情況等,幫助用戶快速追蹤問題。

https://github.com/IBM/report-toolkit 是 IBM 開發的一個款工具,用于簡化報告工具的使用,如下是一個簡單 Demo 它會造成服務的內存泄漏。 

  1. const total = [];  
  2. setInterval(function() {  
  3.   total.push(new Array(20 * 1024 * 1024)); // 大內存占用,不會被釋放  
  4. }, 1000) 

最終生成的 JSON 報告被 report-toolkit 工具診斷的結果可能是下面這樣的。

Stream

新版本中包含了對 Stream 的一些更改,旨在提高 Stream API 的一致性,以消除歧義并簡化 Node.js 核心各個部分的行為,例如:

  •  http.OutgoingMessage 與 stream.Writable 類似
  •  net.Socket 的行為與 stream.Duplex 完全相同
  •  一個顯著的變化 autoDestroy 的默認值為 true,使流在結束之后始終調用 _destroy

參考:

https://nodejs.medium.com/node-js-version-14-available-now-8170d384567e

使用異步迭代器

使用異步迭代器我們可以對 Node.js 中的事件、Stream 亦或者 MongoDB 返回數據遍歷,這是一件很有意思的事情,盡管它不是 Node.js v14.x 中新提出的功能,例如 event.on 是在 Node.js v12.16.0 才支持的,這些目前看到的介紹還不太多,因此我想在這里做下簡單介紹。

在 Events 中使用

Node.js v12.16.0 中新增了 events.on(emitter, eventName) 方法,返回一個迭代 eventName 事件的異步迭代器,例如啟動一個 Node.js 服務可以如下這樣寫,想知道它的原理的可以看筆者下面提到的相關文章介紹。 

  1. import { createServer as server } from 'http';  
  2. import { on } from 'events';  
  3. const ee = on(server().listen(3000), 'request');  
  4. for await (const [{ url }, res] of ee)  
  5.   if (url === '/hello')  
  6.     res.end('Hello Node.js!');  
  7.   else  
  8.     res.end('OK!'); 

在 Stream 中使用

以往我們可以通過 on('data') 以事件監聽的方式讀取數據,通過異步迭代器可以一種更簡單的方式實現。 

  1. async function readText(readable) {  
  2.   let data = '' 
  3.   for await (const chunk of readable) {  
  4.     data += chunk;  
  5.   }  
  6.   return data;  

目前在 JavaScript 中還沒有被默認設定 [Symbol.asyncIterator] 屬性的內建對象,在 Node.js 的一些模塊 Events、Stream 中是可使用的,另外你還可以用它來遍歷 MongoDB 的返回結果。 

 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2009-11-11 16:37:50

ADO.NET新增特性

2023-07-19 08:03:05

Future異步JDK

2010-02-02 09:08:39

Python 特性

2009-07-09 16:29:19

JDK版本

2025-02-20 09:52:45

C# 6開發代碼

2012-11-16 11:11:06

深度影音Linux Deepi

2022-03-15 14:11:21

iOS蘋果操作系統

2010-02-04 09:17:26

Visual Stud

2009-04-27 13:42:38

SQL Server Hierarchyid微軟

2013-02-25 14:08:56

Windows Ser

2025-05-07 08:30:00

2013-10-11 09:41:01

Windows 8.1支付寶

2010-09-29 14:08:31

2022-05-25 07:22:07

ES12JavaScript語言

2017-11-16 15:54:01

2009-07-09 14:57:56

Java Consol

2012-06-21 09:21:06

微軟Windows Pho

2009-09-08 11:26:35

Spring 3.0

2009-10-22 08:54:56

WF4 Beta 2

2010-01-25 10:11:32

Oracle 11g
點贊
收藏

51CTO技術棧公眾號

中文字字幕在线中文乱码电影| 亚洲精品影视| 一区二区三区回区在观看免费视频| 色婷婷在线播放| 欧美日韩在线免费视频| 黄色大片在线| 91久久精品久久国产性色也91| 日韩av在线播放中文字幕| 激情网站五月天| 欧洲一区二区av| a优女a优女片| 欧美日韩久久一区二区| 成人免费网址在线| 国产拍欧美日韩视频二区| 日本中文字幕网址| 成人国产在线观看| 免费超爽大片黄| 美国毛片一区二区三区| 真人做人试看60分钟免费| 丝袜a∨在线一区二区三区不卡| 国产美女被下药99| 国产亚洲欧美日韩在线观看一区二区 | 成人免费网站www网站高清| 久久精品国产综合| 国产不卡一区| 特级西西444www大精品视频| 在线视频观看日韩| 中国成人在线视频| 亚洲日韩欧美一区二区在线| 天堂在线免费av| 在线观看亚洲精品视频| 亚洲最新合集| 欧美一区二区三区四区视频| 亚洲区欧洲区| 中文字幕欧美日韩| 91九色鹿精品国产综合久久香蕉| 国产精品av网站| 中文字幕免费精品| 夜夜爽www精品| 一区二区三区 在线观看视频| 成人午夜影院| 日韩一区二区在线免费观看| av免费不卡| 欧美亚洲成人免费| 久久99国产精品久久99| 最近中文字幕一区二区| 日韩一区二区三区视频在线 | 美女爽到高潮91| 99热99在线| 亚洲国产成人av在线| 国产成人精品亚洲线观看| 久久国产精品精品国产色婷婷| 91蜜桃婷婷狠狠久久综合9色| 在线观看的av| 亚洲成人黄色网| av亚洲在线观看| 久久久精彩视频| 国产精品毛片大码女人| 久操视频在线观看| 国产精品成人一区二区三区吃奶| 久久综合九色综合欧美狠狠| 中文字幕人妻熟女人妻洋洋| 欧美日韩一区二区三区在线免费观看| 精品国产乱码久久久久| 国产在线精品免费av| 毛片在线播放网址| 亚洲欧美另类中文字幕| 国产成人福利av| 男人的天堂avav| 亚洲一区二区中文在线| 三级成人在线| 91在线视频一区| 成人黄页毛片网站| 在线免费观看的av网站| 国产suv精品一区二区| 91论坛在线播放| 1234区中文字幕在线观看| 欧美在线一级视频| 国产日韩欧美高清在线| 日韩成人手机在线| 国产福利精品一区二区| www.久久久精品| 亚洲国产成人在线播放| 欧美激情亚洲| 国产色a在线观看| 欧美国产亚洲精品久久久8v| 蜜臀av性久久久久蜜臀aⅴ流畅| 青青草超碰在线| 国产精品专区一| 国产视频在线观看一区二区三区| 日韩在线免费| 日本一道在线观看| 精品视频www| 性欧美xxxx大乳国产app| 91在线网址| 欧美性xxxx69| 91精品欧美福利在线观看| 一本一本久久a久久综合精品| 最新中文字幕在线观看| 国产成人在线播放| 性久久久久久久久久久久| 首页亚洲中字| 免费女人黄页| 国产精品成人观看视频国产奇米| 成人欧美一区二区三区1314| 制服丝袜专区在线| 国产精品h视频| 一区二区三区视频免费| 东方aⅴ免费观看久久av| 欧美在线va视频| 人妻精品无码一区二区三区| 欧美成人免费大片| 亚洲视频在线观看三级| 欧美交a欧美精品喷水| 日韩精品xxxx| 欧美在线视频一区二区| 一区二区三区精品视频| 国产精品国码视频| 波多野结衣在线高清| 国产日韩欧美大片| 日韩中文av在线| 亚洲美女淫视频| 黄色精品网站| 日本片在线观看| 青青艹视频在线| 国产日韩亚洲欧美| 欧美日韩一区在线观看| 国产一区二区伦理片| 国产成人精品一区二区三区免费| 久在线观看视频| 国产亚洲视频在线观看| 国产午夜精品一区二区| 2023国产精品久久久精品双 | 亚洲精品之草原avav久久| 成人免费视频一区| 欧美日韩国产高清电影| www日韩tube| 日韩黄色影视| 九色精品美女在线| 日本一区二区三区国色天香| 少妇精品久久久一区二区| 黄污网站在线观看| 7799精品视频| 久久久久久**毛片大全| 91精品1区| 亚洲天堂免费电影| 亚洲精品视频导航| 免费成人看片网址| 亚洲欧美日韩天堂一区二区| hitomi一区二区三区精品| 久久精品亚洲人成影院| 自拍偷拍亚洲视频| 三级ai视频| 中文字幕在线中文字幕日亚韩一区 | 在线精品视频免费观看| 国产成人高清在线| 秋霞欧美视频| 日本.亚洲电影| 欧美日韩伦理片| 韩国一区二区av| 成人精品网站在线观看| 亚洲人成网站免费播放| 日韩欧美在线一区| 国产精品综合在线视频| 成人久久电影| 欧美大片免费观看网址| 高清中文字幕一区二区三区| 午夜欧美福利视频| 欧美日韩另类丝袜其他| 91国语精品自产拍在线观看性色| 欧美日韩国产在线观看| 国产精品三级视频| 精品中文字幕一区二区| 在线精品一区二区| 日韩欧美午夜| 国产成人精品一区二区三区免费| 国产69精品久久app免费版| 亚洲国产成人va在线观看麻豆| 青青草综合视频| 久久久久久久久久久久久9999| 欧美激情一区二区三区久久久| 精品av久久707| 欧美久久久久免费| 欧美日韩国产精品一区二区不卡中文| 91色.com| 夜夜嗨av一区二区三区网站四季av| 九九综合在线| 日韩精品一区二区三区免费视频| 青青在线视频| 一级毛片视频在线观看| 97色伦图片97色伦在线电影| 视频二区在线播放| 黑森林福利视频导航| 国产 国语对白 露脸| 亚洲国产精品一区在线观看不卡| 精品国产免费久久久久久尖叫| 亚洲最大福利网站| 91夜夜揉人人捏人人添红杏| 欧美高清在线观看| www国产91|