Node.js v17來了,Nodejs能崛起嗎?

2022-01-29 程序猿小左

Node.js v17 版本已發布,在這個版本中提供了一些新的功能:

基於 Promise 的其它核心模塊 API       

錯誤堆棧尾部增加 Node.js 版本信息

OpenSSL 3.0 支持

v8 JavaScript 引擎更新至 9.5。

基於 Promise 的 API

Node.js 項目的一直計劃著為 Node.js 核心模塊提供基於 Promise 的 API 支持,並且近年來已經為 timer、stream 模塊提供了 Promise API 支持。

在Node.js v17 版本中又為 readline 模塊提供了基於 Promise 的 API 支持。可以利用該模塊的一個接口以流對象的形式逐行讀取數據。利用 process.stdin 可讀取用戶在終端輸入的數據。如下例所示:

// test.mjs
import * as readline from "node:readline/promises";
import { stdin as input, stdout as output } from 'process';
const rl = readline.createInterface({ input, output });
const answer = await rl.question('「Nodejs技術棧」 的域名是什麼:');
console.log(`答案: ${answer}`);
rl.close();

運行之後,效果如下所示:

在錯誤堆棧中增加 Node 版本信息

我們平時開發時,遇到錯誤時,從錯誤堆棧中分析應用程式錯誤信息至關重要,在 Node.js v17 版本中,如果因為一些致命的錯誤導致進程退出,在錯誤堆棧的尾部將包含 Node.js 的版本信息。

運行時在命令行指定 --no-extra-info-on-fatal-exception 標誌可以忽略該信息。

支持OpenSSL 3.0 

Node.js v17 版本內置了 OpenSSL 3.0。因為 OpenSSL 3.0 對允許的算法和密鑰大小增加了嚴格的限制,預計會對生態系統造成一些影響,在 Node.js v17 版本包含 OpenSSL 3.0 以便在下一個 LTS 版本之前為用戶的測試和反饋留出時間。

例如,md4 這是 OpenSSL 3.0 默認不再允許的一個算法,如果是在 Node.js 17 之前的 Node 版本中,應用程式是可以正常運行的,但在 Node.js v17 中將拋出一個 error code 為 ERR_OSSL_EVP_UNSUPPORTED 的錯誤信息。

import crypto from 'crypto';
console.log(crypto.createHash('md4').update('123', 'utf8').digest('hex'))

以上代碼在Node.js v17 版本中運行之後會拋出以下錯誤:

解決方法是運行時增加 --openssl-legacy-provider 標誌。

$ node --openssl-legacy-provider test.mjs
c58cda49f00748a3bc0fcfa511d516cb

V8 引擎更新至 9.5

 v8版本在原來的基礎上添加了兩種新的類型:calendar、dateTimeField。分別返回不同的日曆類型和日期時間欄位的顯示名稱,對於國際化應用很有幫助。在 8.1 版本開啟了 Intl.DisplayNames API,支持語言、區域、貨幣、腳本四種類型。

const esCalendarNames = new Intl.DisplayNames(['zh'], { type: 'calendar' });
console.log(esCalendarNames.of('roc')); // 民國紀年
const enCalendarNames = new Intl.DisplayNames(['en'], { type: 'calendar' });
console.log(enCalendarNames.of('roc')); // Minguo Calendar

日期時間欄位國際化名稱展示。

function printDate(dateTimeField) {
console.log(
`${dateTimeField.of('year')} ${dateTimeField.of('month')} ${dateTimeField.of('day')}`
);
}
printDate(new Intl.DisplayNames(['zh'], { type: 'dateTimeField' })) // 年 月 日
printDate(new Intl.DisplayNames(['en'], { type: 'dateTimeField' })) // year month day
printDate(new Intl.DisplayNames(['KOR'], { type: 'dateTimeField' })) // 년 월 일
printDate(new Intl.DisplayNames(['THA'], { type: 'dateTimeField' })) // ปี เดือน วัน

Intl.DateTimeFormat API 在 v8 9.5 版本中為 timeZoneName 選項新增加了四個值:shortGeneric、longGeneric、shortOffset、longOffset。

通過以下代碼示例可看到之間的區別。

console.log(new Intl.DateTimeFormat('zh').format(new Date())); // 2021/01/01
console.log(new Intl.DateTimeFormat('zh', { timeZoneName: 'shortGeneric' }).format(new Date())); // 2021/01/01 中國時間
console.log(new Intl.DateTimeFormat('zh', { timeZoneName: 'longGeneric' }).format(new Date())); // 2021/01/01 中國標準時間
console.log(new Intl.DateTimeFormat('zh', { timeZoneName: 'shortOffset' }).format(new Date())); // 2021/01/01 GMT+8
console.log(new Intl.DateTimeFormat('zh', { timeZoneName: 'longOffset' }).format(new Date())); // 2021/01/01 GMT+08:00

參見 v8 9.5 release 文檔 閱讀更多信息。

其它信息

按照 Node.js 發布時間表,Node.js v12 將於 2022 年 4 月結束生命周期。Node.js v16 在 2021 年 10 月 26 升級為 LTS,即長期支持版本。

