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

ES6导入与导出(module)

在ES6之前JavaScript是没有真正性的模块化,导入与导出的,之前有common.Js,AMD,在ES6中引入了模块化概念,一个文件即是一个模块。

1. export 导出

模块功能主要有两个命令构成: exportimportexport规定模块的对外接口,也就是导出, import规定用来输入其他模块功能,也就是导入。

一个模块就是一个文件,该文件内的所有变量对于外部都是不可见的,如果想在另一个文件内使用本文件中的变量,就要用到 export将文件中的变量导出。

// name.js
export let firstName = 'Join';
export let lastName = 'In';

export导出了两个变量

以上是一种方式,还有另一种方式:

let firstName = 'Join';
let lastName = 'In';
export { 
  firstName, lastName
}

先将要对外输出的变量声明好,然后直接用export大括号一块直接导出。除了可以导出变量外,也可以导出函数

export function fun(){  
    return 1
}

再者可以将导出的名称重命名,使用 as关键字

export { 
  firstName as newName
}

这种情况就是导出时,本来的变量或者函数名称为firstName,输出时改变名称为newName。当然也可以将导出的名称换好几个名称一块导出

export { 
  firstName as lastName
}
export { 
  firstName as API 
}

这里就是将名称为 firstName的变量或者函数命为两个名称一块导出的。

特别要注意的是 export命令对外提供的接口一定要与模块内部的变量要建立一一对应关系 但是对于以下情况是不能导出成功的

let firstName = 'Join';
export firstName;

因为这里的导出,导出的是变量 firstName,而firstName是值,不是接口。

注意:

使用export导出的模块,当导入时的名称要和导出时的名称一致。

2. import 导入

使用 export命令定义了模块导出的接口后,可以在其他文件中使用 import命令加载这个模块。

// main.js
import { firstName } from './name.js'

使用一个大括号的形式,里面指定从其他模块导入的变量名即可。导入的路径即可以是相当路径,也能是绝对路径,后缀名 .js也可以省略。

重命名,as关键字
import { firstName as API } from './name'

这里就是本将该导入的名称是 firstName使用 API进行代替。

import具有提升效果,就是会提升到文件的头部在执行

假如将导入放入底下,在上面使用也不会报错

console.log(firstName);
import { firstName } from './name'

这种情况不会报错,代码执行时,会先执行导入,再输出 firstName

3 整体加载

再者除了可以指定加载某个输出值,也可以使用整体加载(即星号*)用来指定一个对象,将导出的内容全部加载在这个对象上

import { * as All } from './name.js'

假如导入的里面有 firstName lastName, 使用时直接 API.firstName即可。

4. export default

上面介绍到 export 进行导出,导入的时候使用 import ,但需要知道从另一个模块导出时的变量名或者是函数名,但是有时候我们并不想要去导入文件中查看,这时候就会用到了 export default 导出,实际上 export default是默认导出,既然是默认导出也就是说一个模块使用 export default 方法进行导出只能使用一次,当然 exportexportdefault两种导出方法是可以共存的。

比如:

// export-default.js
export default function() { 
    console.log('这是export-default.js文件导入的内容');
}

这里使用的是默认导出,导出了一个为匿名函数,当导入时可以对这个匿名函数另起名字

// main.js  
import fun from './export-default.js'

导出多个时

 export default {  
     constVal,   
     constVal1,   
     constVal2 
 }
这里有三点需要注意
  • 此时导入时 import后不需要使用大括号
  • 也不需要知道要导入的文件中的变量名或函数名,可以另起一个名称,导出的内容会是一个对象形式。
  • 假如要按需求只导入某一个或某几个也可以用大括号的形式进行导入。
export default 与 export 区别

1.export default 属于默认导出,其实是 export 下有一个叫 default 的属性进行导出,只不过是这个 default属性名是开发人员可以更改的,所以在导出时跟 export是有所区分的。

export 导出

// a.js
export var constVal = 1;

exprot default 导出

// b.js
export default var constVal = 1;

使用 export导出是正确的,但是使用 export default就是错误的。原因是在export default 已经在export 下有这个default变量名了,而在 export导出时,这里的constVal其实就是代替default的,只是名称不同而已。

