09-模块化

nobility 发布于 2023-04-29 02-ES6 298 次阅读


模块化

导入导出语句只能在顶级作用域下,也就是说不能在 if 等语句和函数中

从 v 13.2 版本开始,Node. Js 才打开了 ES 6 模块支持

Export

  • 声明导出:直接导出一条声明语句;此时对外的接口就是声明的变量、函数、类
Export var a = 1;
Var b = 1;
//export b;	//报错,静态解析,未指定对外的接口他相当于 export 1;
  • 整体导出:导出以代码块逗号分隔导出变量的形式;此时对外的接口就这些变量名
Var a = 1;
Var b = 1;
Export{a, b};
Export{a}	//不会报错,因为指定了对外接口
  • 定义别名:可以为每个变量使用as定义别名;此时对外的接口就是别名
Var a = 1;
Var b = 1;
Export {a as aa, b as bb};	//指定别名
  • 默认导出:每个模块只能有一个默认导出语句,可以导出变量也可以导出声明,因为此时变量的对外接口是default所以可以导出一个单个变量
Export default function fun (){};
//相当于
Var fun = function (){};
Export default fun;

//export default var a = 1;	//报错,因为已经指定了对外接口是 default 了,所以在指定为 a 就有冲突

Import

  • 逐个导入:导入代码块逗号分隔接口的形式;此时要求导出的接口与导入的接口名完全一致
    • 导入的变量就像是 const 声明的变量那样,不允许修改
    • 导入语句会提升到文件首部
    • 多次导入同一模块也只会执行一次导入操作
    • 由于是静态执行的,所以导入模块必须是字符串常量,不能以变量的形式指定模块
/*-------lib. Js-------*/
Var a = 1;
Var b = 1;
Export {a as aa, b};	//指定别名
/*------main. Js--------*/
Import {aa, b as bbb} from "lib. Js";	//此时 js 后缀可以省略,并且也可以指定别名
Import "lib. Js";	//只加载模块,不导入任何变量
  • 整体导入:导入*必须定义别名,此时对象的属性就是所有导出的变量
    • 导入的对象是不允许修改的
/*-------lib. Js-------*/
Var a = 1;
Var b = 1;
Export {a as aa, b};	//指定别名
/*------main. Js--------*/
Import * as obj from "lib. Js";	//此时 js 后缀可以省略,并且也可以指定别名
  • 默认导入:导入的是默认导出的变量,可以随意指定变量名
/*-------lib. Js-------*/
Export var a = 0;
Export default 1;
/*------main. Js--------*/
Import userName from "lib. Js";	//导入默认导出的内容,并为其命名为 userName
Import userName,{a} from "lib. Js";	//同时导入默认导出内容和非默认导出内容

浏览器模块加载

异步加载

为 script 标签添加deferasync属性

  • defer:页面渲染结束后加载
  • async:js 脚本现在完毕加载

开启浏览器 js 脚本模块化

为浏览器添加type="module"属性和属性值,此时默认的异步加载方式是defer,可以手动修改为async

CommonJS 模块 ES 6 模块的区别

  • CommonJs 是运行时加载,值拷贝,若模块中在加载完毕后对导出的模块变量进行修改,则引入模块的程序不会检测到
  • ES 6 是编译时输出接口,值引用,若模块中在加载完毕后对导出的模块变量进行修改,则引入模块的程序也会检测到
加油啊!即便没有转生到异世界,也要拿出真本事!!!\(`Δ’)/
最后更新于 2023-04-29