关于ES6的module的循环加载
今天写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的循环加载的更多相关文章
- 实现LoaderCallbacks接口动态循环加载网上图片并展示在手机屏幕上 ...
1.布局xml文件 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/re ...
- vue 循环加载动态组件以及传值
今天遇到一个需求,某个页面是个动态页面,由多个子组件构成. 之前我们的做法是将N个需要的组件import进主页面,然后引用一下即可.但是现在遇到的问题是, 这个动态页面存在多个业务,有的业务需要某几个 ...
- 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式
表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...
- JavaScript 模块的循环加载(循环依赖问题分析)
简介 "循环加载"(circular dependency)指的是,a 脚本的执行依赖 b 脚本,而 b 脚本的执行又依赖 a 脚本. 分析 使用 madge 工具进行循环加载分析 ...
- ES6 import 循环加载
1.示例 (1)a.js import {bar} from './b'; console.log('a.mjs'); console.log(bar); export let foo = 'foo' ...
- seajs1.3.0源码解析之module依赖有序加载
/** * The core of loader */ ;(function(seajs, util, config) { // 模块缓存 var cachedModules = {} // 接口修改 ...
- 网站循环加载监控-C#
背景: 公司有一个报表的网站,服务器或系统不太稳定,导致客户有时候查看报表网址的时候网站打不开或者打开时间过长,影响用户体验 需求: 通过程序循环打开网址了解加载情况,使用谷歌浏览器内核.,程序开发不 ...
- WPF循环加载图片导致内存溢出的解决办法
程序场景:一系列的图片,从第一张到最后一张依次加载图片,形成“动画”. 生成BitmapImage的方法有多种: 1. var source=new BitmapImage(new Uri(" ...
- ES6的新特性(20)—— Module 的加载实现
Module 的加载实现 上一章介绍了模块的语法,本章介绍如何在浏览器和 Node 之中加载 ES6 模块,以及实际开发中经常遇到的一些问题(比如循环加载). 浏览器加载 传统方法 HTML 网页中, ...
随机推荐
- java常用工具(jps等)说明
Java为我们提供了大量的工具辅助我们进行开发,位于jdk目录下的bin目录里,本篇博客将会随时更新相关工具的使用说明. jps 获取当前运行的java应用 lgj@lgj-Lenovo-G470:~ ...
- IDLE打开Python报错 api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案
1.此方法转载至 http://blog.csdn.net/lt_java13/article/details/78814676 2.把C:\Windows\SysWOW64的api-ms-win-c ...
- Docker最全教程——MongoDB容器化(十二)
MongoDB容器化 MongoDB是一个免费的.开源的.跨平台分布式面向文档存储的数据库,由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和 ...
- ASCII Art ヾ(≧∇≦*)ゝ
Conmajia, 2012 Updated on Feb. 18, 2018 What is ASCII art? It's graphic symbols formed by ASCII char ...
- Java开发笔记(八十七)随机访问文件的读写
前面介绍了字符流读写文件的两种方式,包括文件字符流和缓存字符流,但是它们的写操作都存在一个问题:不管是write方法还是append方法,都只能从文件开头写入,而不能追加到文件末尾或者在文件中间某个位 ...
- 对HTML5标签的认识(三)
这篇随笔继续来认识HTML标签.这次随笔主要是对<table>标签的认识和最近我学习到的一些标签来和大家分享. 一.<table>标签 <table>标签的作用主要 ...
- oracle非正常退出后重启实例
sqlplus /nolog 回车 conn / as sysdba 回车 startup 回车(如果被告知已启动,应先执行 shutdown immediate 回车)
- npm --save-dev --save 的区别
我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,比如: --save-dev(-D) --save(-S) 在 package.j ...
- CSRF & CORS
下面转的两篇文章分别说明了以下两个概念和一些解决方法: 1. CSRF - Cross-Site Request Forgery - 跨站请求伪造 2. CORS - Cross Origin Res ...
- 在docker中初次体验.net core 2.0
.net core的跨平台有了Linux,不能没有docker……网上的系列文章一大推,特别是docker还有了中文官网:https://www.docker-cn.com/ .上面说的很清楚了,这里 ...