吐槽一下ESM的import語法
對,這其實(shí)是一篇凡學(xué)作品。
ESM即EcmaScript Module,也就是基于EcmaScript模塊規(guī)范的JavaScript模塊,至于為什么叫ESM,是因為在它出現(xiàn)之前,JavaScript已經(jīng)有了例如CommonJS和AMD的其他模塊規(guī)范。
ESM有兩種引入方式,static import和dynamic import,static import會在腳本執(zhí)行前完成引入,因此必須位于所有非import語句之前,dynamic import會在調(diào)用時異步執(zhí)行引入,并返回一個Promise。
本文重點(diǎn)吐槽一下static import的語法。它的語法大概如下:
import <identifier> from?<module-name>
這里的module-name是待引入的模塊的模塊名,通常是一個路徑,identifier可以有多種情況,并使用類似解構(gòu)賦值的語法(注意as,static import并不使用解構(gòu)賦值):
import foo from './bar.js'
import * as?foo from './bar.js'
import {?foo, bar, baz?}?from?'./bar.js'
import {?foo as f, bar as br, baz as bz?}?from?'./bar.js'
import foo, {?foo as f,?bar as br, baz as bz?}?from?'./bar.js'
import?foo, * as f?from?'./bar.js'
以及
import <module-name>,
在這種情況下,模塊的值不會被引入,但模塊依然會被執(zhí)行,其副作用會生效。
這種寫法相當(dāng)于import(<module-name>)。
這初看上去和const <identifier> = require(<module-name>),以及const <inentifier> = await import(<module-name>)保持了良好的一致性,但單獨(dú)的require(<module-name>)和import(<module-name>)是合法的,而from <module-name>卻不合語法,相對的,正確的語法是import <module-name>。
然而我們在引入模塊時,首先想到的是引入哪個模塊,然后才是引入這個模塊的哪些部分。
所以這就成了一個問題:因為我們其實(shí)首先寫的是from <module-name>,然后才是import <identifier>,但我們又不能先寫from。
反觀隔壁python,它的import語法之一,就是(比如說
from numpy import ...
把這兩部分倒過來,寫起來會舒服很多,而且自動補(bǔ)全也能更好得發(fā)揮作用了。而現(xiàn)在,如果想利用自動補(bǔ)全,則必須先寫出類似
import {} from <module-name>
的形式,然后再返回到{}。
以上。
另,homebrew的aarch64版已經(jīng)轉(zhuǎn)正有一段時間了,但是homebrew aarch64的qemu還需要等待一段時間。
以及nodejs還是沒有aarch64版。