下午看了一些关于模块化和MVC的文章,从各个文章中摘取了一些知识点,记录下来。想到好久没更新博客,权当充数。
接下来三天面试GIS开发和游戏开发,希望这三个公司有一个是我的归宿。
模块化
关键词:
函数集合:污染全局变量
对象:可修改内部变量,不安全
立即执行函数:匿名函数,闭包,私有成员
内存泄露:引用未释放,内存被占用
高内聚低耦合:代码拆分
别人的模块拿来即用。标准化的接口。相互独立,功能完整。
模块化的价值
- 代码服用
- 提升可维护性
- 公共模块通常用于促进代码复用
- 业务模块通常用于提升可维护性
前端模块化的难点
- 资源复杂
- 标准缺位
- 天生异步
CommonJS
1 | var math = require('math'); |
AMD
1 | require(['math'], function(){ |
前者属于”同步”,后者属于”异步”。浏览器不需要等待js从服务器下载完,浏览器可能假死。
遗憾的是JavaScript在设计时定位原因,没有提供类似的功能,开发者需要模拟出类似的功能,来隔离、组织复杂的JavaScript代码,我们称为模块化。
一个模块就是实现特定功能的文件,有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。模块开发需要遵循一定的规范,各行其是就都乱套了。
AMD与CMD区别
最明显的区别就是在模块定义时对依赖的处理不同
AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块
CMD推崇就近依赖,只有在用到某个模块的时候再去require
这种区别各有优劣,只是语法上的差距,而且requireJS和SeaJS都支持对方的写法
AMD和CMD最大的区别是对依赖模块的执行时机处理不同,注意不是加载的时机或者方式不同
很多人说requireJS是异步加载模块,SeaJS是同步加载模块,这么理解实际上是不准确的,其实加载模块都是异步的,只不过AMD依赖前置,js可以方便知道依赖模块是谁,立即加载,而CMD就近依赖,需要使用把模块变为字符串解析一遍才知道依赖了那些模块,这也是很多人诟病CMD的一点,牺牲性能来带来开发的便利性,实际上解析模块用的时间短到可以忽略
为什么我们说两个的区别是依赖模块执行时机不同,为什么很多人认为ADM是异步的,CMD是同步的(除了名字的原因。。。)
同样都是异步加载模块,AMD在加载模块完成后就会执行改模块,所有模块都加载执行完后会进入require的回调函数,执行主逻辑,这样的效果就是依赖模块的执行顺序和书写顺序不一定一致,看网络速度,哪个先下载下来,哪个先执行,但是主逻辑一定在所有依赖加载完成后才执行
CMD加载完某个依赖模块后并不执行,只是下载而已,在所有依赖模块加载完成后进入主逻辑,遇到require语句的时候才执行对应的模块,这样模块的执行顺序和书写顺序是完全一致的
这也是很多人说AMD用户体验好,因为没有延迟,依赖模块提前执行了,CMD性能好,因为只有用户需要的时候才执行的原因
MVC
MVC 不是一种技术,仅是一种理念。
前端MVC
简写 | 全称 | 含义 | 前端表现 |
---|---|---|---|
M | module | 数据请求和数据操作。 | ajax从服务器拉取数据 |
V | view | 视图操作和改变 | HTML/CSS |
C | controller | 事件绑定,转发view用户请求到module,业务逻辑 | js |
JS实现基础MVC模型
1 | /** 模擬 Model, View, Controller */ |
图示MVC
- View 传送指令到 Controller
- Controller 完成业务逻辑后,要求 Model 改变状态
- Model 将新的数据发送到 View,用户得到反馈