JS模块化1_模块化进化史

待我称王封你为后i 2022-09-12 11:49 317阅读 0赞

JS模块化

  • 什么是模块?

    • 将一个复杂的程序依据一定的规则(规范)封装成几个块(文件), 并进行组合在一起
    • 块的内部数据/实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信
  • 一个模块的组成

    • 数据—>内部的属性
    • 操作数据的行为—>内部的函数
  • 模块化

    • 编码时是按照模块一个一个编码的, 整个项目就是一个模块化的项目

模块化进化史

1. 全局function模式

  • module1.js

    1. //数据
    2. let data = 'atguigu.com'
    3. //操作数据的函数
    4. function foo() {
    5. console.log(`foo() ${ data}`)
    6. }
    7. function bar() {
    8. console.log(`bar() ${ data}`)
    9. }
  • module2.js

    1. let data2 = 'other data';
    2. function foo() { //这里与另一个模块中的函数冲突了
    3. console.log(`foo() ${ data2}`)
    4. }
  • test.html

    1. <script type="text/javascript" src="module1.js"></script>
    2. <script type="text/javascript" src="module2.js"></script>
    3. <script type="text/javascript">
    4. let data = "我是修改后的数据"
    5. foo()
    6. bar()
    7. </script>
  • 说明:

    • 全局函数模式: 将不同的功能封装成不同的全局函数
    • 问题: Global被污染了, 很容易引起命名冲突

2. namespace模式

  • module1.js

    1. let myModule = {
    2. data: 'module1 atguigu.com',
    3. foo() {
    4. console.log(`foo() ${ this.data}`)
    5. },
    6. bar() {
    7. console.log(`bar() ${ this.data}`)
    8. }
    9. }
  • module2.js

    1. let myModule2 = {
    2. data: 'module2 atguigu.com',
    3. foo() {
    4. console.log(`foo() ${ this.data}`)
    5. },
    6. bar() {
    7. console.log(`bar() ${ this.data}`)
    8. }
    9. }
  • test.html

    1. <script type="text/javascript" src="module2.js"></script>
    2. <script type="text/javascript" src="module22.js"></script>
    3. <script type="text/javascript">
    4. myModule.foo()
    5. myModule.bar()
    6. myModule2.foo()
    7. myModule2.bar()
    8. //可以直接修改模块内部的数据
    9. myModule.data = 'other data'
    10. myModule.foo()
    11. </script>
  • 说明

    • namespace模式: 简单对象封装
    • 作用: 减少了全局变量
    • 问题: 依然可以修改模块内部代码,不安全

3. IIFE模式(闭包)

  • module1.js

    1. (function (window) {
    2. //数据
    3. let data = 'atguigu.com'
    4. //操作数据的函数
    5. function foo() { //向外暴露的内部私有函数
    6. console.log(`foo() ${ data}`)
    7. }
    8. function bar() { //向外暴露的内部私有函数
    9. console.log(`bar() ${ data}`)
    10. otherFun() //内部调用
    11. }
    12. function otherFun() { //未暴露的内部私有函数
    13. console.log('otherFun()')
    14. }
    15. //暴露行为
    16. window.myModule = { foo, bar}
    17. })(window)
  • test.html

    1. <script type="text/javascript" src="module3.js"></script>
    2. <script type="text/javascript">
    3. myModule.foo()
    4. myModule.bar()
    5. //myModule.otherFun() //报错:myModule.otherFun is not a function
    6. console.log(myModule.data) //undefined 不能访问模块内部数据
    7. myModule.data = 'xxxx' //并不是修改的模块内部的data
    8. myModule.foo() //未受影响
    9. </script>
  • 说明:

    • IIFE模式: 匿名函数自调用(闭包)
    • IIFE : immediately-invoked function expression(立即调用函数表达式)
    • 作用: 数据是私有的, 外部只能通过暴露的方法操作
    • 问题: 如果当前这个模块依赖另一个模块怎么办?

4. IIFE模式增强

  • 引入jquery到项目中
  • module4.js

    1. (function (window, $) {
    2. //数据
    3. let data = 'atguigu.com'
    4. //操作数据的函数
    5. function foo() { //用于暴露有函数
    6. console.log(`foo() ${ data}`)
    7. $('body').css('background', 'red')
    8. }
    9. function bar() { //用于暴露有函数
    10. console.log(`bar() ${ data}`)
    11. otherFun() //内部调用
    12. }
    13. function otherFun() { //内部私有的函数
    14. console.log('otherFun()')
    15. }
    16. //暴露行为
    17. window.myModule = { foo, bar}
    18. })(window, jQuery)
  • test4.html

    1. <script type="text/javascript" src="jquery-1.10.1.js"></script>
    2. <script type="text/javascript" src="module4.js"></script>
    3. <script type="text/javascript">
    4. myModule.foo()
    5. </script>
  • 说明

    • IIFE模式增强 : 引入依赖
    • 这就是现代模块实现的基石

5. 页面加载多个js的问题

  • 页面:

    1. <script type="text/javascript" src="module1.js"></script>
    2. <script type="text/javascript" src="module2.js"></script>
    3. <script type="text/javascript" src="module3.js"></script>
    4. <script type="text/javascript" src="module4.js"></script>
    5. <script type="text/javascript" src="module5.js"></script>
    6. <script type="text/javascript" src="module6.js"></script>
    7. <script type="text/javascript" src="module7.js"></script>
    8. <script type="text/javascript" src="module8.js"></script>
    9. <script type="text/javascript" src="module9.js"></script>
    10. <script type="text/javascript" src="module10.js"></script>
    11. <script type="text/javascript" src="module11.js"></script>
    12. <script type="text/javascript" src="module12.js"></script>
  • 说明

    • 一个页面需要引入多个js文件
    • 问题:

      • 请求过多
      • 依赖模糊
      • 难以维护
    • 这些问题可以通过现代模块化编码和项目构建来解决

发表评论

表情:
评论列表 (有 0 条评论,317人围观)

还没有评论,来说两句吧...

相关阅读