export和export defaul及import的理解

export和export default及import是ES6的语法。
export和export default可以用来导出变量、函数、文件、模块等等,import用于在某个模块中加载另一个含有export或者export default的模块。
值得注意的是,在一个文件或者模块中,import和export可以有多个,但是export default只能有一个。下面分别介绍一下export,export default及import的用法:

一、export的命令

1、通常一个模块就是一个文件,文件中可以包含很多的变量、函数方法等,而这些变量和函数方法等一般外部是没有办法就行获取,如果你希望获取某个模块的某个变量或者函数,那么就必须要使用export关键字输出这个变量或者函数方法,例如:

//这是test.js文件的内容
// 方式1 :输出变量和方法(推荐这种方式进行书写,这样可以在脚本的最后很清楚的看清输出哪些变量和方法)
var a = 111
var b = 222
var c = function(){
    
    
	console.log(3333)
}
function ddd(){
    
    
	console.log(4444)
}
function eeeeee5(){
    
    
	console.log(555)
}
export {
    
    
	a,
	b,
 	c,
	d,
	eeeeee as eee //重命名的方式:将 eeeeee 命名为 eee,可以以不同的命名输出同一个变量或者方法
	eeeeee as e5 //重命名的方式:将 eeeeee 命名为 eee,可以以不同的命名输出同一个变量或者方法
}

//=======注意:以上方式1的所有代码也可以这么写===========================
// 方式2 :输出变量和方法
export var a = 111
export var b = 222
export var c = function(){
    
    
	console.log(3333)
}
export function ddd(){
    
    
	console.log(444)
}
export function eeeeee5(){
    
    
	console.log(555)
}

2、要注意的是,export命令规定的是对外的接口,必须和模块内部的变量建立一一对应的关系

export 1   //报错 这种写法是直接输出 1, 1 是值,而不是接口


var m = 1
export m   //报错 这种方法虽然是通过了一层变量赋值,但是还是直接输出 1, 1 是值,而不是接口

//=======正确的写法是:=====================
export var m = 1

// ======或者:==============================
var m = 1
export {
    
    m}

// ======或者使用as以重命名的方式进行输出:=====
var m = 1
export {
    
    m as mmmm}

3、export输出的接口,和其对应的值是动态绑定的关系,通过某个接口,可以获得接口里的实时值,这与CommonJS是不同的,CommonJS模块输出是值的缓存。

//下面输出的一开始是 11111, 3秒后变成了 22
export var a = 11111
setTimeout(() => {
    
    
	a = 22
}, 3000)

4、export命令可以出现在模块顶层的任何位置,但不能处于块级作用域内,会报错,这是因为如果处于条件块中就没有办法做静态优化了

function aaa(){
    
    
	var a = 1
	export {
    
    a} //报错-----》  SyntaxError: Unexpected token 'export'
}
aaa()

二、import 命令

1、import命令后面的大括号{}里面的变量名,需要与要导出的文件中的变量名相同
2、import命令可以使用 as 关键字进行重命名,例如:

import {
    
    aaaaaa as a6} from './module.js'

3、import命令后面大括号中的变量都是只读的,不可以再进行改写了,例如:

import {
    
    a, b} from './module.js'
a = {
    
    } //重新赋值会报错
//如果b是一个对象,那么可以改写b里面的属性,改写后其他模块如果也用到b,那么b的name属性值是改写后的值
b.name = 'bob' //可以进行改写

4、import后面的路径可以是相对路径、绝对路径,如果不带路径,只是模块名,那么需要相应的配置文件,以便告诉JavaScript引擎该模块的位置

import {
    
    c, d} from 'userModule'

5、import命令有提升效果,会提升到整个模块的头部,首先进行执行

fun1() //是正确的,因为import命令具有提升效果
import {
    
    fun1} from './module'

6、import命令不能使用表达式、变量和if结构,因为它是静态执行的

