今天写js时,碰到了一个模块循环加载的错误,下面时例子:

// testa.mjs
import testb from './testb.mjs';

const {b} = testb;

const a = {
  ccc: 'ccc',
};

console.log(`aa:${a}`);
console.log(`ab:${b}`);

export default {
  a,
};

// testb.mjs
import testa from './testa.mjs';

const {a} = testa;

const b = {
  ddd: 'ddd',
};
console.log(`ba:${a}`);
console.log(`bb:${b}`);

export default {
  a,
};

运行testa.mjs后结果为:

testa is not defined
at .../testb.mjs:3:13

翻了翻ES6入门中关于循环加载的部分,猜测JavaScript运行时,碰到import是直接进入引入的模块,运行一遍后再返回原模块运行接下来的代码

翻了翻谷歌的结果,看见有人说“一个避免出问题的方法就是少写立即执行的代码,尽量使用函数封装起来,需要的时候调用函数,就不会出错了。

故把代码修改成如下:

// testa.mjs
import testb from './testb.mjs';

const {b} = testb;

const a = {
  ccc: 'ccc',
};

console.log(`aa:${a.ccc}`);
console.log(`ab:${b.ddd}`);
b.ba();

export default {
  a,
};

// testb.mjs
import testa from './testa.mjs';

const b = {
  ddd: 'ddd',
  ba() {
    const { a } = testa;
    console.log(`ba:${a.ccc}`);
    console.log(`bb:${b.ddd}`);
  },
};console.log(`bb:${b.ddd}`);

export default {
  a,
};

运行后发现还是报错,但是已经输出bb,aa,ab了,与猜想相同。

看了看错误代码:

testa is not defined
at Object.ba (.../testb.mjs:6:19)
at .../testa.mjs:11:3

猜测是在改行调用b.ba()时,testa并未进行模块的输出(指未执行到export default...),故在其外包裹一个0s延迟的setTimeout,代码就如所想的一样执行了。

注:此处0s延时的setTimeout用处是使内部的代码变为异步,其会在其他同步的JavaScript代码运行完毕后再运行,故此时testa已执行了模块的输出,所以并不会报错了。

关于ES6的module的循环加载的更多相关文章

  1. 实现LoaderCallbacks接口动态循环加载网上图片并展示在手机屏幕上 ...

    1.布局xml文件 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/re ...

  2. vue 循环加载动态组件以及传值

    今天遇到一个需求,某个页面是个动态页面,由多个子组件构成. 之前我们的做法是将N个需要的组件import进主页面,然后引用一下即可.但是现在遇到的问题是, 这个动态页面存在多个业务,有的业务需要某几个 ...

  3. 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式

    表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...

  4. JavaScript 模块的循环加载(循环依赖问题分析)

    简介 "循环加载"(circular dependency)指的是,a 脚本的执行依赖 b 脚本,而 b 脚本的执行又依赖 a 脚本. 分析 使用 madge 工具进行循环加载分析 ...

  5. ES6 import 循环加载

    1.示例 (1)a.js import {bar} from './b'; console.log('a.mjs'); console.log(bar); export let foo = 'foo' ...

  6. seajs1.3.0源码解析之module依赖有序加载

    /** * The core of loader */ ;(function(seajs, util, config) { // 模块缓存 var cachedModules = {} // 接口修改 ...

  7. 网站循环加载监控-C#

    背景: 公司有一个报表的网站,服务器或系统不太稳定,导致客户有时候查看报表网址的时候网站打不开或者打开时间过长,影响用户体验 需求: 通过程序循环打开网址了解加载情况,使用谷歌浏览器内核.,程序开发不 ...

  8. WPF循环加载图片导致内存溢出的解决办法

    程序场景:一系列的图片,从第一张到最后一张依次加载图片,形成“动画”. 生成BitmapImage的方法有多种: 1. var source=new BitmapImage(new Uri(" ...

  9. ES6的新特性(20)—— Module 的加载实现

    Module 的加载实现 上一章介绍了模块的语法,本章介绍如何在浏览器和 Node 之中加载 ES6 模块,以及实际开发中经常遇到的一些问题(比如循环加载). 浏览器加载 传统方法 HTML 网页中, ...

随机推荐

  1. python列表的交、并、差集

    #!/usr/bin/env python3 l1 = ['] l2 = ['] # 交集 result1 = [i for i in l1 if i in l2] result2 = list(se ...

  2. 用ASP.NET Core 2.1 建立规范的 REST API -- 缓存和并发

    本文所需的一些预备知识可以看这里: http://www.cnblogs.com/cgzl/p/9010978.html 和 http://www.cnblogs.com/cgzl/p/9019314 ...

  3. 面向对象(__str__和__repr__方法)

    #Author : Kelvin #Date : 2019/1/21 16:19 class App: def __init__(self,name): self.name=name # def __ ...

  4. WebServeice 动态代理类

    1, webservice是什么? 是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序 ...

  5. 解决Windows对JDK默认版本切换问题

    注意修改path路径,或者修改控制面板下的java控制面板并不有效,原因是由于在WINDOWS\System32环境变量中的优先级高于JAVA_HOME设置的环境变量优先级,故如果只修改环境变量JAV ...

  6. acrobat pdf 按页拆分

    百度 https://jingyan.baidu.com/article/37bce2be7098a21002f3a2f2.html 百度acrobat版本比我的高,操作不同了: 我的方案: 组织页面 ...

  7. Spring Cloud项目之断路器集群监控Hystrix Dashboard

    微服务(Microservices Architecture)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完 ...

  8. Ubuntu 16.04 nvidia-smi报错(重装Nvidia驱动)

    之前因为学习TensorFlow,所以在自己的Ubuntu上安装了cuda,cudnn以及Nvidia驱动.但可能是由于自己经常不注重正常关闭自己的Ubuntu,这就导致了一个问题: 某天在查看自己的 ...

  9. 了解AJAX

    1.如何打开终端的快捷键 Window+R==>CMD==>ipconfig 动态页面:跟后台发生数据交互的页面. 前后台数据交互依赖的一项技术叫 ajax. 1. js的异步操作 (1) ...

  10. 你真的懂JavaScript基础类型吗

    夯实Javascript基础. 基本类型有六种: null,undefined,boolean,number,string,symbol. 基本类型的值是保存在栈内存中的简单数据段 基础类型特性 基础 ...