時代變化太快,快到 node lts 已經更新到 12 了,依稀還記得那天,幾年前的我,還在用着 node 4+版本,轉眼間 node 已經 發佈了 12lts,我也由一個蓬勃向上的少年,變成了一個鹹魚屆的大佬。學不動了學不動了,好的,沒有關係,我相信不少人是這樣的狀態,不要急,學不學的動,不重要,咱們先康康到底有啥,至少,還剩一張嘴。node
說是這樣說沒錯了,親測了下git
// needImport.js
export default '123';
// index.js
import sth from 'needImport';
console.log(sth);
複製代碼
這樣仍是不行,默認語法下仍是不支持js
的esm
形態。換成以下模式就能夠了吧?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
功能包括:緩存
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 prop 了,不過 vscode 會有個紅色警告,並無辦法去掉,告辭。
class Hello {
#world = 'hello, world';
print() {
console.log(this.#world);
}
}
new Hello().print();
複製代碼
node12 將在構建時間以前爲內置庫構建代碼緩存,並將其做爲二進制文件嵌入。主線程可以使用此代碼緩存將啓動時間縮短30%。
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
的發佈是爲了提供一個更穩定和本機的Node
模塊系統,該系統經過在本機JavaScript API
上提供ABI穩定的抽象來防止庫在每次發行時都中斷。node12
結合工做線程提供了對N-API
的改進支持。
http
已將其默認解析器更新爲llhttp
assert
驗證所需的參數並調整鬆散的斷言buffer
改進使其更加穩定和安全async_hooks
刪除不推薦使用的功能global.process
,global.Buffer
的getters
改善process
看完以後,大概是這樣的想法:
腦子:啊,我會了
寫代碼的腦子:我會了個p
好了,總之,藉由此次 lts 的發佈,咱們回顧了一下 node12 帶來的變化,請你們看清現實,擁抱變化。
更多精彩內容,盡在 ihap 技術黑洞
參考資料 github.com/nodejs/node… github.com/nodejs/modu… levelup.gitconnected.com/whats-new-i… github.com/nodejs/node…
記得要點贊、分享、評論三連,更多精彩內容請關注ihap 技術黑洞!