巨型单页面应用的进阶挑战

2015/09/30 · HTML5,
JavaScript ·
单页应用

最初的作品出处: 林子杰(@Zack__lin)   

翻阅须知:那里的巨型单页面应用(SPA Web
App)是指页面和效率组件在多个某部量级以上,举个栗子,比如
30+个页面拾0+个零部件,同时伴随着大批量的数量交互操作和几个页面包车型客车数目同步操作。并且那里提到的页面,均属于
hash 页面,而多页面概念的页面,是五个独立的 html
文档。基于那么些前提,大家再来钻探,不然本人怕大家 Get 不到同1个 G 点上去。

后天给我们写多少个页面布局的秘诀,辅助我们更分明的认识页面布局,方式仅供参考。

正是指多个连串只加载2遍财富,之后的操作交互、数据交互是通过路由、ajax来举行,页面并不曾刷新。

CentOS 7.1 安装

挑衅一:前端组件化

依据大家所说的前提,第三个面对的搦战是组件化。那里依然要强调的是组件化根本指标不是为了复用,很多个人历来没想通晓那点,总是认为造的车轱辘其他事情能够用,说不定现在也能够用。

骨子里前端发展迭代这么快,交互变化也快,种种适配更新无独有偶。明日造的轮子,过阵子旁人造了个高级轮子,大家都会选越来越尖端的车轱辘,所未来后前端界有1个景观正是为着让旁人用本身的轮子,自个儿拼命不停地造。

在前者工业化生产趋势下,假如要抓好生产功用,就非得让组件规范化标准化,达到什么样的档次呢?壹辆车除了底盘和车身框架供给协调统一筹划创立之外,别的规格零件都得以购置组装(专业学得差,有甚谬误请指正)。也正是说,除了
UI
和前端架构要求协调消除之外,别的的组件都以能够普及拿来主义的,倘诺打算让车子跑得更稳更安全,能够对组件进行打磨优化完善。

说了那样说,倒比不上看看徐飞的稿子《20一5前端组件化框架之路》 里面写的剧情都以透过一定实践得出的想法,所以抢先三分之一内容自个儿是同情而且深有体会的。

首先给大家看一下本人的文书夹及文件

特色是加载次数少,加载现在质量较高, 不便利seo
如若页面帮忙h5能够用h5形式+服务器路由rewrite+h五 history
api去掉路由的锚点,和寻找软件优化lib举办seo优化。

~]# yum install zabbix-2.4.6-1.el7.x86_64.rpm
zabbix-server-2.4.6-1.el7.x86_64.rpm
zabbix-server-mysql-2.4.6-1.el7.x86_64.rpm
zabbix-agent-2.4.6-1.el7.x86_大型单页面应用的进阶挑战,zabbix应用进阶。64.rpm
zabbix-sender-2.4.6-1.el7.x86_64.rpm zabbix-web-2.4.6-1.el7.noarch.rpm
zabbix-get-2.4.6-1.el7.x86_64.rpm
zabbix-web-mysql-2.4.6-1.el7.noarch.rpm
trousers-0.3.11.2-4.el7_1.x86_64.rpm

挑衅二:路由去中央化

基于大家所说的前提,中央化的路由维护起来很坑爹(若是做壹八个页面 DEMO
的就没须求出来现眼了)。MV*
架构就是存在那样个坑爹的题材,必要评释中央化 route(angular 和 react
等都亟待先评释页面路由协会),针对不相同的路由加载哪些组件模块。壹旦页面多起来,甚至若是有人偷懒直接在有些路由写了一部分作业耦合的逻辑,这些route 的可维护性就变得稍微不好了。而且用户访问的首先个页面,都亟需加载
route,尽管别的路由的代码跟当前页面非亲非故。

咱俩再回过头来思虑静态页面不难的加载格局。我们只要把 nginx 搭起来,把
html 页面放在对应的静态能源目录下,运转 nginx 服务后,在浏览器地址栏输入
1二七.0.0.一:8888/index.html
就足以访问到这些页面。再复杂一点,大家把目录整成上面包车型大巴花样:

/post/201509151800.html /post/201509151905.html /post/201509152001.html
/category/js_base_knowledge.html /category/css_junior_use.html
/category/life_is_beautiful.html

1
2
3
4
5
6
/post/201509151800.html
/post/201509151905.html
/post/201509152001.html
/category/js_base_knowledge.html
/category/css_junior_use.html
/category/life_is_beautiful.html

那种目录结构很熟吧,对 SEO
很友善吧,当然这是后话了,跟大家前些天说的不是叁遍事。那种目录结果,不用我们去给
Web Server 定义一批路由规则,页面存在即重回,不然再次回到404,完全不必要多余的扬言逻辑。

基于那种目录结构,大家得以抽象成那规范:

/{page_type}/{page_name}.html

1
/{page_type}/{page_name}.html

实质上还足以更简约:

/p/{name}.html

1
/p/{name}.html

从组件化的角度出发,仍是能够那样子:

