假设我有这样的陈述:
import * as bar from 'foo/bar';
我有几个问题:
/bar
位是什么意思? 答案 0 :(得分:1)
首先为第一和第二个问题提供背景,让我们进一步分解该陈述的所有部分:
import * as quux from 'foo/bar';
注意:您的示例中的第一个bar
实例已故意更改为quux
以消除以下几点的歧义。
统称为 导入声明 ,或更具体地说; ECMA-262 Imports Syntax Specification中定义的 导入声明 。
import
部分称为 导入关键字 。
* as quux
部分称为 NameSpace导入 。
*
表示bar
中所有导出的绑定都将导入到新创建的名为quux
的命名空间对象中。结果是quux
对象将保留bar
所有导出的成员。quux
部分被称为 导入的绑定 ,如前所述,它被用作新创建的命名空间对象的名称 from 'foo/bar'
部分称为 From Clause 。
foo/bar
部分是 String Literal ,被称为 模块说明符 ...它只是一个文件路径
/bar
位是什么意思?
它是 模块说明符 的一部分,它是 From Clause 的一部分。它只是对将从中导入导出成员的文件名的引用。在此示例中,其导出的成员将导入名为quux
的新名称空间对象。
关于什么是实际的“part”被调用; ECMA-262没有为它提供具体的参考/名称,但是,我将该部分称为文件名; (即要导入的模块的文件路径中的文件名)。
据我所知,/bar
可能需要也可能不需要包含文件扩展名(即/bar.js
)。同样, ECMA-262 Imports Syntax 中没有任何内容强制执行此操作。 ECMAScript仅定义模块的语法,而不是加载它们的特定机制。因此,有或没有.js
后缀的要求可能因实施而异。例如:
.js
后缀。.js
文件扩展名。 注意:由于ES6模块目前有Stability Index 2,因此可能会发生变化。 是否有针对此的特定(google-able)术语?
非本身,因为ECMA没有具体命名。你可以尝试用谷歌搜索我之前提到的一些术语/术语。
这是否能提高效率(减少模块膨胀)?
我不确定我完全明白“module bloat”的含义。但是,如果您的意思是它会导致应用程序代码中的模块更少?我认为不是,它更可能导致模块的使用增加。
从原生 ES6模块支持中获得效率提升。它本身的支持本质上可以带来速度/性能提升。 ES6模块的其他好处是:
ES6模块具有静态可分析性,允许通过名为 Tree Shaking 的进程消除死/未使用的代码。更多信息here和here。那么,如果你的意思是“模块臃肿”这个词 - 那么是的;执行 Tree Shaking 的工具将删除未使用/死代码。
<强>买者强>;我不是100%肯定在 NameSpace Import 中使用通配符/星号(*
)时,执行 Tree Shaking 的工具是否能够删除死代码。导入您将使用的特定成员,即 MAY ,即
import { foo, bar, quux } from './foo/bar.js';
这是ECMAScript的官方标准。
您提供的示例包含 NameSpace Import ,因此还有另一个好处 - 它有助于避免命名空间冲突。
提到了更多好处here。
如何在NPM上捆绑common-js模块(理想情况下是Rollup)并支持这种语法?
Rollup使用一个名为rollup-plugin-commonjs的插件,它将CommonJS模块转换为ES6,因此它们可以包含在Rollup包中。