ES6 Module模块化

本文详细介绍了ES6模块的基础知识及使用方法,包括export和import的基本用法、别名的使用、export default与export混用的方法,以及模块加载的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ES6 Module模块化

概述

ES6提供了模块化的设计,可以将具有某一类特定功能的代码放在一个文件里,在使用时,只需要引入特定的文件,便可以降低文件之间的耦合性。

用法

  • export 负责定义模块对外输出内容。
  • import 负责引入内容

export

  • 相同变量只能 export 1次。
  • 可以通过 as 关键字设置别名。
统一导出
let name = "小明";
let age = 18;
let sex = true;
let address = ["北京市", "海淀区"];
let userInfo = {
    name, age, sex
};
function sayHello() {
    console.log("hello");
}

export {name, age, sex, address, userInfo, sayHello};
同时定义变量并且导出
export let name = "小明";
export let age = 18;
export let sex = true;
export let address = ["北京市", "海淀区"];
export let userInfo = {
    name, age, sex
};
export function sayHello() {
    console.log("hello");
}
使用别名
let name = "小明";
let age = 18;

export {name as newName, age as newAge};

import

  • import 的变量名必须与 export 的变量名一致。
  • 相同的变量名只能 import 1次。
  • import 命令具有提升效果,会将 import 的内容提升到文件头部。
  • 多次 import,只会加载1次。
  • import 变量是只读的,不可修改。
  • 通过 as 关键字设置别名。
  • 可以通过 * 和 as 关键字进行整体加载。

在 HTML 中使用,需要使用 script 标签:

<script type="module">
    import {name, age} from './myexport.js';
    console.log(name);
    console.log(age);
</script>
统一引入
import {name, age, sex, address, userInfo, sayHello} from './myexport.js';

console.log(name);
console.log(age);
console.log(sex);
console.log(address);
console.log(userInfo);
sayHello();
提升效果:
console.log(name);
console.log(age);
import {name, age} from './myexport.js';
设置别名
import {name as newName, age as newAge} from './myexport.js';

console.log(newName);
console.log(newAge); 
整体加载
import * as user from './myexport.js';

console.log(user.name);
console.log(user.age);
console.log(user.sex);
console.log(user.address);
console.log(user.userInfo);
user.sayHello();

export default

如果不需要设置变量名,可以使用 export default 命令。

一个文件只能有一个 export defalt 命令。

// myexport.js

let name = "小明";
let age = 18;
let sex = true;
let address = ["北京市", "海淀区"];
let userInfo = {
    name, age, sex
};
function sayHello() {
    console.log("hello");
}
const user = {name, age, sex, address, userInfo, sayHello};

export default user
// myimport.js

import user from './myexport.js';

console.log(user.name);
console.log(user.age);
console.log(user.sex);
console.log(user.address);
console.log(user.userInfo);
user.sayHello();

export和export default混用

// myexport.js

let user = {
    name: "小明",
    age: 18,
    sex: true
};

function sayHello() {
    console.log("hello");
}

export default user;
export {sayHello};
// myimport.js

import user from './myexport.js';
import {sayHello} from './myexport.js';

console.log(user);
sayHello();

等价于下面:

// myimport.js

import user, {sayHello} from './myexport.js';

console.log(user);
sayHello();

this指向问题

  • 在js中,顶层的this指向window对象。
  • 模块中,顶层的this指向undefined。
// module.js

console.log(this);
<script src="./module.js"></script>
<script src="./module.js" type="module"></script>

打印输出:

在这里插入图片描述

import 和 import()

  • import命令具有提升作用,会提升到整个模块的头部,并率先执行。
  • import()是一个函数,可以动态导入,返回一个promise对象。
// mobile.js

export default "这是移动端";
// pc.js

export default "这是PC端";
let isPc = true;
if (isPc) {
    import("./pc.js").then((module) => {
        console.log(module.default);
    });
} else {
    import("./mobile.js").then((module) => {
        console.log(module.default);
    });
}

导入导出复合写法

// module1.js

export const age = 18;
// module2.js

import { age } from "./module1.js";
export { age };
import { age } from "./module2.js";
console.log(age); //18

module2.js可简写为:

// module2.js

export { age } from "./module1.js";

模块的继承

//base.js

let name = "Tom";
let age = 28;
let address = "beijing";

export { name, age, address }
//children.js

export * from "./base.js"
export function sayHello() {
    console.log("sayHello");
};
<script type="module">
    import * as myobj from "./js/children.js";

    console.log(myobj.name, myobj.age, myobj.address);
    myobj.sayHello();
</script>

//Tom 18 beijing
//sayHello

module加载的本质

ES6模块的运行机制是这样的:当遇到import命令时,不会立马去执行模块,而是生成一个动态的模块只读引用,等到需要用到时,才去解析引用对应的值。

由于ES6的模块获取的是实时值,就不存在变量的缓存。

// myexport.js

export let count = 0;

export function increaseCount() {
    count += 1;
}
// myimport.js

import {count, increaseCount} from "./myexport.js";

console.log(count); // 0
increaseCount();
console.log(count); // 1
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值