Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我
所有文章 外链

Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我

模块化/MVC

阅读数:次 2016-03-13
字数统计: 1.2k字   |   阅读时长≈ 4分

下午看了一些关于模块化和MVC的文章,从各个文章中摘取了一些知识点,记录下来。想到好久没更新博客,权当充数。
接下来三天面试GIS开发和游戏开发,希望这三个公司有一个是我的归宿。

模块化

关键词:
函数集合:污染全局变量
对象:可修改内部变量,不安全
立即执行函数:匿名函数,闭包,私有成员
内存泄露:引用未释放,内存被占用
高内聚低耦合:代码拆分

别人的模块拿来即用。标准化的接口。相互独立,功能完整。

模块化的价值

  1. 代码服用
  2. 提升可维护性
  • 公共模块通常用于促进代码复用
  • 业务模块通常用于提升可维护性

前端模块化的难点

  1. 资源复杂
  2. 标准缺位
  3. 天生异步

CommonJS

1
2
var math = require('math');
math.add(2,3);

AMD

1
2
3
require(['math'], function(){
math.add(2,3)
});

前者属于”同步”,后者属于”异步”。浏览器不需要等待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
2
3
4
5
6
7
8
9
10
11
12
13
14
/** 模擬 Model, View, Controller */
var M = {}, V = {}, C = {};

/** Model 負責存放資料 */
M.data = "hello world";

/** View 負責將資料輸出到螢幕上 */
V.render = function (M) { alert(M.data); }

/** Controller 作為一個 M 和 V 的橋樑 */
C.handleOnload = function () { V.render(M); }

/** 在網頁讀取的時候呼叫 Controller */
window.onload = C.handleOnLoad;

图示MVC

  1. View 传送指令到 Controller
  2. Controller 完成业务逻辑后,要求 Model 改变状态
  3. Model 将新的数据发送到 View,用户得到反馈

参考

  1. Wikipedia
  2. 阮一峰的博客:
      Javascript模块化编程
      MVC、MVP和MVVM
      谈谈MVC模式
  3. 博客园阿里前端
  4. 2015前端组件化框架之路
  • 本文作者: Linking
  • 本文链接: https://linking.fun/2016/03/13/模块化-MVC/
  • 版权声明: 版权所有,转载请注明出处!
  • 模块化
  • MVC
  • cs

扫一扫,分享到微信

HTML5服务器推送事件SSE
Today
  1. 1. 模块化
    1. 1.1. 模块化的价值
    2. 1.2. 前端模块化的难点
    3. 1.3. AMD与CMD区别
  2. 2. MVC
    1. 2.1. 前端MVC
    2. 2.2. JS实现基础MVC模型
    3. 2.3. 图示MVC
  3. 3. 参考
© 2015-2026 Linking
GitHub:hexo-theme-yilia-plus by Litten
本站总访问量次 | 本站访客数人
  • 所有文章
  • 外链

tag:

  • weather
  • 需求
  • essay
  • basketball
  • olympic
  • nginx
  • APPScan
  • SQl盲注
  • xss
  • Ajax
  • ajax
  • ai
  • agent
  • openclaw
  • ccf
  • Nginx
  • HTML5
  • html5
  • hmtl5
  • sse
  • JavaScriptCore
  • Oracle
  • operation
  • Linux
  • deploy
  • Mac Office
  • markdown
  • ListView
  • GridView
  • MySQL
  • 慢查询
  • mongodb
  • 转置
  • thought
  • network
  • ubuntu
  • NetworkManager
  • RFKill
  • Netplan
  • avatar
  • cocoa
  • blog
  • Gitalk
  • container
  • macvlan
  • docker
  • oracle
  • cookie
  • patch
  • gitea
  • git
  • iOS
  • https
  • 多线程
  • bundle
  • 兼容性
  • HTTP
  • 绘图
  • cs
  • java
  • 效率
  • 快捷键
  • route
  • nodejs
  • pip
  • arcgis
  • arcgis 建模
  • 标识
  • redis
  • read
  • bookList
  • running
  • showdoc
  • disk
  • unit-test
  • D.Wade
  • thoughts
  • duoduo
  • Python
  • python
  • tomcat
  • 读书节
  • session
  • jdk
  • war
  • 加班
  • Android onclick事件监听
  • 正则
  • 手机品牌匹配
  • ntp
  • OpenLayers
  • Geoserver
  • wechat
  • 微信公众号
  • 爬虫
  • WeChat
  • 张靓颖
  • 动漫
  • vpn
  • PPT
  • MarkDown
  • plan
  • 朱赟
  • 极客时间专栏
  • 极客邦
  • 模块化
  • MVC
  • excel
  • NBA
  • kobe
  • team
  • crawler
  • 进度条
  • ssl
  • book
  • anti-stealing-link
  • Agentic Engineering
  • Vibe Coding
  • Software 3.0
  • Andrej Karpathy
  • LLM
  • Programming

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • GitHub Trending
  • OpenAI ChatGPT
  • Gitee码云
  • 简书
  • CSDN