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

ECMAScript6中的模块:export导出、import导入

1、模块概述

早期的 JavaScript 程序很小,通常被用来执行独立的脚本任务,在 Web 页面中需要的地方提供一定的交互。随着 Web 应用程序变得越来越复杂,有必要考虑提供一种将 JavaScript 程序拆分为可按需导入的单独模块的机制,这就是模块化编程。模块化编程就是将一个复杂的程序根据一定的规则封装成一个或多个文件,并组合在一起。使用这种方式,可以将代码分解到多个文件中,每个文件都称为一个模块。一个模块通常是一个类或者多个函数组成的方法库。

每个文件本身就是一个模块,在文件中定义的变量、函数和类对于该文件都是私有的,需要将它们显示导出。另外,一个模块导出的内容只是显示导入它们的模块中才可以使用。ECMAScript 6 为 JavaScript 提供了 export、import 关键字,用于导出和导入模块。

2、export 导出模块

为了获得模块的功能,首先需要把它们导出来。要从 ES6 模块中导出变量、函数或类,需要使用 export 语句。最简单的方法是将 export 语句放在想要导出的项前面。

【实例】创建一个模块 module.js,模块中定义一个变量、一个函数和一个类,并使用  export 语句进行导出。

//1、导出:变量
export var name = "张三";//2、导出:函数
export function sum(m, n) {return m + n;
}//3、导出:类
export class Person {constructor(name, position, year) {this.name = name;this.position = position;this.year = year;}show() {return "姓名:" + this.name + "\n职位:" + this.position + "\n工作年限:" + this.year;}
}

如果不想使用多个 export 关键字进行导出,可以先正常定义变量、函数和类,然后在模块末尾使用一个 export 语句声明想要导出的内容。这种语法要求在一对大括号中给出一个使用逗号分隔的标识符列表。

【实例】将上述代码进行修改,在模块末尾使用一个 export 语句进行导出。

//1、定义:变量
var name = "张三";//2、定义:函数
function sum(m, n){ return m + n;
}//3、定义:类
class Person{constructor(name, position, year) {this.name = name;this.position = position;this.year = year;}show(){return "姓名:" + this.name + "\n职位:" + this.position + "\n工作年限:" + this.year;}
}//使用 export 语句导出:变量、函数、类
export {name, sum, Person};

在使用 export 语句进行导出时,可以使用 as 关键字对导出的标识符进行重命名。

【实例】将上述代码进行修改,使用 as 关键字对导出的标识符进行重命名。

//使用 export 语句导出时,并使用 as 关键字对导出的标识符进行重命名
export {name as n, sum as s, Person as p};

在有些情况下,如果只想导出模块中的一个函数或类,可以使用默认导出的形式,即 export default 语句。

【实例】使用 export default 语句,只导出模块中的 sum() 函数。

// 方式一:使用 export default 语句,只导出模块中的 sum() 函数
export default sum;

使用 export 语句只能导出已经命名的变量、函数或类。而使用 export default 语句的默认导出则可以导出任意表达式,包括匿名函数。

【实例】使用 export default 语句和匿名函数的形式,导出匿名函数。

// 方式二:使用 export default 语句和匿名函数的形式,导出匿名函数
export default function(m, n){ return m + n;
}

说明:

一个模块只能有一个默认导出,因此 export default 在一个模块中只能使用一次。

3、import 导入模块

如果想在模块外面使用模块中的一些功能,就需要进行导入。导入其他模块导出的内容需要使用 import 语句来实现。

【实例】使用 import 语句入到 module.js 模块导出的内容。

import {name, sum, Person} from './module.js';

在使用 import 语句进行导入时,也可以使用 as 关键字对导入的标识符进行重命名。

import {name as n, sum as s, Person as p} from './module.js';

可以使用通配符“*”将每一个模块功能导入到一个模块功能对象上。

import * as obj from './module.js';

如果导入默认导出的内容,可以使用 default 关键字并提供别名进行导入,也可以直接使用自定义的标识符作为默认导出的别名进行导入。

import {default as exam} from './module.js';

 或者:

import exam from './module.js';

4、基于 Vue3.0 综合实例

在企业项目中,通常会使用 Vue 作为前端开发框架。以下是一个基于 Vue3.0 的综合实例,实现员工模块的开发。

(1)创建 staff.js 文件,实现员工API模块功能,并导出方法。

import request from '@/utils/request.js';//获取员工信息
export function getStaffInfoById(staffId) {return request({url: `/staff/getStaffInfoById/${staffId}`,method: 'GET'});
}//新增或保存员工信息
export function saveOrUpdateStaff(staffInfo) {return request({url: '/staff/saveOrUpdateStaff',method: 'POST',data: staffInfo});
}//删除员工信息
export function deleteStaff(staffId) {return request({url: `/staff/deleteStaff/${staffId}`,method: 'POST'});
}

(2)创建 StaffInfo.Vue 文件,编写一个单文件组件,实现获取员工信息。

<template><!-- 忽略:组件的HTML内容 -->
</template><script>
// 导入模块:将 staff.js 中的所需要的函数导入到该组件中
import { getStaffInfoById, saveOrUpdateStaff, deleteStaff } from '@/api/staff.js';
import { getDepartmentList } from '@/api/department.js';
import { getPositionList } from '@/api/position.js';export default {data: function () {return {staffId: 0,staffInfo: {},}},created() {this.staffId = this.$route.query.staffId || 0; //获取路由中传递的员工IDthis.getStaffInfo(this.staffId); //页面绑定员工信息},methods: {//页面绑定员工信息bindStaffInfo: function (staffId) {//调用导入的函数getStaffInfoById(staffId).then(function (data) {this.staffInfo = data;}.bind(this));},//删除员工信息deleteStaff: function (staffId) {if (!confirm("确定删除该记录吗?")) {return;}//调用导入的函数deleteStaff(staffId).then(function (result) {if (result) {alert("删除成功");}}.bind(this));}}
}
</script>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MFC将类A中的事件在类B中处理采用回调函数实现
  • MySQL中的distinct和group by哪个效率更高?
  • vba代码插入折线图
  • SQL进阶技巧:如何不使用union all进行行转列?【三种方法实现】
  • 【机器学习】深度学习实践
  • tea-入土为安的第十七天
  • 基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
  • [C++][opencv]基于opencv实现photoshop算法图像剪切
  • Java的jdk配置成功,但是输入java -version等,命令行没有任何反应
  • 【区块链+商贸零售】吾卡数字预付式消费服务平台 | FISCO BCOS应用案例
  • SpringBoot-配置加载顺序
  • servlet的执行顺序
  • 健韵坊(详细项目实战一)Spring系列 + Vue3
  • 探索AWS免费资源:无账号也能体验云计算魅力
  • 网络协议七 应用层 DNS协议 和 DHCP协议 这两个都了解就好
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 03Go 类型总结
  • docker python 配置
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Invalidate和postInvalidate的区别
  • Java编程基础24——递归练习
  • Object.assign方法不能实现深复制
  • spark本地环境的搭建到运行第一个spark程序
  • TypeScript迭代器
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 服务器之间,相同帐号,实现免密钥登录
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 思否第一天
  • 微信小程序设置上一页数据
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 数仓建模:如何构建主题宽表模型?
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (42)STM32——LCD显示屏实验笔记
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)kafka实战——kafka源码编译启动
  • (转)Linq学习笔记
  • (转)详解PHP处理密码的几种方式
  • .md即markdown文件的基本常用编写语法
  • .Net 6.0--通用帮助类--FileHelper
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET NPOI导出Excel详解