zoukankan      html  css  js  c++  java
  • 前端模块化

    一、什么是模块?

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

    二、模块化开发的好处

    • 避免变量污染,命名冲突

    • 提高代码复用率

    • 提高了可维护性

    • 方便依赖关系管理,更好的分离, 并且按需加载

    三、模块化的演化

    1、全局function模式 

    • 编码: 将不同的功能封装成不同的全局函数
    • 缺点: 污染全局命名空间, 容易引起命名冲突或数据不安全,而且模块成员之间看不出直接关系
    function m1(){
      //...
    }
    function m2(){
      //...
    }

    2、namespace模式 : 简单对象封装

    • 优势: 减少了全局变量,解决命名冲突
    • 缺点: 数据不安全(外部可以直接修改模块内部的数据),会暴露所有模块成员,内部状态可以被外部改写。
    let myModule = {
      data: 'www.baidu.com',
      foo() {
        console.log(`foo() ${this.data}`)
      },
      bar() {
        console.log(`bar() ${this.data}`)
      }
    }
    myModule.data = 'other data' //能直接修改模块内部的数据
    myModule.foo() // foo() other data

    3、IIFE模式:匿名函数自调用(闭包)

    • 编码: 将数据和行为封装到一个函数内部, 通过给window添加属性来向外暴露接口
    • 优点: 数据是私有的, 外部只能通过暴露的方法操作
    • 缺点: 如果当前这个模块依赖另一个模块怎么办?

      比如如下的模块代码:

    (function(window) {
        let data = 'www.baidu.com';
        //操作数据的函数
        function foo() {
            //用于暴露公有函数
            console.log(`我是函数foo(),data为:${data}`)
        }
        function bar() {
            //用于暴露公有函数
            console.log(`我是函数bar(),data为:${data}`);
            otherFun() //内部调用
        }
        function otherFun() {
            //内部私有的函数
            console.log('我是函数otherFun()')
        }
        //暴露行为
        window.myModule = { foo, bar } //ES6写法
    })(window);

      调用方法如下代码所示:

    <script type="text/javascript" src="module.js"></script>
    <script type="text/javascript">
        myModule.foo();
        myModule.bar();
        console.log(myModule.data);//undefined 不能访问模块内部数据
        myModule.data = 'xxxx';//不是修改的模块内部的data
        myModule.foo() //没有改变
    </script>

      结果如下所示:

     4、IIFE模式增强 : 引入依赖

      比如引入jQuery

      比如如下的模块代码:  

    (function(window, $) {
      let data = 'www.baidu.com'
      //操作数据的函数
      function foo() {
        //用于暴露公有函数
        console.log(`foo() ${data}`)
        $('body').css('background', 'red')
      }
      function bar() {
        //用于暴露公有函数
        console.log(`bar() ${data}`)
        otherFun() //内部调用
      }
      function otherFun() {
        //内部私有的函数
        console.log('otherFun()')
      }
      //暴露行为
      window.myModule = { foo, bar }
    })(window, jQuery)

      调用方法如下代码所示:  

    <!-- 引入的js必须有一定顺序 -->
    <script type="text/javascript" src="jquery-1.10.1.js"></script>
    <script type="text/javascript" src="module.js"></script>
    <script type="text/javascript">
        myModule.foo()
    </script>
  • 相关阅读:
    Java equals()和hashCode()重写总结
    常见ORM框架理解
    struts2的第一个小页面
    Java开发StringBuilder类
    “中软综合项目实训”——把学生当员工培养
    中软寻梦
    软件开发学习的5大技巧
    从学生心理入手
    IT技术人员的职业发展方向
    驱动创新 引领未来
  • 原文地址:https://www.cnblogs.com/gg-qq/p/14166325.html
Copyright © 2011-2022 走看看