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

    1. 使用模块模块化的好处
      1. 避免变量污染,命名冲突
      2.  提高代码复用性
      3.  提高维护性
      4. 依赖关系的管理
    2. 基本思想
      //使用立即执行函数
      //
      闭包思想,内层作用域才能访问外层作用域 var module = (function() { let count = 5; let m1 = function() { count++ }; let m2 = function() { count-- }; let m3 = function() { console.log(count) } return{ m1, m2, m3 } })()
    3. 前端模块化比较
      1. commonjs基于nodejs的模块化方案,同步的加载在充满异步的浏览器中会产生很多问题
        1. 一个文件就是一个模块,拥有自己的作用域
          //a.js
          //被require的时候,只会执行一次这个函数,然后把结果存起来
          var a = 100;
          a+=100;
          module.exports = {
              a
          }
          //b.js
          var a = require('./a.js'); //{ a: 200 }
          //c.js
          var a = require('a.js'); //{ a: 200 }
      2. 基于amd规范的requireJs(依赖前置,你需要的模块之前写在之前),依赖模块谁下载好就执行,和书写顺序无关,最后在执行你的主要逻辑
        1. <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>前端模块化</title>
              <!-- 引入requieJs -->
          <script type="text/javascript" src="http://j1.58cdn.com.cn/ui7/post/pc/libs/require.min_v20150611214822.js"></script>
          <script>
              //参数一:依赖的模块;
              //参数二:模块加载完毕后执行的回掉函数,参数是依赖模块的返回值
              require(["a.js"],(add)=>{ 
                  add() //并不会阻碍浏览器渲染,所以页面显示123后弹出123
              })
          </script>
          </head>
          <body>
              123
          </body>
          
          </html>
          //a.js
          //require定义模块
          define(function() { var add = ()=>{ alert("123") } return add })
        2.   require.config()方法进行配置,相当于给你的路径制定一个简单的名字
          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>前端模块化</title>
              <!-- 引入requieJs 为了1防止阻碍浏览器渲染,指定异步加载 defer为了IE -->
          <script type="text/javascript" src="http://j1.58cdn.com.cn/ui7/post/pc/libs/require.min_v20150611214822.js"></script>
          <script>
              require.config({
                  baseUrl: 'js', //指定require的路径的目录,不指定的话就是加载require的这个文件的目录
                  paths: {   //相当于对你的路径更改一个简单的名字
                      a: 'zimu/a',
                      b: 'zimu/b',
                      jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min' //也可以指定网络路径
                  }
              })
              //引入模块a 从设置可以知道a==js/zimu/a
              require(['a'])
          </script>
          </head>
          <body>
              123
          </body>
          </html>
          //a.js

          define(['b'],()=>{
            //此处先引入一下b模块
             console.log("a");
          })

          //b.js
          define(()=>{
              console.log("b");
          })

          控制台最终结果

      3. 基于cmd规范的seaJs(就近依赖,你需要用的时候写在附近),依赖模块下载之后不执行,当你require的时候才执行,和你的书写顺序有关
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>前端模块化</title>
            <!-- 引入requieJs 为了1防止阻碍浏览器渲染,指定异步加载 defer为了IE -->
        <script type="text/javascript" src="https://cdn.bootcss.com/seajs/3.0.3/sea.js"></script>
        <script>
            //引用的三种方式
            //方式1:seajs.use(一般只用在页面载入入口模块)
            seajs.use(["./a.js"])
            //方式2:require 同步往下加载    
            //方式3:require.async 异步往下加载,加载完成后,执行回调函数
        </script>
        </head>
        <body>
            123
        </body>
        </html>
        //a.js
        //错误示例
        define(function(require,exports,module) {
            var a = 100;
            console.log(a);
            require(["./b"]);
            module.exports = {
                a
            }
        })
        //同样需要先指定你所依赖的模块
        //修订之后
        //require定义模块
        define(["./b"],function(require,exports,module) {
            var a = 100;
            console.log(a);
            require(["./b"]);
            module.exports = {
                a
            }
        })
        //b.js
        define((require,exports,module)=>{
            console.log("b");
        })

        最终结果:

  • 相关阅读:
    JavaScript对原始数据类型的拆装箱操作
    Javascript继承(原始写法,非es6 class)
    动态作用域与词法作用域
    自行车的保养
    探索JS引擎工作原理 (转)
    C语言提高 (7) 第七天 回调函数 预处理函数DEBUG 动态链接库
    C语言提高 (6) 第六天 文件(续) 链表的操作
    C语言提高 (5) 第五天 结构体,结构体对齐 文件
    C语言提高 (4) 第四天 数组与数组作为参数时的数组指针
    C语言提高 (3) 第三天 二级指针的三种模型 栈上指针数组、栈上二维数组、堆上开辟空间
  • 原文地址:https://www.cnblogs.com/longlongdan/p/10530088.html
Copyright © 2011-2022 走看看