24、设计模式、webpack
利用静态属性:长驻内存
(一) 单例模式
概念:单个实例,只有一个对象,多次创建,返回同一个对象。
单例模式的核心:确保只有一个实例,并提供全局访问。
//利用了静态属性:长驻内存
function Dog(){
if(!Dog.instance){
Dog.instance = {
name : '小黑',
age : 3
}
}
return Dog.instance;
}
var dog1 = new Dog();
var dog2 = new Dog();
alert(dog1 == dog2);//true
浮窗(面向对象)
<input type="button" name="btn" id="btn" value="飞秋" />
<script type="text/javascript">
var oBtn = document.getElementById("btn");
oBtn.onclick = function(){
new Float().init();
}
function Float(){
if(!Float.instance){
Float.instance = {
ele : document.createElement('div'),
init : function(){
document.body.appendChild(this.ele);
this.ele.style.cssText = "width : 100px;height : 100px; background : pink;position : absolute;left : 300px";
}
}
}
return Float.instance;
}
</script>
浮窗(面向过程)
<input type="button" name="btn" id="btn" value="飞秋" />
<script type="text/javascript">
var oBtn = document.getElementById("btn");
oBtn.onclick = (function(){
var div = null;
return function(){
if(!div){
div = document.createElement('div');
div.style.cssText = "width: 100px; height: 100px; background: red; position: absolute; left: 400px;";
document.body.appendChild(div);
}
return div;
}
})();
</script>
(二) 组合模式
组合多个对象形成树形结构以表示具有“整体-部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体-部分”模式,它是一种对象结构型模式。
<script type="text/javascript">
//文件夹
function Fold(name){
this.name = name;
this.folds = [];
}
Fold.prototype.add = function(file){
this.folds.push(file);
}
Fold.prototype.scan = function(){
console.log("扫描文件夹:" + this.name);
for(var i = 0,file,folds = this.folds;file = folds[i ++];){
file.scan();
}
}
//文件
function File(name){
this.name = name;
}
File.prototype.add = function(file){
console.log("文件中不能添加其它任何文件");
}
File.prototype.scan = function(){
console.log('扫描文件:' + this.name);
}
//创建三个文件夹
var fold1 = new Fold("JS");
var fold2 = new Fold("jQ");
var fold = new Fold("学习资料");
//创建三个文件
var file1 = new File('JavaScript从入门到精通');
var file2 = new File('锋利的jQuery');
var file3 = new File('计算机算法与应用');
fold1.add(file1); //将js书放到JS目录中
fold2.add(file2); //将jQ书放到jQ目录中
fold.add(fold1);
fold.add(fold2);
fold.add(file3);
fold.scan();
</script>
(三) 观察者模式
观察者模式又叫发布-订阅模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。
1. 小明最近看上了一套房子,到了售楼处之后才被告知,该楼盘的房子早已售罄
。好在售楼MM告诉小明,不久后还有一些尾盘推出,开发商正在办理相关手续,
手续办好后便可以购买。但到底是什么时候,目前还没有人能够知道。
于是小明记下了售楼处的电话,以后每天都会打电话过去询问是不是已经到了购
买时间。除了小明,还有小红、小强、小龙也会每天向售楼处咨询这个问题。一个
星期后,售楼MM决定辞职,因为厌倦了每天回答1000个相同内容的电话。当然现实
中没有这么笨的销售公司,实际上故事是这样的:小明离开之前,把电话号码留在
了售楼处。售楼MM答应他,新楼盘一推出就马上发信息通知小明。小红、小强和小
龙也是一样,他们的电话号码都被记在售楼处的花名册上,新楼盘推出的时候,
售楼MM会翻开花名册,遍历上面的电话号码,依次发送一条短信来通知他们。
——这种发送短信通知就是一个典型的发布-订阅模式(观察者模式)。
小明、小红等购买者都是订阅者,他们订阅了房子开售的消息。售楼处作为发布
者,会在合适的时候遍历花名册上的电话号码,依次给购房者发布消息。
//发布者(对象)
//电话簿(对象.属性)
//接待人员--》负责将来访用户的信息记录在电话簿中 (对象.方法())
//发布信息————》遍历电话簿,依次调用来访用户 (对象.方法())
<script type="text/javascript">
//
// var SalesOffice = {};
// SalesOffice.arr = [];
// SalesOffice.reception = function(fn){
// this.arr.push(fn);
// }
// SalesOffice.publish = function(){
// for(var i = 0,fn,list = this.arr;fn = list[i ++];){
// fn.apply(this,arguments);
// }
// }
// SalesOffice.reception(function(square,money){
// console.log("平米数:" + square + '\n多少钱:' + money);
// })
// SalesOffice.reception(function(square,money){
// console.log("平米数:" + square + '\n多少钱:' + money);
// })
// SalesOffice.reception(function(square,money){
// console.log("平米数:" + square + '\n多少钱:' + money);
// })
// SalesOffice.reception(function(square,money){
// console.log("平米数:" + square + '\n多少钱:' + money);
// })
//
// SalesOffice.publish('80平',5000000);
function SalesOffice(){
this.arr = [];
}
SalesOffice.prototype.reception = function(fn){
this.arr.push(fn);
}
SalesOffice.prototype.publish = function(){
for(var i = 0,fn,list = this.arr;fn = list[i ++];){
fn.apply(this,arguments);
}
}
var so = new SalesOffice();
so.reception(function(square,money){
console.log("平米数:" + square + '\n多少钱:' + money);
})
so.reception(function(square,money){
console.log("平米数:" + square + '\n多少钱:' + money);
})
so.reception(function(square,money){
console.log("平米数:" + square + '\n多少钱:' + money);
})
so.reception(function(square,money){
console.log("平米数:" + square + '\n多少钱:' + money);
})
so.publish('80平',5000000);
</script>
(四) MV*模式
(一) MVC模式的意思是,软件可以分成三个部分:
- 视图(view):用户界面
- 控制器(controller):业务逻辑
- 模型(Model):数据保存
- 各部分之间的通信方式如下:
1) View传送指令到Controller
2) Controller完成业务逻辑后,要求Model改变状态
3) Model将新的数据发送到View,用户得到反馈
4) 所有通信都是单向的。
- Model
1) Model管理应用程序的数据。
2) Model不涉及用户界面,也不涉及表示层,而是代表应用程序可能需要的独特形式的数据。
3) 当Model改变时,它通常会通知它的观察者(如View)。
4) 一个Model模型可能有多个观察它的View。
5) 总而言之,Model主要与业务数据有关。
- View
1) View是Model的可视化表示
2) 一个View通常检测一个Model,并在Model更改时进行通知,使View本身能够相应地更新。
3) 用户可以和View进行交互,包括读取和编辑Model。
4) 由于View是表示层,通常我们能够以一种更友好的方式进行编辑和更新。
5) 而更新Model的实际任务其实是在Controller上的。
6) View是应用程序数据的可视化表
示
7. Controller
1) Controller是Model和View之间的中介,当用户操作View时,它通常负责更新Model。
- MVC的优点
1) MVC这种关注点分离有利于进一步简化应用程序功能的模块化,并能够实现:
整体维护更容易。
2) 解耦Model和View,意味着它能够更直接地编写业务逻辑的单元测试
3) 这种模块性可以让负责核心逻辑的开发人员和负责用户界面的开发人员同时工作。
(二) MVP
- MVP是MVC的一种衍生模式,专注于改进表示逻辑。
- Presenter
MVP中的P代表表示器。这是一个包含用于View的用户界面业务逻辑的组件。
a) 各部分之间的通信,都是双向的。
b) View与Model不发生联系,都通过Presenter传递。
c) View非常薄,不部署任何业务逻辑,称为“被动视图”(Passive View),即没有任何主动性,而Presenter非常厚,所有逻辑都部署在那里。
(三) MVP与MVC
- MVP适用于有非常复杂的View和大量用户交互的应用程序。
- 这样的程序如果用MVC的话意味着要极度依赖于多个控制器。而在MVP中,所有这些复杂的逻辑可以封装在一个表示器中,大大简化维护工作。
(四) MVVM
- MVVM模式将Presenter改名为ViewModel,基本上与MVP模式完全一致。
- 唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在ViewModel,反之亦然。
- MVVM由Model,View,ViewModel三部分构成:
1) Model层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑
2) View代表UI组件,它负责将数据模型转化成UI展现出来
3) ViewModel是一个同步View和Model的对象。
- 在MVVM架构下,View和Model之间并没有直接的联系,而是通过ViewModel进行交互,Model和ViewModel之间的交互是双向的,因此View数据的变化会同步到Model中,而Model数据的变化也会立即反应到View上。
- ViewModel通过双向数据绑定把View层和Model层连接了起来,而View和Model之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM,不需要关注数据状态的同步问题,复杂的数据状态维护完全由MVVM来统一管理。
- View与ViewModel
1) MVVM中的View是主动而不是被动的。
2) 被动View只输出显示并不接受任何用户输入
3) 而MVVM中的View和ViewModel之间通过数据绑定和事件进行通信。
4) 优点:
a) MVVM使得UI和为UI提供驱动的行为模块的并行开发变得更容易。
b) MVVM使View抽象化,从而减少代码背后所需的业务逻辑量。
c) ViewModel在单元测试中的使用更容易
5) 缺点:
a) 对于简单的UI来说,使用MVVM有些大材小用
b) 数据绑定难以调试
6) VUE是典型的MVVM框架,它实现双向数据绑定的技术是数据劫持。也就是通过ES5提供的Object.defineProperty()方法来劫持(监控)各属性的getter、setter,并在数据(对象)发生变动时通知订阅者,触发相应的监听回调。
(五) Webpack的安装及使用
Webpack的优势是什么?
- 丰富的插件,方便进行开发工作
- 大量的加载器,包括加载各种静态资源
- 代码分割,提供按需加载的能力
一.全局安装
webpack(电脑中只安装一次): npm install -g webpack@3
二.创建项目,
在项目的根目录中(shift + 右键--选择在此处打开命令窗口),局部安装webpack:
npm install --save-dev webpack@3
三.项目根目录中:
初始化package.json : npm init -y
四.项目根目录中创建webpack.config.js配置文件
var path = require('path');
module.exports = {
entry : '入口文件的URL',
output : {
path : path.resolve(__dirname,'出口路径'),
filename : '打包后的文件名'
}
}
五.运动webpack : webpack
六.自动监听: webpack --watch
七.安装插件
1.html-webpack-plugin : npm install --save-dev html-webpack-plugin
//自动快速的帮我们生成HTML。
var path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry : '入口文件的URL',
output : {
path : path.resolve(__dirname,'出口路径'),
filename : '打包后的文件名'
}
plugins : [
new HtmlWebpackPlugin({
template : "模板文件的URL"
})
]
}
2. style-loader css-loader : npm install --save-dev style-loader css-loader
//样式文件,我们需要两种loader,css-loader 和 style-loader,css-loader会遍历css文件,找到所有的url(...)并且处理。style-loader会把所有的样式插入到你页面的一个style tag中。
在入口文件中 require('!style-loader!css-loader!css文件的URL');
Webpack打包封装
(一) 实现打包多个相互依赖的js文件过程
通过require()方法,在入口文件中引入
(二) 样式的打包:通过安装loader加载器,可以将静态的样式文件一同打包到bundle.js文件中,通过下面命令安装加载器
在entry.js中导入样式:
Require(‘!style-loader!css-loader!../css/style.css’); //静态资源导入需要加!,必须先导入style-loader
24、设计模式、webpack的更多相关文章
- (15/24) 为webpack增加babel支持
Babel是什么? Babel是一个编译JavaScript的平台,它的强大之处表现在可以通过编译达到以下目的: 使用下一代的javaScript代码(ES6,ES7-.),即使这些标准目前并未被当前 ...
- (1/24) 认识webpack
1.什么是webpack (1)webpack是一个模块打包工具,它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript ...
- 24 结合webpack使用vue-router
启用路由 参考官网:https://router.vuejs.org/zh/installation.html webpack就是一个模块化的工具 安装 cnpm i vue-router -S
- (24/24) webpack小案例--自己动手用webpack构建一个React的开发环境
通过前面的学习,对webpack有了更深的认识,故此节我们就利用前面相关知识自己动手用webpack构建一个React的开发环境,就算是一个小案例吧. 注:此处使用的开发工具是Webstorm. 1. ...
- 前端模块化工具-webpack
详解前端模块化工具-webpack webpack是一个module bundler,抛开博大精深的汉字问题,我们暂且管他叫'模块管理工具'.随着js能做的事情越来越多,浏览器.服务器,js似乎无处不 ...
- webpack入门(2)
webpack入门(2) ps:每个案例都是基于前一个案例改造的 webpack入门(1) 戳这里 案例源码戳这里 十二.ProvidePlugin 自动加载模块 new webpack.Provid ...
- webpack+vue+vueRouter模块化构建完整项目实例详细步骤-入门篇
新建项目 开始(确认已经安装node环境和npm包管理工具) 1.新建项目文件名为start_vuedemo 2.npm init -y 初始化项目,我的win7系统,工程在d盘的vue_test_p ...
- webpack系统配置
简言之,webpack 是一个模块打包器 (module bundler),能够将任何资源如 JavaScript 文件.CSS 文件.图片等打包成一个或少数文件. 为什么要用Webpack? 首先, ...
- 从零开始搭建webpack+react开发环境
环境主要依赖版本 webpack@4.8.1 webpack-cli@2.1.3 webpack-dev-server@3.1.4 react@16.3.2 babel-core@6.26.3 bab ...
- 最小白的webpack+react环境搭建
本文也同步发表在我的公众号“我的天空” 从零开始,用最少的配置.最少的代码.最少的依赖来搭建一个最简单的webpack+react环境. 最近在玩webpack+react+移动端,那么第一步自然是搭 ...
随机推荐
- Docker构建YApi镜像, Docker安装YApi, Docker部署YApi
概述 YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布.维护 API,YApi 还为用户提供了优秀的交互体验,开发 ...
- mysql YEARWEEK(date[,mode]) 函数 查询上周数据 以及本周数据
通常使用下边sql即可(如果数据库设置了周一为一周起始的话): 查询上周数据(addtime为datetime格式) SELECT id,addtime FROM mall_order WHERE ...
- Java中Lambda表达式的使用(转)
https://www.cnblogs.com/franson-2016/p/5593080.html 简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖" ...
- Tomcat线程池的深入理解
1.工作机制: Tomcat启动时如果没有请求过来,那么线程数(都是指线程池的)为0: 一旦有请求,Tomcat会初始化minSpareThreads设置的线程数: 2.线程池作用: Tomcat的线 ...
- Android内存泄漏杂谈
内存泄漏:是指内存得不到GC的及时回收,从而造成内存占用过多.从而导致程序Crash,也就是常说的OOM. 一.static 先来看以下一段代码 public class DBHelper { pri ...
- 用virsh console vhosts 卡住
[root@666 ok]# virsh list --all Id Name State ---------------------------------------------------- 1 ...
- NameError:name ‘xrange’ is not defined
运行某代码时,报错: NameError:name 'xrange' is not defined 原因: 在Python 3中,range()与xrange()合并为range( ).我的pytho ...
- 通过jQuery实时监听表格行数变化
[本文出自天外归云的博客园] 使用bootstrap table组件,当使用过滤器的时候,页面的表格行数发生变化,此时需要统计表格行数.想要监听表格变化,如何做呢? 使用场景:有一个表格里放着许多测试 ...
- 【交换机】交换机RLDP(环路检测&链路检测)功能介绍及配置说明
功能简介RLDP 全称是Rapid Link Detection Protocol,是锐捷网络自主开发的一个用于快速检测以太网链路故障的链路协议.一般的以太网链路检测机制都只是利用物理连接的状态,通过 ...
- centos查看端口被哪个应用端口占用命令
在linux一般使用netstat 来查看系统端口使用情况步. netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实际的网络连接以及每一个网络接口设备的 net ...