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

    前端模块规范有三种:CommonJs,AMD和CMD。
    CommonJs用在服务器端,AMD和CMD用在浏览器环境
    AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
    CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。
    AMD:提前执行(异步加载:依赖先执行)+延迟执行
    CMD:延迟执行(运行到需加载,根据顺序执行)


    一.模块

    以前使用JS的方式要更改,以前只能说是JS的最初级应用,现在对JS应该使用模块化写法.

    好处:

    模块就是实现特定功能的文件,把几个函数放在一个文件里就构成了一个模块。需要的时候加载这个文件,调用其中的函数即可。
    但这样做会污染全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间没什么关系。

    简单的例子:

    var module = (function(){
        var star = 0;
        var f1 = function (){
          alert('ok');
        };
        var f2 = function (){
          //...
        };
           return {
              f1:f1,
              f2:f2
           };
      })();
        module.f1();  //ok
        alert(module.star)  //undefined   因为start并没有return出来

    二.CommonJs

    CommonJS是服务器端模块的规范,由Node推广使用。由于服务端编程的复杂性,如果没有模块很难与操作系统及其他应用程序互动。

    根据CommonJS规范:

    • 一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性。
    • 输出模块变量的最好方法是使用module.exports对象。

    • 加载模块使用require方法,该方法读取一个文件并执行,返回文件内部的module.exports对象

    用一套标准模板来封装模块定义:

    define(function(require, exports, module) {
    
      // The module code goes here
    
    });

    这套模板代码为模块加载器提供了机会,使其能在模块代码执行之前,对模块代码进行静态分析,并动态生成依赖列表。

    math.js
    define(function(require, exports, module) {
      exports.add = function() {
        var sum = 0, i = 0, args = arguments, l = args.length;    //arguments代表入参.与Array类型类似.arguments[0],arguments[1]
        while (i < l) {
          sum += args[i++];
        }
        return sum;
      };
    });
    
    increment.js
    define(function(require, exports, module) {
      var add = require('math').add;
      exports.increment = function(val) {
        return add(val, 1);
      };
    });
    
    index.js
    define(function(require, exports, module) {
      var inc = require('increment').increment;
      inc(1); // 2
    });
    三.AMD

    它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。

    1.RequireJS主要解决两个问题

    • 多个js文件可能有依赖关系,被依赖的文件需要早于依赖它的文件加载到浏览器
    • js加载的时候浏览器会停止页面渲染,加载文件越多,页面失去响应时间越长

    2.RequireJS API 存在于RequireJS载入时创建的命名空间requirejs下。

    其主要API主要是下面三个函数:

    • define– 该函数用户创建模块。每个模块拥有一个唯一的模块ID,它被用于RequireJS的运行时函数,define函数是一个全局函数,不需要使用requirejs命名空间.
    • require– 该函数用于读取依赖。同样它是一个全局函数,不需要使用requirejs命名空间.
    • config– 该函数用于配置RequireJS.

    3.配置函数

    如果你想改变RequireJS的默认配置来使用自己的配置,你可以使用require.configh函数。config函数需要传入一个可选参数对象,这个可选参数对象包括了许多的配置参数选项。下面是一些你可以使用的配置:

    • baseUrl——用于加载模块的根路径。
    • paths——用于映射不存在根路径下面的模块路径。
    • shims——配置在脚本/模块外面并没有使用RequireJS的函数依赖并且初始化函数。假设underscore并没有使用  RequireJS定义,但是你还是想通过RequireJS来使用它,那么你就需要在配置中把它定义为一个shim。
    • deps——加载依赖关系数组
          具体参见下一篇博客,有关Requre.js.
     

    四.CMD

    CMD 即Common Module Definition通用模块定义,CMD规范是国内发展出来的,就像AMD有个requireJS,CMD有个浏览器的实现SeaJSSeaJS要解决的问题和requireJS一样,只不过在模块定义方式和模块加载(可以说运行、解析)时机上有所不同。

    在 CMD 规范中,一个模块就是一个文件。代码的书写格式如下:

    define(function(require, exports, module) {
    
      // 模块代码
    
    });

    require是可以把其他模块导入进来的一个参数;而exports是可以把模块内的一些属性和方法导出的;module 是一个对象,上面存储了与当前模块相关联的一些属性和方法。

    差异:

    AMD是依赖关系前置,在定义模块的时候就要声明其依赖的模块;
    CMD是按需加载依赖就近,只有在用到某个模块的时候再去require:

    // CMD
    define(function(require, exports, module) {
      var a = require('./a')
      a.doSomething()
      // 此处略去 100 行
      var b = require('./b') // 依赖可以就近书写
      b.doSomething()
      // ... 
    })
    
    // AMD 默认推荐的是
    define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
      a.doSomething()
      // 此处略去 100 行
      b.doSomething()
      ...
    })

    主要是Sea.js的使用.




     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探
    跟我学SpringCloud | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪
    跟我学SpringCloud | 第十篇:服务网关Zuul高级篇
    跟我学SpringCloud | 第九篇:服务网关Zuul初
    跟我学SpringCloud | 第八篇:Spring Cloud Bus 消息总线
    跟我学SpringCloud | 第七篇:Spring Cloud Config 配置中心高可用和refresh
    跟我学SpringCloud | 第六篇:Spring Cloud Config Github配置中心
    跟我学SpringCloud | 第五篇:熔断监控Hystrix Dashboard和Turbine
    跟我学SpringCloud | 第四篇:熔断器Hystrix
    跟我学SpringCloud | 第三篇:服务的提供与Feign调用
  • 原文地址:https://www.cnblogs.com/zhangxin4477/p/7419256.html
Copyright © 2011-2022 走看看