鹹魚你該翻身起來學習了,node lts 12正式發佈

時代變化太快,快到 node lts 已經更新到 12 了,依稀還記得那天,幾年前的我,還在用着 node 4+版本,轉眼間 node 已經 發佈了 12lts,我也由一個蓬勃向上的少年,變成了一個鹹魚屆的大佬。學不動了學不動了,好的,沒有關係,我相信不少人是這樣的狀態,不要急,學不學的動,不重要,咱們先康康到底有啥,至少,還剩一張嘴。node

import/export 脫離 --experimental-modules

說是這樣說沒錯了,親測了下git

// needImport.js
export default '123';

// index.js
import sth from 'needImport';

console.log(sth);
複製代碼

這樣仍是不行,默認語法下仍是不支持jsesm形態。換成以下模式就能夠了吧?github

// needImport.mjs
export default '123';

// index.mjs
import sth from 'needImport';

console.log(sth);
複製代碼

實測,仍是不行,大豬蹄子,說好lts以後就能夠關掉呢,爲何node index.mjs仍是走internal/modules/cjs/loader.js:1007,童話裏都是騙人的,實測一下,若是想用import/export語法,仍是要用experimental-modules,不過目前的lts只是以前的current直接升lts了,等一等應該就能夠了。json

--experimental-modules 新增了一些功能

功能包括:緩存

1. 能夠在package.json文件中頂級位置增長"type": "module"的形式,讓你的js文件變成mjs文件安全

妙啊,就是我以前這麼多.mjs文件,要特麼手動改一下了。可是這個更新以後,我發現一個奇怪的問題:async

// a/index.js
export default '123';

// index.js
import sth from './a';
複製代碼

本來在cjs模式下,咱們都知道當直接引用文件夾a的時候,若是若是發現a是個文件夾,會默認調用a/index.?js來調用,可是12的--experimental-modules彷佛取消了這個特性,我查了下相關 issue ,發現有至關長的討論,關因而否默認調用index.?js這個事情。官方的說法是不必定全部人都會認爲index是默認,有些人可能認爲main是默認,因此須要一個新的參數--es-module-specifier-resolution=node,這個參數下會以require的模式加載。函數

2. .cjs擴展名性能

.cjs擴展名明確文件被視爲commonjs,好像就是後宮移位了,esm成功上位,cjs逐步要進入冷宮了。ui

3. --input-type flag

使用--input-type = module將字符串輸入(經過--eval,--print或STDIN)做爲ES模塊運行。 --input-type標誌能夠是--input-type = module或--input-type = commonjs。

4. 明確的文件名

哎,這裏就是了,新的實驗模塊的默認狀況下,會啓用明確的文件名,也就是 1 裏面提到的問題,--es-module-specifier-resolution=node會按照 CommonJS-style 自動擴展解析,--es-module-specifier-resolution=explicit則表示要明確文件名。Package Name不受影響。

5. module.createRequireFromPath

ES模塊中未定義"CommonJS globals"(require, exports, module, __filename, __dirname)。可是,module.createRequireFromPath()可用於建立要在ES模塊上下文中使用的CommonJS require函數。

6. import for JavaScript only

如今.json不能被直接用import引用了,不過新增了--experimental-json-modules這個flag,嗯,加了就能夠import fjson from 'json';

private

類裏如今可使用 private prop 了,不過 vscode 會有個紅色警告,並無辦法去掉,告辭。

class Hello {
  #world = 'hello, world';

  print() {
    console.log(this.#world);
  }
}

new Hello().print();
複製代碼

v8 引擎升級

改善了啓動性能

node12 將在構建時間以前爲內置庫構建代碼緩存,並將其做爲二進制文件嵌入。主線程可以使用此代碼緩存將啓動時間縮短30%。

TLS

Node如今支持TLS 1.3,它提供了更高的安全性並減小了延遲。 TLS 1.3是對該協議的重大更新,而且正在經過Web進行積極集成。經過實施TLS 1.3,Node應用程序將增長最終用戶的隱私,同時還能夠經過減小HTTPS握手所需的時間來提升請求的性能。此外,默認狀況下已禁用TLS 1.0和1.1,而且加密庫已刪除不推薦使用的功能。

堆大小改進

之前使用默認的V8堆大小,對應於700MB(32位系統)或1400MB(64位系統)。如今,node將根據可用內存肯定堆大小,這將確保其使用的資源不超過容許的資源。

堆轉儲功能

node12 提供了生成堆轉儲的功能,使調查內存問題更加容易。

實驗診斷報告

經過提供實驗性診斷報告功能,Node提供了改進的診斷應用程序中問題(性能,CPU使用率,內存,崩潰等)的能力。

本機模塊N-API的改進

N-API的發佈是爲了提供一個更穩定和本機的Node模塊系統,該系統經過在本機JavaScript API上提供ABI穩定的抽象來防止庫在每次發行時都中斷。node12 結合工做線程提供了對N-API的改進支持。

其餘

  • 輔助線程再也不須要標誌
  • http已將其默認解析器更新爲llhttp
  • assert驗證所需的參數並調整鬆散的斷言
  • buffer改進使其更加穩定和安全
  • async_hooks刪除不推薦使用的功能
  • global.processglobal.Buffergetters改善process
  • A new welcome message for repl(???)

看完以後,大概是這樣的想法:

腦子:啊,我會了

寫代碼的腦子:我會了個p

好了,總之,藉由此次 lts 的發佈,咱們回顧了一下 node12 帶來的變化,請你們看清現實,擁抱變化。

更多精彩內容,盡在 ihap 技術黑洞

參考資料 github.com/nodejs/node… github.com/nodejs/modu… levelup.gitconnected.com/whats-new-i… github.com/nodejs/node…



記得要點贊、分享、評論三連,更多精彩內容請關注ihap 技術黑洞!

相關文章
相關標籤/搜索