当前位置: 首页 > news >正文

ES6模块

目录

  • 一、为什么需要模块
  • 二、 模块和模块系统
  • 三、模块的两种导入和导出
  • 四、其他注意事项
  • 五、 总结

一、为什么需要模块

起初,项目的代码量不大时,常把所有代码写在一个文件中。随着代码量的不断增加,这样做会带来两个问题:一、不利于分工合作;二、不利于后期维护。因此,需要依据代码功能把代码从一个文件拆分到不同的文件。但是,现在又产生一个新的问题,多个文件的变量都位于全局作用域中,很容易产生冲突,为了解决这个问题,就有了模块。

最初,ES标准中还没有模块和模块系统的支持,只能通过立即执行函数来模拟模块的功能。具体做法是:把不同文件中的代码都放在立即执行函数中,然后把可能会被其他代码使用的变量、函数、类通过全局对象的属性暴露出去。如下代码所示:

(function() {
	class Person {
		constructor(name, age) {
		this.name = name;
		this.age = age;
		}
	}

	window.Person = Person;
})();

通过立即执行函数模拟的模块,大大减少了全局变量,但是依然存在不少通过全局对象属性暴露的变量,例如,window.Person = Person;,更大的问题是,我们需要手动管理加载文件的顺序,例如,文件A中的类继承了文件B中的类,那么在HTML文件中,<script src="A.js"></script> 必须先于<script src="B.js"></script> 引入,如果存在大量的复杂的依赖关系,手动管理依赖是非常困难的。这是立即执行函数模拟(实现)模块存在的两个主要问题。

下文中介绍的ES6中引入的模块和模块系统,会解决立即执行函数模拟模块存在的问题~~

二、 模块和模块系统

1、 模块
模块是局部作用域代码块

在ES6中一个模块本质是一个文件

2、模块系统

模块系统主要解决问题:

  • 模块化
  • 消除全局变量
  • 管理加载顺序

以前,ES还没有提供模块的原生支持时,第三方JS库,例如,RequireJS、SeaJS等实现模块系统的功能。

在HTML代码中引入一个模块的方式

<script src="file.js" type="module"></script>

比起一般的引入方式,多了一个type属性,属性值module表示以模块的方式引入文件。如果不添加属性"type="module,那么,文件以普通的方式引入,文件中的变量会作为全局变量处理。

什么时候或场景需要把文件以模块方式引入呢?
当文件中出现import或export关键字时。

三、模块的两种导入和导出

一个模块没有导出,也可以导入。只是将模块中的代码执行一遍,没有暴露任何变量

1、export default 导出和对应的import导入

export default 表达式; 

表达式:基本类型的字面量,变量,函数和类的表达式。函数和类表达式可以匿名。

export default 1;
export default function(){};
export default class{}
const str = 'hello';
export default str;

一个模块只能定义一个exprot default,不能导出多个。

export default 1;
export default 'hello';

会出现报错:

在这里插入图片描述

2、exprot导出和对应的improt导入语法

基本语法

方式一:export 声明语句;
export let/const/var variable = value;
export function foo(){}
exprot class Clz{}
方式二:先声明后export{变量名}
let variable = value;
exprot {variable};

注意 普通变量、函数和类表达式不能匿名。不能是基本类型值。

import {variable} from XXX.js

导出导入多个

利用基本语法方式二

const variable = value;
function  foo() {}
class Clz {}

// 导出多个
export {variable, foo, Clz};

导出导入起别名

export {variable as username}

导入的”角色“的名字和我当前代码冲突,就可以别名

import {Clz as Person}

整体导入
包括export default导出的角色

import * as obj from 'module.js';

同时导入

import {variable, foo, Clz} from ‘module.js’
import def from ‘module.js’

export和exprot default可以同时导出,不过export default必须在最前面先导出,
import def, {variable, foo, Clz } from ‘module.js’

也可以分开导入
import def from ‘module.js’
import {variable, foo, Clz } from ‘module.js’

想法
export 对标Java中的public
没有export 对标Java中的private

四、其他注意事项

1、模块本身作用域中的this指向undefined

应用,可以在文件首部添加以下代码,来提示用户应该以为模块的方式应用文件

if (typeof this !== 'undefined') {
    throw new Error('请以模块方式引入该文件');
}

2、 import关键字和import()函数

import和export 命令会先于其他代码执行,和它所在的位置无关。因此,我们应该把它们放在模块的首部,而不是代码块,例如if代码块中。

import() 可以实现条件导入,即满足某些条件,例如,是否是PC端、移动端,而导入不同的模块。

此函数不是标准,只是提案。可以配合webpack解决兼容性问题。

3、 导入导出的复合写法

在这里插入图片描述

五、 总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
表达式包括基本类型值字面量或变量,函数、类表达式,可以匿名

在这里插入图片描述
声明即变量的声明;语句即表达式,包括变量,函数或者类的声明。

在这里插入图片描述

相关文章:

  • vim 多行注释
  • 基于MATLAB的迭代学习控制(Iterative Learning Control,ILC)算法的仿真与分析
  • 【LEACH协议】基于matlab最佳簇半径的无线传感器网络分簇路由算法【含Matlab源码 2087期】
  • PDA手持机轻松解决库存盘点难题支持一维二维码扫描
  • vscode启动不了,折腾了半天发现已经不支持win7
  • 【智能优化算法-麻雀搜索算法】基于萤火虫结合麻雀搜索算法求解单目标优化问题附matlab代码
  • 22-09-04 西安 谷粒商城(01)MySQL主从复制、MyCat读写分离、MyCat分库分表
  • 猿创征文|Python3,10分钟写了一个WIFI 万(破) 能 (解) 钥 (神) 匙 (器),YYDS。
  • 【每日一练】图解:链表内指定区间反转
  • Java 进阶多线程(一)
  • Softing物联网(IoT)方案之OT/IT数据集成
  • 第13讲:DCL类型的SQL语句之用户管理
  • Python实战回归模型-消费者人群画像-信用智能评分(基于中国移动用户数据)
  • 【尚硅谷】MyBatis
  • 用动图详细讲解——栈
  • ES6系统学习----从Apollo Client看解构赋值
  • FastReport在线报表设计器工作原理
  • Flex布局到底解决了什么问题
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java程序员幽默爆笑锦集
  • JS字符串转数字方法总结
  • Netty 4.1 源代码学习:线程模型
  • Python3爬取英雄联盟英雄皮肤大图
  • 前端面试之闭包
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • gunicorn工作原理
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • !$boo在php中什么意思,php前戏
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (四)汇编语言——简单程序
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)(官方)UE4--图像编程----着色器开发
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • **CI中自动类加载的用法总结
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET gRPC 和RESTful简单对比
  • .NET Micro Framework初体验
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .Net(C#)常用转换byte转uint32、byte转float等
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [1127]图形打印 sdutOJ
  • [Android]常见的数据传递方式
  • [BZOJ2208][Jsoi2010]连通数
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [C++]C++基础知识概述
  • [Google Guava] 1.1-使用和避免null
  • [hdu 4405] Aeroplane chess [概率DP 期望]
  • [Hibernate] - Fetching strategies
  • [IE编程] 多页面基于IE内核浏览器的代码示例
  • [jquery]this触发自身click事件,当前控件向上滑出
  • [Kubernetes]2. k8s集群中部署基于nodejs golang的项目以及Pod、Deployment详解