欢迎光临散文网 会员登陆 & 注册

吐槽一下ESM的import语法

2021-01-12 18:06 作者:useStrict  | 我要投稿

对,这其实是一篇凡学作品。


ESM即EcmaScript Module,也就是基于EcmaScript模块规范的JavaScript模块,至于为什么叫ESM,是因为在它出现之前,JavaScript已经有了例如CommonJS和AMD的其他模块规范。

ESM有两种引入方式,static import和dynamic import,static import会在脚本执行前完成引入,因此必须位于所有非import语句之前,dynamic import会在调用时异步执行引入,并返回一个Promise。


本文重点吐槽一下static import的语法。它的语法大概如下:

import <identifier> from <module-name>

这里的module-name是待引入的模块的模块名,通常是一个路径,identifier可以有多种情况,并使用类似解构赋值的语法(注意as,static import并不使用解构赋值):

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>,

在这种情况下,模块的值不会被引入,但模块依然会被执行,其副作用会生效。

这种写法相当于import(<module-name>)。


这初看上去和const <identifier> = require(<module-name>),以及const <inentifier> = await import(<module-name>)保持了良好的一致性,但单独的require(<module-name>)和import(<module-name>)是合法的,而from <module-name>却不合语法,相对的,正确的语法是import <module-name>。

然而我们在引入模块时,首先想到的是引入哪个模块,然后才是引入这个模块的哪些部分。

所以这就成了一个问题:因为我们其实首先写的是from <module-name>,然后才是import <identifier>,但我们又不能先写from。

反观隔壁python,它的import语法之一,就是(比如说

from numpy import ...

把这两部分倒过来,写起来会舒服很多,而且自动补全也能更好得发挥作用了。而现在,如果想利用自动补全,则必须先写出类似

import {} from <module-name>

的形式,然后再返回到{}。


以上。

另,homebrew的aarch64版已经转正有一段时间了,但是homebrew aarch64的qemu还需要等待一段时间。

以及nodejs还是没有aarch64版。

吐槽一下ESM的import语法的评论 (共 条)

分享到微博请遵守国家法律