ES6 导入导出形式汇总
import A from 'xx';
import { default as A } from 'xx';
import { B } from 'xx';
import { B as C } from 'xx';
import A,{ B as C, D } from 'xx';
import 'xx.(js|ts|css|less)';
import * as Foo from 'xx';
export const A = 'xx';
const A = 'xx';
export { A }
const A = 'xx';
export { A as B }
const A = 'xx';
export default A
const A = 'xx';
export {A as default}
export const A=111;
export const B=111;
export default function C(){}
export const A=111;
export const B=111;
export default function C(){}
export * from './foo.js';
export { A, B as K } from './foo.js';
export * from './foo.js';
export const A=999;
export { default } from './foo.js';
export { A as default } from './foo.js';
export { default as p } from './foo.js';
几个要注意的点
-
导入的是引用的导入,指向的是同一个源,原则上导入多次,指向的源一样,那么他们的值都是相等的,同时对他们任何一个操作之后,都会同时改变【ems系统的导入导出是单例模式】
import { A as A1 } from 'A';
import { A as A2 } from 'A';
import { A as A3 } from 'A';
console.log(A1===A2===A3);
A1.b=666;
console.log(A1.b===A2.b===A3.b===666);
-
接着上一点说的:导入对模块而言是只读的,实际上相当于const声明的变量。在使用*执行批量导入时,赋值给别名的命名导出就好像使用Object.freeze()冻结过一样。直接修改导出的值是不可能的,但可以修改导出对象的属性。同样,也不能给导出的集合添加或删除导出的属性。要修改导出的值,必须使用有内部变量和属性访问权限的导出方法。
import foo, * as Foo from './foo.js';
foo = 'foo';
Foo.foo = 'foo';
foo.bar = 'bar';
-
模块可以通过使用import关键字使用其他模块导出的值
import { foo } from './foo.js'
console.log(foo)
export { foo } from './foo.js'
console.log(foo)
-
es module 是静态的,必须要先加载,于是esm更多的是必须要在顶层。export和import必须出现在模块顶级,就算不在顶级也会提升到顶级
- esm 运行时是不能被支持的
- 由于预加载这个特性就决定了esm天生就是适合静态分析的
import foo from './foo.js';
if(xxx){
import foo from './foo.js';
}
console.log(66666);
import foo from './foo.js';
-
导出就是单纯的导出,是一个值的导出,导入使用的时候不要掺杂任何运算和执行语句在内
const foo={A:1,B:2,C:3}
export { foo };
import foo from './foo.js';
console.log(foo.A)
import {A,B,C} from './foo.js';
import {A + B} from './foo.js';
const a=1,b=2,c=3;
export default {
A:a,
B:b,
C:c
}
import {A,B,C} from './foo.js';
import foo from './foo.js';
console.log(foo.A,foo.B,foo.C)
-
ESM模块系统会识别作为别名提供的default关键字。此时,虽然对应的值是使用命名语法导出的,实际上则会成为默认导出
const foo={A:1,B:2,C:3}
export default foo
export {foo as default}
-
ESM模块系统命名导出可以多个,且多种类型,默认导出只能一个
const foo={A:1,B:2,C:3}
export const A=666;
export const B=999;
export { foo }
export default function fnd(){}
import fnd,{A,B,foo} from 'xxx'
export default const foo = 'bar';
export { 123 as foo }
export const foo = 'foo' as myFoo;
-
默认导出居然和位置有关【看来 export default不是完全提升,只是执行语句提升到一级,但是并不会执行语句下沉到页面最后,而export则看上去会提升下沉到页面最下方】
-【这个可以理解因为:export default命令的本质是将后面的值,赋给default变量,一旦赋值就执行导出,所以一旦执行了default,就是将变量赋值给了default,这时在export default后面再对变量进行赋值就会失败】
let e1='export 1';
export default e1;
e1='export 1 modified';
import e1 from "./a.js"
let e1='export 1';
e1='export 1 modified';
export default e1;
import e1 from "./a.js"
let e1='export 1';
export {e1};
e1='export 1 modified';
import {e1} from "./a.js"
-
导入即执行
- import是导入即执行的,即导入之后,对应导入的模块的代码和副作用就会执行【有的人甚至直白简单的翻译为:import导入就是copy过来,虽然有出入但是很形象】
- 这点很重要要谨记