想知道es6的导入导出吗?来,我来告诉你~

文则
• 阅读 4144

<center>es6的导入导出

我们今天来讲讲es6的导入导出,es6的导入导出是什么呢?它有哪些方便之处呢?其实啊,现在的ES6自带了模块化,我们可以直接作用import和export在浏览器中导入和导出各个模块了, 一个js文件代表一个js模块;首先我们来具体了解了解es6模块化:

ES6的模块化的基本规则或特点:

  1. 每一个模块只加载一次, 每一个JS只执行一次, 如果下次再去加载同目录下同文件,直接从内存中读取。 一个模块就是一个单例,或者说就是一个对象;
  2. 每一个模块内声明的变量都是局部变量, 不会污染全局作用域;
  3. 模块内部的变量或者函数可以通过export导出;
  4. 一个模块可以导入别的模块
  5. 使用export关键词导出对象。这个关键字可以无限次使用;
  6. 使用import关键字将其它模块导入某一模块中。它可用来导入任意数量的模块;
  7. 支持模块的异步加载;
  8. 为加载模块提供编程支持。

ES6模块主要有两个功能:export和import
export用于对外输出本模块变量的接口
import用于在一个模块中加载另一个含有export接口的模块。
也就是说使用export命令定义了模块的对外接口以后,其他JS文件就可以通过import命令加载这个模块
一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量。下面是一个JS文件,里面使用export命令输出变量:
/Pb.js
//导出常量
export const sqrt = Math.sqrt;
//导出函数
`export function square(x) {

return x * x;

}`
//导出函数
`export function diag(x, y) {

return sqrt(square(x) + square(y));

}`

//main.js
import { square, diag } from '.Pb';
console.log(square(11)); // 121
console.log(diag(4, 3)); // 5

这个例子意思就是在lib.js文件中, 使用 export{接口} 导出接口, 大括号中的接口名字为上面定义的变量,直接在export的地方定义导出的函数,或者变量。

如果想为输入的变量重新取一个名字,import命令要使用as关键字,将输入的变量重命名。
import { lastName as surname } from '.Pb';

import命令具有提升效果,会提升到整个模块的头部,首先执行。
foo();
import { foo } from 'my_module';

还有一种导出方法: 默认导出
这种导出的方式不需要知道变量的名字, 相当于是匿名的, 直接把开发的接口给export;
如果一个js模块文件就只有一个功能, 那么就可以使用export default导出;

import实际都做了些什么?

ES6将模块加载过程的细节完全交由最终的实现来定义,模块执行的其它部分倒是在规范中有详细定义。当你通知JS引擎运行一个模块时,它一定会按照以下四个步骤执行下去:

  1. 语法解析:阅读模块源代码,检查语法错误。
  2. 加载:递归地加载所有被导入的模块。这也正是没被标准化的部分。
  3. 连接:每遇到一个新加载的模块,为其创建作用域并将模块内声明的所有绑定填充到该作用域中,其中包括由其它模块导入的内容。
  4. 如果你的代码中有import {cake} from "paleo"这样的语句,而此时“paleo”模块并没有导出任何“cake”,你就会触发一个错误。这实在是太糟糕了,你都快要运行模块中的代码了,都是cake惹的祸!
  5. 运行时:最终,在每一个新加载的模块体内执行所有语句。此时,导入的过程就已经结束了,所以当执行到达有一行import声明的代码的时候……什么都没发生!

静态vs动态:论规则及破例之法

JavaScript作为一门动态语言已经得到了一个令人惊讶的静态模块系统。

  1. 你只可以在模块的最外层作用域使用import和export,不可在条件语句中使用,也不能在函数作用域中使用import。
  2. 所有导出的标识符一定要在源代码中明确地导出它们的名称,你不能通过编写代码遍历一个数组然后用数据驱动的方式导出一堆名称。
  3. 模块对象被冻结了,所以你无法hack模块对象并为其添加polyfill风格的新特性。
  4. 一个模块的所有依赖必须在模块代码运行前完全加载、解析并且及早连接,不存在一种通过import来按需懒加载的语法。
  5. import模块产生的错误没有错误恢复机制。一个app可能囊括了上百个模块,一旦有一个模块无法加载或连接,所有的模块都不会运行,而且你不能在try/catch代码块中捕捉import的错误信息。(上面这些描述的本意是说:系统是静态的,webpack可在编译时为你检测那些错误。)
  6. 不支持在模块加载依赖前运行其它代码的钩子,这也意味着无法控制模块的依赖加载过程。

现在我们用编辑器编写es6浏览器不支持,可以转译成es5再用node实现效果

