1. 是什么

模块化简单来说就是将一个完整的长篇代码文件根据功能进行划分成几个文件,这些文件各自负责一个独立的功能,各个文件组合起来实现一个完整的大功能,这就是模块化,每个负责独立功能的文件就是模块。

由于一开始JavaScript是在web页面需要的地方提供一定交互,所以一般不需要多大的脚本。但随着JavaScript脚本的复杂化,最新的浏览器已经开始原生支持JavaSript模块功能了。

2. 浏览器支持

使用JavaScript 模块依赖于 import 和 export,import 和 export 的浏览器支持程度是最新的浏览器版本都是支持的,但 IE 和旧版本的浏览器不支持,因此若想兼容 IE 和旧版本的浏览器基本就不能使用了。

export 和 import 是成对出现,配合工作的

JS模块化是各种JS框架学习的前提基础

import 和 export 语句用于将一个模块里实现某些功能的变量或函数导入/导出,也可导入/导出类

在浏览器中,import 语句只能在声明了 type=”module” 的 script 的标签中使用,否则会报错,报错如下:

  1. Uncaught SyntaxError: Cannot use import statement outside a module

此外,还有一个类似函数的动态 import(),它不需要依赖 type=”module” 的 script 标签。

3. export 导出模块

默认导出

一个模块只能有一个默认导出,默认导出的变量只能有一个,且不能有大括号{}

语法为export default 变量名

model.js

  1. function Test1(){
  2. console.log("这是默认导出")
  3. }
  4. function Test2(){
  5. console.log('这是命名导出')
  6. }
  7. export default Test1

批量导出

语法为export {变量名,变量名……}

  1. function Test1(){
  2. console.log("这是默认导出")
  3. }
  4. function Test2(){
  5. console.log('这是命名导出')
  6. }
  7. export {Test1, Test2}

4. import 导入模块

默认导入

main.js

  1. import Test1 from "./model.js"
  2. Test1()

默认导入的重命名

main.js

  1. import x from "./model.js"//x就是默认导出的Test1
  2. x()

批量导入

main.js

  1. import {Test1, Test2} from "./model.js"
  2. Test1();
  3. Test2();

批量导入的重命名

as关键字跟一个新名字实现重命名

main.js

  1. import {Test1 as x1, Test2 as x2} from "./model.js"
  2. x1();
  3. x2();

也可在导出时用as关键字重命名

model.js

  1. function Test1(){
  2. console.log("这是默认导出")
  3. }
  4. function Test2(){
  5. console.log('这是命名导出')
  6. }
  7. export {Test1 as x1, Test2 as x2}

应用模块

html

  1. <script type="module" src="main.js"></script>

5. 创建模块对象

使用对象,在as关键字重命名的基础上进一步简单化

  1. import * as Model from "./model.js"
  2. Model.x1();
  3. Model.x2();

6. export import 中转站

有时候可以将多个子模块组合到一个父模块中,再由父模块决定导出哪个,这个父模块文件就像是个组合各个模块的中转站

语法为export {变量名} from 模块路径

当前目录结构结构

  1. src
  2. index.html
  3. main.js
  4. redirection.js
  5. models
  6. model.js
  7. model2.js

model.js

  1. function Test1(){
  2. console.log("这是子模块1")
  3. }
  4. export {Test1}

model2.js

  1. function Test2(){
  2. console.log('这是子模块2')
  3. }
  4. export {Test2}

redirection.js

  1. export {Test1} from "./models/model.js"
  2. export {Test2} from "./models/model2.js"

main.js

  1. import * as Model from "./redirection.js"
  2. Model.Test1()
  3. Model.Test2()

html

  1. <script type="module" src="./main.js"></script>

7. 动态加载模块

动态加载模块用于在导入模块时不必预先加载所有模块,可以在需要时使用 import() 作为函数调用,将其参数传递给模块的路径,它返回一个 promise,使用 Promise 对象对模块加载结果操作。

语法为import(动态加载的模块路径)

dynamic.js

  1. function TestDy(){
  2. console.log("这是动态模块")
  3. }
  4. export default TestDy

main.js

  1. document.querySelector('.load').onclick = function(){
  2. import('./dynamic.js').then((Model)=>{
  3. Model.default()
  4. })
  5. }

8. 参考

以上来源于 mdn javascript模块 学习,加自己测试用例检验后的整理总结,以上测试的源码链接为 js 模块测试用例