js 模块化

  

es6之前

1.代码模块化

通过使用立即执行函数,对象和闭包创建的模块方式称为

作用域只有两种:全局作用域和函数作用域

main.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="./main.js"></script>
</head>

<body>

    <button onclick="click">点 击</button>
    <script>
        mouseCounterModule.countClick()
    </script>
</body>

</html>

main.js

const mouseCounterModule = function () {
   let count = 0
   const click1 = () => {
      console.log(++count)
   };

   return {
      countClick: () => {
         document.addEventListener("click", click1)
      }
   };
}();

2.模块扩展

3.AMD模块化

 

4.CommonJs模块化

es6模块

 main.js

命名导出

//导出
let a='aaa'
export let b='bbb'
export function f(){
   console.log('fff')
}

main.html

需要使用花括号对

<body>
    <script>
        // 导入命名
        import { b, f } from "./main.js"
        f()
    </script>
</body>

报错

 解决:script 添加 type="module" 属性

    <script type="module">
     import {b,f} from "./main.js"
     f()
    </script>

又报错误:

 解决:

跨域问题,需要起个服务端

 vscode安装

 运行

 ok

全部导入

    <script type="module">
     import * as mainModule from "./main.js"
     console.log(mainModule.b)
     mainModule.f()
    </script>

mainModule点的时候没提示?

指定导出

let a = 'aaa'
let b = 'bbb'
function f() {
    console.log('fff')
}

export {b, f}

导出时使用别名

export {b as bbb, f as fff}

默认导出

默认导出使用 export default

一个模块里只能有一个 export default

使用了 export default 变量函数或者类,不用加{}

let  a = 'aaa'

export default class Student {
   constructor(name) {
      this.name = name
   }
}

导入

    <script type="module">
        import Student from "./main.js"
        let a = new Student('li')
        console.log(a.name)
    </script>

 

在一行里同时导入多种类型

let  a = 'aaa'
export let b = 'bbb'

export  function f() {
   console.log('fff')
}

export default class Student {
   constructor(name) {
      this.name = name
   }
}

导入

    <script type="module">
        import Student, { b, f } from "./main.js"
        console.log(b)
        f()
        let a = new Student('li')
        console.log(a.name)
    </script>

使用别名解决多个模块名称重复问题

a1.js

export let a = 'a1'

a2.js

export let a = 'a2'

main.html

<body>
    <script type="module">
        import {a as a1} from "./a1.js"
        import {a as a2} from "./a2.js"
        console.log(a1)
        console.log(a2)
    </script>
</body>
原文地址:https://www.cnblogs.com/buchizaodian/p/14797227.html