javascript - 为什么在函数内部等待导入而不是顶级导入?

标签 javascript async-await es6-modules dynamic-import

在大型代码库中,存在这样的await import语句

const { "default": MenuView } = await import('./menu/MenuView');
const { "default": MenuViewModel } = await import('./menu/MenuViewModel');

这是一个更大的背景:

import { View } from 'backbone.marionette';
import RivetsBehavior from 'behaviors/RivetsBehavior';
import tpl from './Mask.HeaderView.html';
import './Mask.HeaderView.scss';


export default View.extend({
  behaviors: [RivetsBehavior],
  template: tpl,

  regions: {
    menu: ".mask-menu"
  },

  async onRender() {
    const { "default": MenuView } = await import('./menu/MenuView'); // <---------------
    const { "default": MenuViewModel } = await import('./menu/MenuViewModel'); // <-----

    const oMenuViewModel = new MenuViewModel();
    oMenuViewModel.setOptions(this.options);

    this.showChildView('menu', new MenuView({
        model: oMenuViewModel
    }));
  }
});

我将导入移至文件顶部:

import { View } from 'backbone.marionette';
import RivetsBehavior from 'behaviors/RivetsBehavior';
import tpl from './mask.HeaderView.html';
import './mask.HeaderView.scss';
import MenuView from './menu/MenuView'; // <---------------------------- here
import MenuViewModel from './menu/MenuViewModel'; // <------------------- here


export default View.extend({
  behaviors: [RivetsBehavior],
  template: tpl,

  regions: {
    menu: ".maskn-menu"
  },

  async onRender() {
    // const { "default": MenuView } = await import('./menu/MenuView'); <------------ no
    // const { "default": MenuViewModel } = await import('./menu/MenuViewModel'); <-- no

    const oMenuViewModel = new MenuViewModel();
    oMenuViewModel.setOptions(this.options);

    this.showChildView('menu', new MenuView({
        model: oMenuViewModel
    }));
  }
});

一切似乎都很顺利。但我担心我错过了什么。

问题

  1. 为什么不简单地将这些等待导入与其他导入一起放在文件顶部?
  2. 这可能与性能有关吗?在示例中只有 2 个等待导入,但代码库有例如一个文件包含 60 个函数,每个函数中有 2 个等待导入。每个函数都会导入不同的东西。
  3. 这是否与 UI 体验相关(即避免阻塞 UI)。

最佳答案

静态导入也应该可以正常工作。两个代码都应该有效。

但是当您动态导入这些模块时,在这种情况下可能会更好一些:

模块是静态导入的,它们将在执行导入它们的模块之前执行。与此相反,当导入在 onRender 函数中时,导入的模块将在第一次调用该函数时进行评估。

这样,我们就可以推迟导入模块的执行,直到真正需要它们为止。如果从未调用 onRender,则根本不会导入这些模块。

因此,虽然您的版本也可以工作,但原始版本可能会更好一些(但这也取决于 onRender 函数的调用方式)。

关于javascript - 为什么在函数内部等待导入而不是顶级导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60972592/

相关文章:

javascript - 切换其中一个 div 时关闭其他打开的 div

javascript - 如何使用哈希标签 ("a name") 转到页面上的位置但在顶部占固定元素?

javascript - 将带逗号的字符串转换为数组

c# - 发送电子邮件后代码挂起,但电子邮件发送正常(静态异步任务)

javascript - += 的异步函数

javascript - @syncfusion/ej2-ng-grids 中 GridComponent 的依赖关系解决

javascript - react native - 在 package.json 中使用别名进行绝对导入

javascript - 使用 JavaScript 使用箭头键移动图像

C# 5 async/await 简单解释

javascript - 我可以将 javascript 模块与 "regular"javascript 混合使用吗?