注册 登录

清河洛

ES6中模块的export语句

qingheluo2023-05-08清河洛337
一个模块就是一个独立的文件,该文件内部的所有变量,外部无法获取,使用export关键字输出的模块内部变量外部才能够读取export语句规定的是对外的接口,必须与模块内部的变量建立一一对应关系,即export导出的仅仅是变量而非这个变量指向的值由于export导出的仅仅是一个变量,那么只要能被变量指向的数据都可以实现导出,无论是数字、字符串、数组、集合、对象、函数、类等等,都是可以导出的export语句可以出现在模块顶层代码中的任何位置,如果处于块级作用域内会报错,因为处于块级代码块之中,就没法做静态优化了,违背了ES6模块的设计初衷在定义时导出:在变量定义时就添加关键子export进行导...

一个模块就是一个独立的文件,该文件内部的所有变量,外部无法获取,使用export关键字输出的模块内部变量外部才能够读取

export语句规定的是对外的接口,必须与模块内部的变量建立一一对应关系,即export导出的仅仅是变量而非这个变量指向的值

由于export导出的仅仅是一个变量,那么只要能被变量指向的数据都可以实现导出,无论是数字、字符串、数组、集合、对象、函数、类等等,都是可以导出的

export语句可以出现在模块顶层代码中的任何位置,如果处于块级作用域内会报错,因为处于块级代码块之中,就没法做静态优化了,违背了ES6模块的设计初衷

在定义时导出:在变量定义时就添加关键子export进行导出

export let name = "qingheluo";
export let age  = 35;
export let info = {
    like:'no job',
    firends:['张三','李四','王五','赵六']
}
export function sleep(){
    console.log('i am sleeping');
}
以上表示每个变量在定义时就指定了要导出

export "qingheluo"; //报错,不能直接导出数据

统一导出:使用一个export语句统一导出所有需要导出的变量

上例中的所有变量定义前的export去掉,在最后面添加语句

export {name , age , info , sleep};

即可一次性导出所有到导出的变量

这种写法导出必须为含导出变量的集合,否则报错

let name = 'myname';
export name; //报错,必须为集合
export { name }; //正确

实际使用中应优先考虑这种写法。这样可以在脚本尾部一眼看清楚输出了哪些变量,便于维护

使用别名

导出时使用as关键字可以对导出的变量名进行重命名:"name as new_name"

可以为一个变量进行多次重命名,多个名称指向同一个变量

export {
    name as myname,
    name as mingzi,
    info as myinfo
};

动态绑定:

由于export导出的仅仅是一个变量,即一个数据的引用,其对应的值是动态绑定关系,通过该变量可以取到模块内部实时的值

export let name = 'myname';
setTimeout(() => name = 'newname', 1000);

上面代码导出变量foo,值为myname,1 秒之后变成newname

这一点与CommonJS规范完全不同,CommonJS模块输出的是值的副本,不存在动态更新

export default语句

使用import语句的时候,正常情况下需要知道所要export语句导出的变量名,否则无法加载

为了使用的方便,在不知道export语句导出的变量名时,用export default语句为模块指定默认输出

导出语句

在定义时设置:仅可使用在函数、类等没有使用var、let、const关键字的定义,在定义语句之前添加"export default"

export default function () {}
export default class {}

一般我们使用匿名函数或类,当函数或类不是匿名时会忽略名称,视为匿名
export default function func_name(){}
    //会忽略func_name函数名,视为匿名函数

在模块文件末尾设置:export default val;

导出的变量无需使用大括号,直接导出即可

引入语句

其他模块加载该模块时,import语句可以为export default导出的值绑定任意变量名,且引入时无需使用大括号

import my_val from 'path/demo.js';
    // my_val可以随意,无需知道原模块使用export defult语句导出的变量名
    // 无需使用大括号,一旦使用了大括号,就会寻找与名称对应的常规导出变量

一个模块只能有一个默认输出,因此export default命令只能使用一次。所以,import命令后面才不用加大括号,因为只可能唯一对应export default命令

本质上,export default就是输出一个叫做default的变量或方法,然后系统允许为它取任意名字

function func() {}
export {func as default};
    // 等同于
export default func;

import { default as foo } from 'path/demo.js';
    // 等同于
import foo from 'path/demo.js';

正是因为export default命令其本质就是输出一个叫做default的变量,所以它后面不能跟变量声明语句。

export default var a = 1;  // 错误

var a = 1;
export default a;  // 正确
    // 含义是将变量a的值赋给变量default

因为export default命令的本质是将后面的值,赋给default变量,所以可以直接将一个值写在export default之后

export default 42;  // 正确
export 42;  // 报错

同时导入模块默认值和指定变量

import default_val,{val1,val2,...} from 'path/demo.js';

导出其他模块中的变量

export { val1, val2, ... } from 'path/test.js';
export { val1 as v1, val2 as v2, ... } from 'path/test.js';
export { default } from 'path/test.js';
    // 将其他模块中的默认接口作为该模块的默认接口导出
export { val1 as default } from 'path/test.js';
    // 将其他模块中的指定变量的值作为该模块的默认接口导出
    // 等同于
    import { val1 } from 'path/test.js';
    export default val1;
export { default as val1 } from 'path/test.js';
    // 将其他模块中的默认接口作为该模块的指定变量导出

export * from 'path/test.js';
    // 导出其他模块中的所有变量,忽略默认接口
export * as val from 'path/test.js';
    // 将其他模块中的所有变量作为一个对象val导出
    // 等同于
    import * as val from 'path/test.js';
    export { val };

export和import语句结合在一起写成一行后,导出的其他模块的变量实际上并没有被导入当前模块
只是相当于对外转发了这两个接口,当前模块不能直接使用导出的变量


网址导航