ES6中模块的 module导出的实质为 export.default

a.js模块中其实可看作为:export.constVal, 这里用constVal代替了default,因为它是可修改的。

b.js模块中直接导出的是:export.default, 这里没有对default进行名称更改,如果像b.js模块这个导出,就会变成export.default.constVal, 所以会出错,不符合导出的规则。

2.两种导出模式的比较

// a.js
const val = 1;
export {
  val as default
}
// 等同于export default val
// b.js
import { default as val} from './a.js'
// 等同于import val from './a.js'

如果想同时导入默认和其他接口也可以存在的,使用逗号 ,区分

import MoRen, { val } from 'a.js'

5. export 和import 同时存在

有时想在一个模块中导入某个接口,然后导出同样的接口名称属于同一个模块时,可以合并操作

import { val, bar } from 'a.js';
export { val, bar };

等同于

export { val, bar } from 'a.js';

6. 跨模块常量

这种情况存在于如果一个模块使用多个模块,当挺多的时候,可以创建一个 index.js模块,把所有的模块导入到index.js模块中,使用时直接导入index.js模块即可。

// index.js
import { foo } from './a.js';
import { bar} from './b.js';

假如在c.js模块中要用到 foobar即可只引入index.js模块就可以了。

7. import()

使用 import 导入时为静态分析,JavaScript执行时会把 import导入的模块直接执行出来,会提到模块的最顶端,假如需要条件进行加载不同的模块,此时就不行,不会动态去加载。而import()恰恰解决这种加载模式,可以实现动态加载。

import() 这里的括号() 填写要加载的模块路径,例如:import('./a.js'); ``import() 会返回一个 Promise对象

  import('./a.js').then(result => { 
      console.log(result);  
  }).catch( error => {   
          console.log(error) 
      })

这里的 .then方法的参数(result)就是导入模块的一个对象集合,如果只想使用某一个或某几个也可以使用对象的解构赋值的语法,获取输出接口。

相关文章:

  • 【opencv-c++】cv::imshow和cv::waitKey函数显示图像
  • 第二课 我的第一个程序 hello world
  • 消息队列实现分布式事务
  • 前端性能优化指标 + 检测工具
  • CubeMx笔记 --pwm输出+输入捕获
  • 轻松玩转树莓派Pico之一、新手上路
  • 目前我国网络安全人才市场状况
  • Redis源码解读之用RedisAe实现一个简单的HTTP服务器
  • 【极简python】第一章 print与变量
  • HAL库与Cubemx\rt-thread Nano系列教程-01-新建HAL工程及移植RT-Nano到Alios Developer Kit
  • 论文阅读_知识蒸馏_MobileBERT
  • No2.搭建基本的资源端解析token(资源服务端)
  • Vue入门【四】-- 事件机制与双向数据绑定
  • 小型超市管理系统的设计与实现 毕业设计-附源码011136
  • R语言缺失时间序列的填充:补齐时间序列数据中所有缺失的时间索引、使用na.locf函数将缺失值NA替换为前序时刻最近的值
  • 网络传输文件的问题
  • fetch 从初识到应用
  • JavaScript设计模式与开发实践系列之策略模式
  • JS 面试题总结
  • Js基础知识(四) - js运行原理与机制
  • Laravel Mix运行时关于es2015报错解决方案
  • Next.js之基础概念(二)
  • Python语法速览与机器学习开发环境搭建
  • React 快速上手 - 07 前端路由 react-router
  • 动态魔术使用DBMS_SQL
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 和 || 运算
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 回顾 Swift 多平台移植进度 #2
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端性能优化--懒加载和预加载
  • 小程序button引导用户授权
  • 函数计算新功能-----支持C#函数
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (175)FPGA门控时钟技术
  • (30)数组元素和与数字和的绝对差
  • (39)STM32——FLASH闪存
  • (ibm)Java 语言的 XPath API
  • (二十三)Flask之高频面试点
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .Net 知识杂记
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .net2005怎么读string形的xml,不是xml文件。
  • .Net6使用WebSocket与前端进行通信
  • ::
  • @Import注解详解