什么是 ES6 中的动态导出
What qualifies as being a dynamic export in ES6
>我听说 es6 中不允许动态导出/导入。
本网站使用示例export default 5 * 7;
就好像它是合法的静态出口一样。这似乎是合理的,因为它清楚地评估为静态值 35,但我想知道现在究竟什么有资格作为静态导出。
本准则使用export default Backbone.Router.extend({...});
,就好像它是合法的、静态的出口一样。这对我来说似乎很可疑,因为它对我来说似乎是动态导出(导出函数调用的结果)。
第二个示例仅导出函数调用的结果,该结果是静态的。该函数仅调用一次,因此每次导入时结果将始终相同。
举个例子来说明:
f.js
function f() {
return 2 * Math.random();
}
export default f(); // Is called, before the export is defined. Result: 1.23543
i1.js
import f from 'f';
console.log(f); // 1.23543
i2.js
import f from 'f';
console.log(f); // 1.23543 as well
所有导出在 ES6 中都是静态的,也就是说,它们导出的名称解析为导出模块中的一个变量绑定,这可以通过在评估模块代码之前进行一次查看来确定。
模块不能通过执行代码动态添加或删除导出,导出名称的列表由声明固定。
此变量是否包含常量或函数调用的结果并不重要,它是否包含基元值或对象也不重要。它甚至不需要是一个常量,变量的内容可能会随着时间的推移而变化(请参阅此处的示例)。
从import
语句导入的所有内容也是静态的,这意味着您可以在不执行任何模块代码的情况下浏览依赖关系图。
动态导入是通过显式调用模块加载器来完成的。此类负载可能取决于模块的控制流,并且可能因运行而异。代码需要手动处理进程的异步性和潜在错误。
您实际上可以通过命名导出进行"动态"导出。
如果你做这样的事情
let awesome = 42;
export { awesome };
您正在导出变量而不是值的绑定
您可以稍后执行此操作
import { awesome } from './awesome';
awesome = 100;
导入awesome
的任何位置现在都将获得更新的值,无论导入awesome
的时间如何
参考资料: https://github.com/getify/You-Dont-Know-JS/blob/2nd-ed/es-next-beyond/ch3.md#exporting-api-members
您还可以进行动态导入
import('/modules/my-module.js')
.then((module) => {
// Do something with the module.
});
参考: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
- 无法从 jQuery RSS Feed 中的 localStorage 动态替换类
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 动态分配GA增强型电子商务跟踪器
- onkeyup无法动态创建多个文本区域
- ES6构造函数返回基类的实例
- 使用systemJS的相对动态加载,使用ES6/Babel语法
- ES6:条件和动态导入语句
- 什么是 ES6 中的动态导出
- ES6计算(动态)属性名称
- 在ES6中创建一个具有动态名称的类实例
- ES6动态类名
- 如何在ES6中动态创建/生成原型对象
- (React ES6)动态添加模态触发器到地图标记
- ES6动态链接承诺
- 向ES6类动态添加函数的正确方法
- Javascript (ES6)模块:是否可以导出具有动态名称的变量
- 来自ES6中的类的动态方法调用
- ES6解构,动态赋值
- 动态ES6模块作用域
- 使用ES6语法和动态路径导入模块