MVC,MVVM,CommonJS,AMD,CMD

MVC和MVVM

  • MVC 模式结构 (Model-View-Control 模型-视图-控制器)
    1. 在MVC模式中,用户向服务器提交的所有请求都由控制器接管,接受到请求之后,控制器负责决定应该调用哪个模型来进行处理;
    2. 然后模型根据用户请求进行相应的业务逻辑处理,并返回数据;
    3. 最后控制器调用相应的视图来格式化模型返回的数据,并通过视图呈献给用户;


      image.png
  • MVVM 模式结构 (Model View ViewModel)
    1. 在MVVM模式结构中,view绑定到ViewModel,然后通过执行一些命令在向ViewModel请求一个动作;
    2. ViewModel与Model通讯,告诉他更新来相应UI。


      image.png

JS中的模块规范

前端模块规范一共有三种:CommonJS,AMD,CMD

CommonJS用在服务器端,而AMD和CMD用在浏览器环境。

AMD是RequireJS在推广过程中对模块定义的规范化产出。

提前执行(异步加载:依赖先执行)+延迟执行

CMD是SeaJS在推广过程中对模块定义的规范化产出。

延迟执行(运行到需加载,根据顺序执行)

CommonJS

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

根据CommonJS规范

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

AMD

CommonJS并不适合前端,这里简要分析了浏览器端的JS和服务器端的JS都做了什么事

服务器端JS 浏览器端JS
相同的代码需要执行多次 代码需要从一个服务器端分发到多个客户端执行
CPU和内存是瓶颈 带宽是瓶颈
加载时从磁盘中加载 加载时需要通过网络加载

于是AMD(异步模块定义)出现了,他主要为前端JS的表现指定规范。

AMD是requireJS在推广过程中对模块定义的规范化的产出:它采用异步方式加载模块,模块的加载不影响它后面语句运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。

RequireJS主要解决两个问题

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

CMD

CMD 即Common Module Definition通用模块定义,CMD规范是国内发展出来的,就像AMD有个requireJS,CMD有个浏览器的实现SeaJS,SeaJS要解决的问题和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()
  ...
})

你可能感兴趣的:(MVC,MVVM,CommonJS,AMD,CMD)