/p/{name}/name.js /p/{name}/name.tpl /p/{name}/name.css

1
2
3
/p/{name}/name.js
/p/{name}/name.tpl
/p/{name}/name.css

就此,依据我们简化后的逻辑,我们只须求三个 page.js
那样一个路由加载器,依据大家约定的能源目录结构去加载相应的页面,大家就不须求去干申明路由并且大旨化路由那种蠢事了。具体来看代码。咱也懒得去分析了,里面有注释。

图片 1

注解:CentOS
7.1安装zabbix-二.4.陆-壹.el7,其与trousers-0.三.1一.二-三不兼容,须要升高trousers至0.3.1一.贰-4.el七_1。

挑衅三:领域数据中央化

对于单向数据流循环和数目双向绑定什么人优何人劣是永恒也斟酌没结果的题材,要看是何等工作场景什么业务逻辑,借使这么些前提没统一好说吗都以劳而无功。当然,这几个挑衅的前提是非后台的单页面应用,后台的前端根本就不须要思索前端内部存款和储蓄器缓存多少的处理,直接跟接口数据库交互就行了。明显了这么些前提,大家随后钻探怎样叫世界数据大旨化。

前方议论到二种多少绑定的方法,不过只要频仍跟接口交互:

  • 内部存款和储蓄器数据销毁了,重新请求数据耗费时间浪费流量
  • 只要七个接口字段部分不等同只是使用情况壹样
  • 七个页面一向有①些的多寡一致,可是先来后到导致有个别计数字段不雷同
  • 七个页面包车型客车数码1致,个中1些数据发生用户操作行为招致数据发生变动

为此,大家须要在业务视图逻辑层和数量接口层中间扩展叁个store(领域模型),而那个 store 必要有3个统一的 内存缓存 cache,这个cache 正是中央化的多少缓存。那这些 store 终归是用来弄啥勒?

图片 2

Store 具有多形态,各类 store
好比某1类物品的仓库储存(领域,换个词简单通晓),如蔬菜水果店 fruit-store,
衣裳店
clothes-store,蔬菜水果店能够放苹果天宝蕉黑木耳,衣服店可以放马夹底裤人字拖。要是品种过于繁多,大家得以把蔬菜水果店精细化运行变成美蕉专卖店,苹果专卖店(!==
appstore),甚至是木耳专卖店…( _
_)ノ|,蔬菜水果种类分化等,可是也都以称重按斤卖嘛。

var bannerStore = new fruitStore();

var appleStore = new fruitStore();

有了这个囤积之后,大家得以放心的把多少丢给视图逻辑层大胆去用。想修改数据?直接让
store 去改就行了,其他页面包车型大巴 DOM
文本内容也得修改吧?那是其他页面包车型客车作业逻辑做的事,大家把事件抛出去就好了,他们处不处理那是他俩的事,咱别瞎操心(业务隔断)。

那么 store 具体弄啥勒?

图片 3

  • 3贰个赞地方可点赞大概废除,多少个页面包车型客车赞数须求共同,按钮点赞与撤除的事态也要共同。
  • 条目是还是不是已收藏,打消收藏后 Page B 供给删除数据,Page A+C
    需求1起状态,若是在 Page C 又有收藏操作,Page B
    供给相应增减数据,Page A 状态须要共同。
  • 发评论,Page C 要求更新评论列表和评价数,Page A+B
    须求创新评论数。假诺 Page B 未有被加载过,那时候 Page B
    得到的多少应该是流行的,需求壹块给 A+C 页面对应的数据举行立异。

故此,store
干的活就是数据状态读写和协助实行,即使把数量状态的操作放到种种页面本身去处理,页面壹旦多了依然复杂起来,就会发出种种页面数据和景况也许不1样,页面以前双向引用(业务耦合严重)。store
还有另一个效益就是数量的输入输出格式化,简单举个栗子:图片 4

  • 别的接口 API 再次来到的数额,都急需经过 input format
    实行合并格式化,然后再写入
    cache,因为读取的多寡已依据大家约定的科班开始展览的处理,所以大家使用的时候也不供给理会接口是回到怎样的数据类型。
  • 有些零部件必要的多寡字段格式大概两样,假若把数量处理放在模板进行拍卖,会招致模板不能越发简明通用(业务耦合),所以须要output format 进行拍卖。

之所以,store
正是扮演着那样的剧中人物——是数额状态读写和壹起,以及数据输入输出的格式化处理。

文件

开创数据库:

挑战四:Hybrid App 化

当今 Hybrid App 架构应用非常的红啊 _
(:3」∠)_,不搞一下都倒霉意思说自个儿是做 H5的。这里所说的 Hybrid App
可不是那种内置打包的 html 源码这种,而是直接去服务端请求 html
文书档案那种,可能会使用离线缓存。有的人觉着只要要采纳 Hybrid
架构,就不能够动用 SPA 的办法,其实 Hybrid 架构更应该利用 SPA。

