写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译。

  ES6引入外部模块分两种情况:

  1.导入外部的变量或函数等;

import {firstName, lastName, year} from './profile';

  2.导入外部的模块,并立即执行

import './test'
//执行test.js,但不导入任何变量

  第2种情况就不用讲了,就是执行从头到尾执行引入的js文件,当然,会忽略js文件里export。

  下面详细讲第1种情况。

  两个js文件,counter.js与my.js

// counter.js
import {a} from './my';
console.log('333333');
console.log(a);
// my.js
console.log('111111');
export var a = 'aaaaaaa';
console.log('222222');

运行的结果是什么呢?

  貌似没什么问题,再看看转译后的counter.js

//#----------------mod start----------------

void function (module, exports){
window["60ae5ba7"] = {}; "use strict";
// my.js
console.log('111111');
window["60ae5ba7"].a = 'aaaaaaa';
console.log('222222'); }({exports:{}}, {}) //#----------------mod end---------------- //#----------------mod start---------------- void function (module, exports){
window["3d4fdd69"] = {}; "use strict";
// counter.js
var my_1 = window["60ae5ba7"];
console.log('333333');
console.log(my_1.a);

  好,暂时不用管那么多。下面来问题了,咱们把console.log(a)这句去掉,看看运行结果

// counter.js
import {a} from './my';
console.log('333333');
// console.log(a);

  咦,只输出这一句了?我们明明引入了my模块了,为何模块里的代码没有执行呢。

  这要从ES6模块加载的实质谈起。在阮一峰的ES6入门一书里讲到:ES6模块的运行机制与CommonJS不一样,它遇到模块加载命令import时,不会去执行模块,而是只生成一个动态的只读引用。等到真的需要用到时,再到模块里面去取值,换句话说,ES6的输入有点像Unix系统的“符号连接”,原始值变了,import输入的值也会跟着变。

  可是按照上面说的,那有console.log(a)的时候,应该是输出3333,1111,2222的顺序,而不是1111,2222,333的顺序呀。我猜测是上面讲的不细致的原因,应该分为编译时和运行时来说。ES6的这种加载称为“编译时加载”或者静态加载,即 ES6 可以在编译时就完成模块加载,在编译的时候,发现了后面有使用到a的地方,就在运行时遇到import的地方直接执行了模块的代码。当然只是自己的猜测。

  有一点别忘了:模块内部的变量不向外暴露的话,外界是无法使用这些内部变量的。所有有时候会看到,这个模块引用了一个vue.js,另外一个模块也要引用vue.js,这是因为vue.js内部很多东西没有暴露,所以都需要引用。

ES6模块import细节的更多相关文章

  1. ES6 模块的加载实现 import和export

    ES6的Class只是面向对象编程的语法糖,升级了ES5的构造函数的原型链继承的写法,并没有解决模块化问题.Module功能就是为了解决这个问题而提出的. 历史上,JavaScript一直没有模块(m ...

  2. es6模块 nodejs模块和 typescript模块

    es6模块 import和export nodejs模块 require和module.exports typescript模块 module和export

  3. es6 模块与commonJS的区别

    在刚接触模块化开发的阶段,我总是容易将export.import.require等语法给弄混,今天索性记个笔记,将ES6 模块知识点理清楚 未接触ES6 模块时,模块开发方案常见的有CommonJS. ...

  4. ES6模块的import和export用法总结

    ES6之前以前出现了js模块加载的方案,最主要的是CommonJS和AMD规范.commonjs前者主要应用于服务器,实现同步加载,如nodejs.AMD规范应用于浏览器,如requirejs,为异步 ...

  5. ES6模块之export和import详解

    ES6中的模块即使一个包含JS代码的文件,在这个模块中所有的变量都是对其他模块不可见的,除非我们导出它.ES6的模块系统大致分为导出(export)和导入(import)两个模块. 1.模块导出(ex ...

  6. ES6模块的import和export用法

    ES6之前已经出现了js模块加载的方案,最主要的是CommonJS和AMD规范.commonjs主要应用于服务器,实现同步加载,如nodejs.AMD规范应用于浏览器,如requirejs,为异步加载 ...

  7. commonjs模块和es6模块的区别

    commonjs模块与es6模块的区别 到目前为止,已经实习了3个月的时间了.最近在面试,在面试题里面有题目涉及到模块循环加载的知识.趁着这个机会,将commonjs模块与es6模块之间一些重要的的区 ...

  8. Webpack4教程:第一部分,入口、输入和ES6模块

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://wanago.io/2018/07/16/webpack-4-course-par ...

  9. ES6 模块机制

    ES6 实现了模块功能 将文件当作独立的模块,一个文件一个模块 每个模块可以导出自己的API成员,也可以导入其他模块或者模块中特定的API ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模 ...

随机推荐

  1. android自定义控件一站式入门

    自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...

  2. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入

    上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...

  3. 关于Android避免按钮重复点击事件

    最近测试人员测试我们的APP的时候,喜欢快速点击某个按钮,出现一个页面出现多次,测试人员能不能禁止这样.我自己点击了几下,确实存在这个问题,也感觉用户体验不太好.于是乎后来我搜了下加一个方法放在我们U ...

  4. C#开发微信门户及应用(39)--使用微信JSSDK实现签到的功能

    随着微信开逐步开放更多JSSDK的接口,我们可以利用自定义网页的方式来调用更多微信的接口,实现我们更加丰富的界面功能和效果,例如我们可以在页面中调用各种手机的硬件来获取信息,如摄像头拍照,GPS信息. ...

  5. 常用 meta 整理

    <!-- 针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓 --> <meta name="HandheldFriendly" con ...

  6. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  7. Linux 安装Mono环境 运行ASP.NET(一)

    1.先看一下Linux环境下面请求的过程,(画的不是很好,简单的了解一下原理.) .NET跨平台其实需要这三个关键:编译器.CLR和基础类库.在.NET下我们编写一个最简单的"Hello W ...

  8. 微软发布 Windows Server 2016 预览版第三版,开发者要重点关注Nano Server

    微软已经发布 Windows Server 2016 和 System Center 2016 第三个技术预览版,已经提供下载.Windows Server 2016 技术预览版第三版也是首个包括了容 ...

  9. 冗余代码都走开——前端模块打包利器 Rollup.js 入门

    之前翻译过一篇文章,介绍了通过 ES2015 的解构赋值语法引入模块,可以让打包工具(browserify)最终编译出来的代码量最小化. 殊不知在 webpack 1.X 版本是无法利用该特性来避免引 ...

  10. C# 仿刷-框架MvcThrottle的使用

    1.介绍 1)用MvcThrottle你能保护你的网站不受攻击.刷. 2)你可以限制与设置多个不同场景允许的IP,设置 每秒/分/天 允许访问IP. 3)你可以定义限制,来处理所有请求.或者某个Con ...