ES6中的模块

vue 董德咏
文章标签: import export module

前言:无论是之前学的服务端的node.js还是现在做项目vue都有暴露模块和引用模块的身影,感觉挺有意思的,就整理了一下网上关于对于es6模块化的资料。



概述

在 ES6 前, 实现模块化使用的是 RequireJS 或者 seaJS(分别是基于 AMD 规范的模块化库,  和基于 CMD 规范的模块化库)。

ES6 引入了模块化,其设计思想是在编译时就能确定模块的依赖关系,以及输入和输出的变量。

ES6 的模块化分为导出(export) @与导入(import)两个模块。

个人补充:如果是在原生js上使用,在html引用js文件(有模块的)时候,比如:

<script src="./imTest.js" type="text/javascript"></script>

或者

<script src="./imTest.js" ></script>

都会报错!!!

1599363855(1).jpg

报错的原因是用了es6的语法, 浏览器默认将它作为js解析会出现问题,需要将它作为模块导入,因此,我们需要将其修改为<script src="./imTest.js" type="module"></script>,修改之后就会出现正确的结果:


特点

ES6 的模块自动开启严格模式,不管你有没有在模块头部加上 use strict;。

模块中可以导入和导出各种类型的变量,如函数,对象,字符串,数字,布尔值,类等。

每个模块都有自己的上下文,每一个模块内声明的变量都是局部变量,不会污染全局作用域。

每一个模块只加载一次(是单例的), 若再去加载同目录下同文件,直接从内存中读取。

emmmm......再具体的用法挪步到

菜鸟教程 https://www.runoob.com/w3cnote/es6-module.html


笔者这里就简单介绍一下ES6模块比较明显的特点.。

暴露关键字:export 、export default

作用:可以把任意类似的变量暴露出去

区别:export 暴露模块需要具体变量名字,而且在import

引入时候,要用{}扩起来,当然引入全部取别名就另论。

export default 暴露的模块可以不用变量名,直接暴露就可以了,在import

引入时候,不需要{}扩起来,而且可以起任意名字。

下面是例子:

目录:1599364525(1).jpg

exTest.js:导出模块

imTest.js:导入模块

showTest.html:输出演示

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script src="./imTest.js" type="module"></script>
		<!-- module -->
	</body>
</html>

export:

exTest.js代码:

imTest.js代码:

import {name,fn} from './exTest.js';
console.log(name)
fn();

imTest.js代码也可以写成:

// import {name,fn} from './exTest.js';
// console.log(name)
// fn();
import {name} from './exTest.js';
import {fn} from './exTest.js';
console.log(name)
fn();

如果不想暴露模块的变量名,可以在导入模块部分(import)通过as来给变量命名别名:

// import {name} from './exTest.js';
// import {fn} from './exTest.js';
// console.log(name)
// fn();
import {name as uname,fn as myFn} from './exTest.js';
console.log(uname)
myFn();


输出结果:1599365485(1).jpg

用export default写得话,简单很多:

exTest.js代码:

export default "水晶"
export default function(){
	console.log("小明")
}

imTest.js代码:

import name from './exTest.js'
import fn from './exTest.js';
fn();
console.log(name);

会报错:1599365738(1).jpg

因为一个模块默认导出只能有一个

exTest.js代码改写:

let name="小明";
let fn=function(){
	console.log("水晶")
}
export default {name,fn}

imTest.js代码:

import obj from './exTest.js';
obj.fn();
console.log(obj.name);

输出结果:

1599366284(1).jpg

还能输出{{restrictNumber}}个字符  
  • {{reply.author}}

    {{CommonUtil.formateDate(reply.ac_CommentDate).shortTime}}
  • 回复了{{Comments.author}} :