import {
    
    'fun' + '111'} from './module' //报错


var module = './module'
import {
    
    fun111} from module //报错

//报错
if(x === 1) {
    
    
	import {
    
    fun111} from './module1'
}else{
    
    
	import {
    
    fun111} from './module2'
}

7、重复引入相同模块,只会执行一次

//① 下面的代码只执行一次
import {
    
    fun111} from './module'
import {
    
    fun111} from './module'

//② import是单例模式(Singleton)的,所以同一个模块的不同变量通过多个import引入,可以合并成一个
import {
    
    a} from './module'
import {
    
    b} from './module'

import {
    
    a, b} from './module'//可以合并为下面形式:

8、import的下面这种语法,可以执行所加载的模块

import 'lodash';   

9、import中可以使用星号(*)进行整体加载一个模块

// ======module.js文件=======
export var a = 1
export var b = 'b'
export function aaaa(){
    
    
	console.log('aaaaa')
}


// ==========另一个文件中引入module文件==========
import * as module from './module'
console.log(module.a)
console.log(module.b)
module.cccc = 11111 //报错,不允许运行时进行改变,所以这种写法是不允许的

三、export default命令

1、如果用户想不用阅读文档去知道这个文档中涉及多少个变量、方法函数等就可以加载模块,要实现这个需求就可以使用 export default
2、export default可以使用在匿名函数上,然后使用import引入模块的时候,可以取任意名字进行引入

//======= user.js文件====
export default function(){
    
    
	console.log(11111)
}

//========index.js文件=====
import aaaaa from './user.js' //可以取任意名字,如:aaaaa 来引入模块

3、export default可以使用在非匿名函数

//======= user.js文件====
export default function a(){
    
    
	console.log(11111)
}

//========index.js文件=====
import aaaaa from './user.js' //可以取任意名字,如:aaaaa 来引入模块

上面也可以写成下面形式:

//======= user.js文件====
function a(){
    
    
	console.log(11111)
}
export default a

//========index.js文件=====
import aaaaa from './user.js' //可以取任意名字,如:aaaaa 来引入模块

4、当使用export default时,import引入是不需要大括号{}的,当使用 export时,import引入是需要大括号的。export default只能输出一个,export可以输出多个
5、export default 命令本质上是输出一个为default 的变量或者方法,然后在使用import引入时,允许用户自定义其名字

//====a.js文件=====
function aaa(){
    
    
	console.log(11110
}
export default aaaa  // 本质上是等同于 export {
    
    aaa as default}

=======b.js文件======
import cccc from ‘./a.js’ //本质上是等同于 import {
    
    default as cccc} from './a.js'

6、export default 本质上是输出一个 default变量,所以它后面不能再跟着变量的声明语句

export deafult var a = 1111 //报错
===========================应该写成下面这种方式:==================================
var a = 1111
export default a  //含义是:将变量a的值赋值给default
===============================或者写成下面这种方式:==================
export var a = 1111

=========================================
export default 32  //正确,相当于把32赋值给default变量
export 32 //错误,需要指定对外接口

7、如果想使用export default 及import 同时输出 默认的方法和一些具体的接口,那么可以写成如下:

=======test.js文件======
var obj = {
    
    
	aa: 1,
	bb: 2222,
}
var a = 1;
const b = 222
function ccc(){
    
    
	console.log(11111)
}
export default obj
export {
    
    a, b, ccc}

================index.js文件=====
import objjj, {
    
    a, b, ccc} from './test.js'
console.log(objjj.aa)
console.log(objjj.bb)
console.log(a)
console.log(b)
console.log(ccc())

8、export default 除了可以输出变量、方法函数等,还可以输出类(Class)

// ==============MyClass.js文件==========
export default class {
    
     ... }

//============ index.js文件==============
import MyClass from 'MyClass';
let o = new MyClass();

猜你喜欢

转载自blog.csdn.net/qq_37600506/article/details/120711296