了解 ES6 模块
Understanding ES6 modules
请问有人可以确认我对 ES 模块的理解吗?
在javascripts/bar.js
:
var foo = 2;
export function Bar() {}
在index.html
<script>
import { Bar } from 'javascripts/bar';
var b = new Bar(); // Instantiates an instance of Bar.
</script>
在引擎盖下,ES6引擎在评估import { Bar } from 'javascripts/bar';
时会加载bar.js
,并在通过HTTP返回该模块时阻塞?还是在index.html
评估脚本之前下载bar.js
?
由于bar.js
是使用 import
关键字加载的,因此 bar.js
中的全局域的作用域为该模块,并且全局不可见?
现在,如果我想连接模块,我将继续需要将我的模块包装在 IIFE 中,以便它们的作用域保持不同(或者至少使用在后台执行此操作的构建步骤(?
在引擎盖下,ES6引擎将加载bar.js当它从'javascripts/bar'评估导入{ Bar }时,并在通过HTTP返回该模块时阻止?还是在 index.html 中评估脚本之前下载 bar.js?
目前还没有正确的答案,因为没有关于如何加载模块的规范。ES2015 只指定了模块语法,但运行时如何解释它尚未标准化。例如,最终实现的任何加载程序规范都不太可能允许您像以前那样省略.js
。而且也不太可能允许<script>
标签使用import
.
但是,撇开您所做的任何语法错误,我可以笼统地告诉您浏览器加载程序可能标准化的内容。它是后者:在任何脚本执行发生之前,提前确定并下载导入。(但是,对于 Node.js 加载程序,它可能会阻塞。
因为 bar.js 是使用 import 关键字加载的,所以 bar.js 中的全局域作用域为该模块并且全局不可见?
这取决于你所说的全局变量是什么意思。如果您声明一个全局,例如 window.x = 5
,这仍然会改变全局对象。模块不会弄乱单独的全局对象。
但是,如果您指的是"意外"全局变量,例如在顶级使用 var
或 function
声明声明的全局,则答案是,在模块中,顶级var
和function
声明不会导致定义全局属性。
(请注意,在模块和脚本中,顶级let
和const
声明不会在全局对象上创建属性。
现在,如果我想连接模块,我将继续需要将我的模块包装在 IIFE 中,以便它们的作用域保持不同(或者至少使用在后台执行此操作的构建步骤(?
如果你想连接模块,你将遇到比你描述的更大的问题。例如,import
和export
只能在顶层使用,而不能在 IIFE 内部使用。模块不应该连接,因为这样做对现代浏览器和服务器的性能非常有害。
- 在ES6中,模块将导致多个网络调用,因为两个模块不能在单个文件中定义
- ES6 (ECMAScript 2015) 模块:导入索引.js
- 在一个表达式中加载并使用ES6模块
- 试图将类导出为模块ES6-babel
- ES6模块进口是否吊装
- Webpack通过npm将代码拆分为单独的模块,以及如何编译es6
- 使用ES6模块创建JS
- 无法使用Webpack加载ES6模块
- 可以'I don’我不明白;使用webpack和es6模块进行EventEmitter
- 扩展错误es6类模块问题
- 观察ES6模块属性
- NPM:取决于本地 ES6 模块(无转译)
- 使用 Babel 转译器导入类并调用带有 ES6 模块的静态方法
- 使用 Babel 将 ES6 模块转换为 ES5 AMD 模块,无法按预期工作
- ES6模块导入和依赖关系管理
- 在ES6的“import”语法中,如何准确地评估模块
- browserify/requirejs模块和ES6模块有什么区别
- 使用es6模块:未捕获ReferenceError:define未定义
- 如何通过名称(从模块本身)访问ES6模块变量
- 获取模块ES6