前端开发模式以及模块化开发的区别

开发模式: MVC、MVP、MVVM

MVC

Model + View + Control

M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式.

web应用中, 由于http是基于请求和响应方式协同工作的,因此当服务器端的model(数据)发生变化时,它不会立即更新客户端的view,只有客户端重新请求或刷新页面时才更新.

MVP

Model + View + Presenter

在MVP里,Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。

而且,Presenter与具体的 View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变,即重用!

MVVM

Model + View + ViewModel

代表:ReactJs、Vue.js

所有View中的修改变化,都会自动更新到ViewModel中,同时ViewModel的任何变化也会自动同步到View上显示。

模块化开发:

AMD、CMD、CommonJs、ES6

AMD 杰出代表 RequireJS

提前执行

依赖前置,预加载,实现异步加载,加载不影响

CMD 杰出代表 SeaJS

延迟执行

使用时加载,依赖就近

CommonJS  杰出代表 Node.js

语法: module.exports、reuqire

同步加载

运行时加载,即在输入时是先加载整个模块,生成一个对象,然后再从这个对象上面读取方法,这种加载称为“运行时加载”,又叫“动态加载”。

输出的是一个值的拷贝,一旦输出一个值,模块内部的变化就影响不到这个值

加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成。

ES6

语法: import、export

编译时输出接口,即在import时可以指定加载某个输出值,而不是加载整个模块,这种加载称为“编译时加载”,又叫“静态加载”。

输出的是值的引用。原始值变了,import加载的值也会跟着变。

ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。即运行之前已经编译完成。