es6的module使用,imort,export

汇总一下模块化开发,写模块的注意事项
模块功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。

一、expor 、import命令

1、导出单个属性

// a.js
export var firstName = 'amy';
export var lastName = 'ye';
export var year = 2019;

//b.js
import { firstName,lastName,year } from './a.js'

错误写法:
export 1

2、导出对象包含多个属性

// a.js
var firstName = 'amy';
var lastName = 'ye';
var year = 2019;
export {firstName, lastName, year};

//b.js
import { firstName,lastName,year } from './a.js'
推荐写法,方便查阅导出的元素

错误写法
var firstName = 'amy';
export firstName

3、导出函数

// a.js
 export function getName(name) {
     console.log(name)
 }

//b.js
import { getName } from './a.js'
getName ()

错误写法:
function f() {}
export f

4、导出、导入并重命名

//a.js
function getName(name) {
     console.log(name)
 } 
// 导出重命名
export {getName as getInfo}
export var firstName = 'Amy'
//b.js
import {getInfo,firstName as name} from './a.js'
getInfo('Tony')//Tony
console.log(name)//Amy

5、export输出的接口为实时值

//a.js
export let name = 'foo'
setTimeout(()=>name='amy',400)
export function getName() {
     console.log(name)
}

//b.js
import { name ,getName,a} from './a.js'

console.log(name)// foo
setTimeout(getName,1000) //amy

(1)export语句输出的接口,与其对应的值是动态绑定关系,即通过该接口,可以取到模块内部实时的值。
(2)CommonJS 模块输出的是值的缓存,不存在动态更新,

6、export 的位置

//a.js
function foo() {
  export default 'bar' // SyntaxError
}
foo()

//b.js
import { bar} from './a.js'
console.log(bar)//Uncaught SyntaxError: Unexpected token export

注意:export可以处于module任何位置,但是必须处于module的顶层,不能放在块级作用域内,否则会报错

7、import 导入接口属性为只读属性

import { firstName as name,getName} from './a.js'
console.log(name)
name = 'tony' //Uncaught TypeError: Assignment to constant variable.

userInfo.name = 'tony'
console.log(userInfo)
如果修改的是直接引用类型是熟悉,会报错(比如字符串)
但是如果修改的是间接引用类型,不会报错(比如对象)

8、import命令具有提升效果

foo();
import { foo } from 'my_module';

因为import具有提升功能,所以foo在import之前调用也不会报错

9、impor为静态执行,不能使用表达式和变量

// 报错
import { 'f' + 'oo' } from 'my_module';

// 报错
let module = 'my_module';
import { foo } from module;

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

10、import 整体加载(*)

import * as obj from './a.js'
console.log(obj.firstName)
console.log(obj.userInfo)

二、export default

1、默认导出变量

// a.js
export default 'Tony'

//b.js
import value from './a.js'
console.log(value)

默认导出的变量可以为任意变量名

2、默认导出函数

// a.j
export default function () {
    console.log(111)
}
或者
function f () {
    console.log(111)
}
export default f

//b.js
import getName from './a.js'
getName()
导入的方法不需要大括号括起来

3、export default 原理

(1)export default 一个module中只能有一个,使用export default 导出的接口,导入时不需要大括号。
(2)export default 其实它导出的是一个叫default的变量或方法,系统允许开发人员任意修改名字

// modules.js
function add(x, y) {
  return x * y;
}
export {add as default};
// 等同于
// export default add;

// app.js
import { default as foo } from 'modules';
// 等同于
// import foo from 'modules';

import命令会被 JavaScript 引擎静态分析,即在编译时做分析,不能像require那样在运行时分析。所以在es6的语法中,export 、import只能处于moduel的顶层,不能在块级作用域或者有表达式、变量等。

你可能感兴趣的:(es6的module使用,imort,export)