美文网首页我爱编程
关于模块化的思考

关于模块化的思考

作者: zz77zz | 来源:发表于2018-06-20 12:23 被阅读28次

    模块就是实现功能的一组方法。
    js模块编程,js不支持类 更别提模块,es6将支持类和模块。

    什么是模块?

    定义:具有相同属性和行为的事物集合。在前端中将一些属性比较类似的内容放在同一个js文件里,这个js文件就称为模块。

    模块阮一峰博客js模块编程,js不支持 类 更别提模块,es6将支持类和模块
    例如:污染了全局变量,无法保证不与其他模块发生变量名冲突,而且看不出模块成员之间的关系。

    从对象到模块的演示过程

    var Calc_args = {
        current_args:null,
        init:function(){},
        change:function(){},
        verify:function(){},
    }
    
    var Calc_args = function(){
        var current_args = null
    
        function unit(){
            current_args = 'aili'
        }
    
        function change(){
            current_args = 'not Exist'
    
        }
    
        function verify(){
            current_args = 'not string'
        }
    }()
    Calc_args = function(){
        var current_args = null
        function unit(){
            current_args = 'aili'
        }
    
        return {
            change:function(){
                current_args = 'not Exist'
            },
            verify:function(){
                current_args = 'not string'
            }
        }
    }()
    
    
    Calc_args = function(){
        var current_args = null
        function unit(){
            current_args = 'aili'
        }
        function change(){
            current_args = 'not Exist'
    
        }
    
        function verify(){
            current_args = 'not string'
        }
    
        return {
            change:change,
            verify:verify
        }
    }()
    
    If you don’t need any of your variables or functions to be available to the outside, 
                                                                                 
    
    
    (function(){
        var current_args = null
        function unit(){
            current_args = 'aili'
        }
        function change(){
            current_args = 'not Exist'
    
        }
    
        function verify(){
            current_args = 'not string'
        }
    
        return {
            change:change,
            verify:verify
        }
    })()
    
    function m1(){}
    function m2(){}
    

    可以写成对象的形式

    var module = {
         m1:function(){},
         m2:function(){}
    }
    

    module.m1() -----> 这样会暴露模块的成员,容易被外部改写
    解决办法如下:
    使用立即执行函数(匿名闭包:LIFE模式):
    var module1 = (function(){
        var _count = 0;
        var m1 = function(){
          //...
        };
        var m2 = function(){
          //...
        };
        return {
          m1 : m1,
          m2 : m2
        };
      })();
    如果模块很大,或者一个模块要继承另一个模块。“放大镜式”
    var module = (function(mod){
    mod.m3 = funciton(){

    };
    })(module);
    在浏览器环境中,模块的各个部分通常都是从网上获取的,无法知道那部分会先加载,采用“宽放大模式”

    var module = (function(mod){
         return mod
    })(window.module || {});
    

    其实模块最重要的还是得 "独立",模块内部最好不与程序的其他部分直接交互

    为了在模块内部调用全局变量,必须显示的将其他变量输入模块。

    var module = (function($,yahooo){
         
    })(jQuery,Yahoo)
    

    上面的module1模块需要使用jQuery库和YUI库,就把这两个库(其实是两个模块)当作参数输入module1。这样做除了保证模块的独立性,还使得模块之间的依赖关系变得明显

    var Module = (function($){
        var _$body = $("body");     // we can use jQuery now!
        var foo = function(){
            console.log(_$body);    // 特权方法
        }
    
        // Revelation Pattern
        return {
            foo: foo
        }
    })(jQuery)
    
    Module.foo();
    

    这是模块模式,也就是现代模块实现的基石
    这是阮一峰大神对模块的思考

    purpose:为了让每个js各司其职。

    什么是模块化?CommonJs是什么?AMD和CMD又是什么?AMD和CMD声明方式

    1. 模块化:指的就是遵守commonjs规范那,解决不同js模块之间调用的问题
    2. CommonJs:
      • a.js文件中调用b.js文件,一定要在a.js中引入b.js
        require("b.js");
      • 另一个被调用的b.js对外暴露接口(可以是函数/obj/数组)。
        module.exports = b;

    这就是简单的模块化(module之间相互调用,协同工作实现某特定的功能)。

    1. AMD和CMD分别是:
      AMD:async module define 异步模块声明,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。

    CMD:common module define 公共模块声明。
    AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
    CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。

    模块化的好处:解决依赖关系,不同文件之间的调用和分工。

    4.AMD和CMD声明方式
    ReqiureJs
    模块声明规范:AMD.

    define( 'id', [ 'module1', 'module2' ], function( m1, m2 ) {
      return {
        arg1: m1,
        arg2: m2
      }
      //返回值即是module3的接口
    });
    参数1:id 是这个模块的名称,它是一个可选参数,默认为require加载此模块时指定的名称,若定义这个参数,那么这个模块名应当为“顶级”的,不允许相对名称。
        参数2:数组,为这个模块所依赖的其他模块
        匿名函数参数:为依赖模块在这个模块中的接口,它们是一一对应的,因此即便不需要某个模块的接口,但若是需要它后面模块的接口,那也必须给它增加一个用于占位的参数。
    

    SeaJs
    模块声明规范:CMD.

    define( function( require, exports, module ) {
      var c = require('./Controller.js');
      c();
    })
    

    RequireJs和SeaJs都是在前端实现模块化,相当于js的模块加载器,webpack则不一样,webpack是通过nodejs将文件打包的webpack的配置和使用

    什么是MVC?

    M:model(数据)
    V:view(HTML CSS Javasctipt)
    C:controller(逻辑:监听页面请求和事件,处理请求和事件;想Model请求数据,得到数据后绑定到页面).
    
    对外提供数据
    体现一种分层,让给个层面做自己该做的,减少代码耦合度和冗余。
    

    为什么要用MVC?

    • 低耦合
      MVC将业务分为三层,减少了数据与业务的耦合性,增强了各层次功能的独立性,使得在需求改变时可能只需要改变其中一层就能完成服务;
    • 复用性高
      三层业务功能分明,耦合度低,使各模块可以独立完成自身功能,降低了依赖性,具有很高的复用性。
    • 利于批量生产和拓展
      复用性高使得在批量生产的时候可以根据需求进行模块的重用,加快了生产效率。并且模块化使得扩展也非常方便,模块只需根据规范进行编写,经审核后引入便可以实现扩展。
    • 利于协作开发
      扩展性强使协作开发也变得非常方便,每个人根据自己的分工设计自己的模块,不与他人冲突,引入时也各行其职。

    相关文章

      网友评论

        本文标题:关于模块化的思考

        本文链接:https://www.haomeiwen.com/subject/dbotyftx.html