var gulp=require("gulp");
var watch=require("gulp-watch");
var babel=require("gulp-babel");
gulp.task("babel",function(){
   gulp.src("./js/*.js")
   .pipe(babel({
       presets:["es2015"]
   }))
   .pipe(gulp.dest("./dist/js"));
});
gulp.task("watch",function(){
gulp.watch("./js/*.js",["babel"]);
})
点赞
收藏
评论区
推荐文章
待兔 待兔
3年前
export ,export default 和 import 区别 以及用法
首先要知道export,import,exportdefault是什么ES6模块主要有两个功能:export和importexport用于对外输出本模块(一个文件可以理解为一个模块)变量的接口import用于在一个模块中加载另一个含有export接口的模块。也就是说使用export命令定义了模块的对外接口以后,其他JS文件就可以通过impor
Alex799 Alex799
4年前
Node.js 如何处理 ES6 模块
Node.js如何处理ES6模块作者:日期:学习JavaScript语言,你会发现它有两种格式的模块。一种是ES6模块,简称ESM;另一种是Node.js专用的CommonJS模块,简称CJS。这两种模块不兼容。很多人使用Node.js,只会用require()加载模块,遇到ES6
Wesley13 Wesley13
4年前
jcsv导入导出动态扩展思路
我整理的jcsv工具类库简介:csv导入导出组件jcsv(https://my.oschina.net/lipengxs/blog/3094719)jcsv可以支持导入校验规则动态扩展,以及导出规则动态扩展。下面来介绍下扩展思路问题我们支持文件校验、题头校验、列校验等,规则已经多样化,已经覆盖了绝大多数场景,但是难免有一些个性化的校
Stella981 Stella981
4年前
HuTool工具类使用之Excel文档的导入导出
HuTool工具类使用之Excel文档的导入导出前言在日常的工作开发中,Excel的导入和导出是必不可少的,如果自己写相应的导入导出方法,会显得十分繁琐,本文采用Hutool工具类实现的Excel导入导出功能,可以大幅度减少今后开发中Excel的导入导出的相关操作。
Stella981 Stella981
4年前
Babel 处理 webpack 无法处理的 ES 语法(Babel 6.x 和 Babel 7.x 有区别)(二)
//这是main.js是我们项目的js入口文件//1:a导入jQuery,引入jQuery包用$变量接收,此方法与node中const$require('jquery')同//此为ES6中导入模块的方式//由于ES6的语法太高级,浏览器解析不了次引入方式import$from'jqu
Wesley13 Wesley13
4年前
oracle 12c DMP文件导出,oracle 11gDMP文件导入
首先,我们都知道一点,由于版本问题,dmp文件的导出导入会报错,而低版本的导出,高版本是可以直接导入的,它能兼容低版本而高版本导出,想要导入低版本,这个就有问题了,会提示版本的兼容问题,别人的解决方法我不知道,当然我也尝试过了,但是在我这里没有成功。所以我尝试了一下逼得办法,也就是在12c导出的语句最后要加上一句版本号,先将版本号转换为11g的:高版
Stella981 Stella981
4年前
ES6模块之export和import详解
文章转载自:https://blog.csdn.net/qq\_28506819/article/details/75733601ES6中的模块即使一个包含JS代码的文件,在这个模块中所有的变量都是对其他模块不可见的,除非我们导出它。ES6的模块系统大致分为导出(export)和导入(import)两个模块。1、模块导出(export)
Stella981 Stella981
4年前
ES6 模块化(Module)export和import详解
ES6模块化(Module)export和import详解ES6在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。ES6模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS和AMD模块,都只能
Wesley13 Wesley13
4年前
ES6新特性整理,你需要了解的ES6知识
ES6是新版本JavaScript语言的标准,上一次标准的制订还是2009年出台的ES5。目前ES6的标准化工作已经完成,14年12月份放出了正式版本。目前主流的浏览器都支持运行ES6代码,如果你的不支持,还等什么呢,换浏览器啊~潮流虽然太快,但我们不停下学习的步伐,就不会被潮流丢下的,下面来领略下ES6中新特性,一堵新生代JS的风采。箭头操作符
Wesley13 Wesley13
4年前
mysql8基于gtid导出导入搭建主从
mysql8基于gtid导出导入搭建主从开启GTID的情况下导出导入库的注意事项在开启了GTID功能的MySQL数据库中,不论是否使用了GTID的方式做了主从同步,导出导入时都需要特别注意数据库中的GTID信息.\导出\在主库上全备,setgtidpur
Wesley13 Wesley13
4年前
ES6模块化与常用功能
目前开发环境已经普及使用,如vue,react等,但浏览器环境却支持不好,所以需要开发环境编译,下面介绍下开发环境的使用和常用语法:一,ES6模块化1,模块化的基本语法ES6的模块自动采用严格模式,不管你有没有在模块头部加上"usestrict";。模块功能主要由两个命令构成:export和import(注意有无defaul