相见的多少个难点,笔者回顾列举一下:

  • 客户端通过 url 传参

    假定通过 http get 请求的 query 参数进行传参,会导致命中不到 html
    文书档案缓存,所以通过 SPA 的 hash query 传参,能够避开这几个题材。

  • 与其余 html 页面举行跳转

    那种气象下,进入新页面和重回旧页面导致 webview 会重新加载本地的
    html 文书档案缓存,视觉体验很不爽,固然页面使用了离线缓存,而 SPA
    能够规避那一个题材。

  • 使用了离线缓存的页面须要帮忙代码多版本化

    鉴于应用了非覆盖质量源发表办法,所以要求依然保留旧的代码1段时间,防止止用户接纳旧的
    html
    文书档案访问1些按需加载功用或免除了地点缓存数据而拿不到旧版本代码。

  • js 和 css 资源 离线化

    出于离线缓存的财富必要先在 manifest
    文件宣称,你也不恐怕接二连三手动去爱护供给引用的 js 和 css
    财富,并且那三个按需加载的功能也会为此失去按需加载的含义。所以需求将
    js 和 css 缓存到
    localstorage,直接省去这一步维护操作。至于用户清除
    localstorage,参考第一点解决方案。

  • 图标能源离线化

    将图标文件实行 base6四 编码后存入 css 文件,方便离线使用。

此间有一个base.css文件,那一个css文件根本用来存放一些足以重复使用的体制。

server和proxy的运营都凭借于数据库,agent则不必要。

挑衅5:品质优化

@前端农民工 在 别处 已经说得很明亮了,直接传送门过去看吗,那里不罗嗦了。

 

1 赞 2 收藏
评论

图片 5

图片 6

以MySQL数据库为例:
shell> mysql -uroot -p<password>
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@localhost
identified by ‘<password>’;
mysql> quit;
shell> mysql -uzabbix -p<password> zabbix <
database/mysql/schema.sql
# stop here if you are creating database for Zabbix proxy
shell> mysql -uzabbix -p<password> zabbix <
database/mysql/images.sql
shell> mysql -uzabbix -p<password> zabbix <
database/mysql/data.sql

base.css内容

配置zabbix:

从图片中我们得以见见不少的样式都以通过class定义的,在必要用到那个样式的时候能够一贯在html文件的class中添加class名。拿取很便宜,那些文件也得以在后来不断的丰盛内容作为二个通用的库来使用。

(1) zabbix_server
server的布署文件为zabbix_server.conf,至少应当为其配置数据库等有关的新闻;例如:
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
DBHost=172.16.100.67
DBName=zabbix
DBUser=zbxuser
DBPassword=zbxpass
DBSocket=/var/lib/mysql/mysql.sock
SNMPTrapperFile=/var/log/snmptt/snmptt.log
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts

接着正是页面布局,上面是html文件的内容。

 

图片 7

(2) 配置php环境
编辑/etc/httpd/conf.d/zabbix.conf,添加如下项。
php_value date.timezone Asia/Shanghai

html

启动httpd服务:systemctl start httpd.service

从那张图就足以清楚的见到base.css文件的选取。丰盛呈现了体制与结构的分手,且增进了html文件的明白,保留了html文件的干干净净。

访问zabbix web

再看看这些页面包车型大巴css文件内容。

登录:Admin/zabbix

图片 8

(3) 配置zabbix_agent
agent的配备文件为zaabix_agentd.conf,至少应当为其钦命server的IP地址;

css

 

结缘html和css,能够看看任何页面包车型客车构造日益明晰,并且以某种颜色的区域占据网页,直观的突显了网页的起初概况。

 

这样做的便宜综上说述,它整个结构格外明晰,且环环相扣,每一个模块都以独立的,且紧凑的拼构成二个完全的页面,制止了模块之间的互相影响。对页面包车型客车修改也很便宜,利于早先时期的维护。对程序员编写代码也有二个清楚的笔触。

 

末段就是以此页面布局的成效图。

图片 9

各key的拿走位置

效果图

 

源码安装:

下载地址:

# tar -zxvf zabbix-2.0.0.tar.gz

始建用户:
# groupadd zabbix
# useradd -g zabbix zabbix

留意:同时设置了server和agent的节点上,提议其运维用户毫无相同。

 

创立数据库:

server和proxy的周转都凭借于数据库,agent则不须要。

以MySQL数据库为例:
mysql> CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_bin;
mysql> GRANT ALL ON zabbix.* TO zbuser@’%’ IDENTIFIED BY ‘zbpass’;
# 请按供给修改用户名和密码;
shell> mysql -u<username> -p<password> zabbix <
database/mysql/schema.sql
#
假如仅为proxy创建数据库,只导入schema.sql即可;不然,请继续下边包车型地铁手续;

shell> mysql -u<username> -p<password> zabbix <
database/mysql/images.sql
shell> mysql -u<username> -p<password> zabbix <
database/mysql/data.sql

网站地图xml地图