相關焦點

  • Node.js v17 來了,看看都有哪些新功能?
    Node.js v17 版本已發布,取代了 v16 做為當前版本,新的 v17 版本提供了一些新功能:基於 Promise 的其它核心模塊 API、錯誤堆棧尾部增加 Node.js 版本信息、OpenSSL 3.0 支持、v8 JavaScript 引擎更新至 9.5。
  • nodejs入門教程之包管理器npm(十三)
    學習背景你是不是經常需要在自己的項目中引入別人的代碼,你是不是有時候發現自己寫的代碼特別好想分享給別人來用。
  • 深入研究 Node.js 的回調隊列
    請注意,Node.js 負責所有異步活動,因為 JavaScript 可以利用其單線程性質來阻止產生新的線程。在完成後臺操作後,它還負責向回調隊列添加函數。JavaScript 本身與回調隊列無關。這些操作應該是異步的,因為它們留給 Node.js 處理。JavaScript 無法訪問計算機的內部設備。當執行此類操作時,JavaScript 會將其傳輸到 Node.js 以在後臺處理。完成後,它們將會被轉移到 IO 回調隊列中,來進行事件循環,以轉移到調用棧中執行。
  • 【譯】Node.js的eventloop,timers和process.nextTick()
    事件循環機制解析當啟動 Node.js 時,它會初始化 eventloop,處理提供的輸入腳本(或者是丟入REPL,本文檔中沒有涉及到 REPL 相關知識,REPL 詳情請查看 https://nodejs.org/api/repl.html#repl_repl)這會使用 async API  calls(異步 api 調用),安排定時器
  • Node.js(二)
    3、require加載規則直接說結論:require加載本質上都是在加載文件來實現模塊功能我們在加載自定義文件時只需要寫明文件路徑即可(基本都會使用相對路徑)。比如在我們需要在a.js中價值b.js。(假設在同一級目錄),我們只需要寫:var bExports =  require('.
  • 如何使用 npm 管理 NodeJS 包 | Linux 中國
    檢查 node 安裝的位置:$ which node/home/sk/.nvm/versions/node/v9.4.0/bin/node檢查它的版本:$ node -vv9.4.0進入 Node 交互式解釋器:$ node
  • Node 最新 Module 導入導出規範
    對於這種有大量路徑的情況,我們可以用子路徑導出模式來代替:// ./node_modules/es-module-package/package.json{  "exports": {    "./features/*": ".
  • Node.js模塊化
    模塊化介紹模塊化指的就是將一個大的功能拆分為一個一個小的模塊,通過不同的模塊的組合來實現一個大功能。在 Node.js 環境中,默認就支持模塊系統,該模塊系統遵循 CommonJS 規範。在導入模塊時,模塊文件後綴 .js 可以省略,文件路徑不可省略。// app.jsconst logger = require(".
  • 一些小眾卻有用的 Node.js 包
    ,然後在命令行中執行 node index.js -x 3,會看到如下消息:Usage: index.js -x [num] -y [num]Options: -x [required] -y
  • Electron和Node.js環境配置
    1、安裝Nodehttps://nodejs.org/en/ 下載安裝,14.17.6 LTS版本2、安裝electron
  • nodejs入門教程之npm使用教程(十四)
    學習背景接下來我們需要學習許多第三方庫提供的功能與框架,所以學習npm管理依賴是後面學習的基礎。
  • vue.js-使用vue-cli3快速創建項目
    Vue.js 全家桶系列:包含了 vue-router、vuex、vue-resource,以及本文介紹的構建工具 vue-cli。這些是一個完整的 vue 項目的核心構成。一、環境搭建安裝node下載地址:https://nodejs.org2.安裝vue-cli(1)運行如下命令安裝:
  • Node.js幾種創建子進程方法
    execFilechild_process.execFile(file[, args][, options][, callback])const { execFile } = require('child_process')execFile('node
  • 分享一個前後端分離方案-前端angularjs+requirejs+dhtmlx 後端asp.net webapi
    瀏覽器支持IE8+ 實際是為了支持IE8我做了很多的努力,因為angluarjs 1.3已經不再支持IE8了,而我使用的angularjs是1.3.9         引入的一些其它類庫或插件就不列出來了,太多了服務端主要是提供restful數據服務,所以.net下毫無疑問選擇asp.net webapi來實現了。
  • 理解 Node.js 中的 Worker Threads
    是單線程的,但卻可以通過回調、Promises 和 async/await 來儘可能將操作卸載(offloading)到系統內核一個 JS 引擎實例:執行 JavaScript 代碼的程序一個 Node.js 實例:執行 Node.js 代碼的程序換句話說,Node 執行在一個單線程上,並且同一時間,事件循環上只有一個進程、一份代碼、一次執行(代碼無法並行執行
  • Redis+Node.js實現一個能處理海量數據的異步任務隊列系統
    在 NodeJS 中,我們可以使用 node-redis 來操作 Redis。node-redis 支持 Redis 的所有交互操作方式,但是操作結果默認是以回調函數的形式返回。為了能夠使用 async/await,我們可以新建一個 utils.ts 文件,把 node-redis 操作 Redis 的各種操作都封裝成 Promise 的形式,方便我們後續使用。import client from'.