Home
#1 名词解释# ###1.1 工程化###
前端的工程化就是在前端的项目开发全流程中将成熟的技巧、解决方案、经验模式用工具和约定焊接起来,并形成统一的操作规范,实现工业化生产。
###1.2 多页模式###
传统的B/S产品适用的前端形态。以同步渲染为主,异步渲染为辅。适合大部分无特殊复杂交互,但页面信息量大的PC端产品。
###1.3 单页模式###
最近几年开始兴起的一种前端形态,以异步渲染为主,同步渲染为辅。适合大多数重数据交互,重用户体验,总体信息量不大的H5应用。形态比较类似C/S形态。
###1.4 同构###
用js编写的应用能同时执行于浏览器端和服务器端,实现server和browser的组件与库共享。
目前追求完全同构的产品比较少,主要还是适当运用部分同构的技巧来增加代码的复用性,和实现服务器组件渲染。
###1.5 组件化###
将一整块业务或者系统,按照其功能的独立性,而拆分成各个独立的功能模块的过程,和传统的jq ui等组件思想不太一样,更加接近具体业务。
jqui等组件是尽量做到通用,在不同的场景中使用,而组件化是指将一个具体的页面,如何按照不同的功能划分为单元小块,包含了js、css和html。可以理解为界面的片段化。
###1.6 React###
起源于Facebook的内部项目,用于解决组件化开发的问题,充当前端的模板引擎。
特点:组件化开发、虚拟dom,JSX。
###1.7 Flux###
FB提出的一种全新的前端架构模式,用于取代现有的MVC等架构,和React非常高效地结合。核心思想:单向数据流。
###1.8 ReFlux###
flux本身是一种模式,而reFlux是这种模式的一种具体实现,同时为了简化开发对于原有模式做了一些调整,仅保留了action、store、component。
###1.9 Generator###
ES6的一种新特性,异步编程的解决方案,可以理解为一个状态机,使用yield语句来定义不同的内部状态,执行Generator后会返回一个遍历器对象,可以通过该对象的next方法遍历其内部的不同的状态。 使用Generator可以避免异步回调嵌套问题,提高错误的处理效率。
###1.10 KOA###
一个用于取代express的中间件框架,更加小巧灵活,不绑定任何中间件,由自己根据实际需要做加法,比较适合征地业务的量身定制。
#2 设计原则#
- 从实际需要出发,不做大而全的框架
- 先进性紧跟BAT,但又能确保简单上手
- 重视扩展性,便于随着业务增长做加法
- 重用户体验,性能
- 工程化贯穿,能用工具实现的就用工具实现
#3 总体设计#
#4 PC架构设计# ##4.1 概况##
##4.2 架构图##
##4.3 目录结构##
-root
{package.json}
{bower.json}
{glup.js}
[bin] 存放可执行文件(二进制可执行文件、shell、bat等)
[conf] 存放应用程序配置文件
[node_modules] 三方模块及自己封装的node模块
[log] 存放日志
[app] server端
[libs] 工具库、业务中间件、mvc框架
[controller] 控制器
[models] 模型
[router] 路由配置
[template] 模板
[test] 单元测试
[static] browser端
[bower] bower管理的外部模块,含js、css等
[js]
[libs] 非bower管理的公共库
[conf] 存放js配置,如映射关系、公共常量、文字宏等
[ui] UI组件
[common] 公共业务逻辑
[page] 页面级js
[css]
[libs] 非bower管理的公共库
[ui] UI组件
[common] 公共业务逻辑
[page] 页面级js
[font] 存放font-icon
[img]
##4.4 server端##
- 以轻巧灵活的koajs为中间件框架,以中间件模式为业务开发的核心模式
- 纵向上划分filter、router、controller、models、views,基于中间件模式封装mvc框架
- 横向上按module进行划分系统级别配备conifg管理、日志处理、异常捕获
node 0.12.3
分两组服务:一组用于业务处理(8080)、一组用于静态文件服务器(8081) 服务通过PM2开启集群模式,集群内进程实例数由CPU数决定,开发模式下不开启集群
启动程序,程序的总入口,负责加载配置文件,公共模块,初始化日志组件、初始化模板引擎、初始化koajs、注册中间件等
由多个注册到koa上的中间组成,用于在req->res模型中处理公共业务,如cookie签名等,公共业务逻辑也可以考虑
使用koa-router中间件模块,用于url路由配置
接受到请求后向后请求models获取数据,并调用对应的模板进行渲染
负责请求后端数据和缓存数据,处理业务逻辑
ejs模板存放
m-v-c间存在目录映射关系,通过文件命名来约束
提供baseController、baseModels,提供render、getModel等基类方法
考虑到异步请求的情况,baseController提供api方法,API的Controller不需要调用view,直接返回json
##4.5 模板层级与复用##
- 职能从大到小分四级划分 site->module->page->block
- site: 整个站点,拥有各个module和站点级别的公共block,如header、footer、nav等
- module: 模块级别,拥有一组类似的页面和这些页面间共用的block
- page: 页面级别,对应一个action,拥有一个页面模板和私有block
- block:最小模板单元,对应页面中一个功能UI区
-[template](站点)
-[blocks](站点级block)
-{header.ejs}
-{footer.ejs}
-{nav.ejs}
...
-[account](模块)
-[blocks](模块级block)
-{account-info.ejs}
-{account-side.ejs}
-[home](页面)
-[blocks]
-{income.ejs}
-{calendar.ejs}
-{page.ejs}(页面框架)
-[invest]
-[bankcard]
...
-[home]
-[financing]
-[service]
-[aboutus]
...
- block应为一个完整的业务功能可视区
- block默认位于页面目录中的block目录中
- 在一个module内,凡是两以上页面共用的block归到module的block目录中
- 一个module中页面不能引用另外一个module中的block
- 跨module的block复用需要归类到站点下的block目录中
##4.6 日志设计##
###4.6.1 统一格式### NOTICE: 2015-09-02 13:45:08 at recordLog (fileXXX:110:11) logid logmsgXXX
###4.6.2 日志文件###
-
日志文件统一打到log目录下
-
node.log 服务级别日志,记录服务的启停,相关错误等
-
tiancai.log 一般请求的日志(notice)
-
tiancai.log.wf 错误类日志(warn、fatal)
-
tiancai.log.dev 调试类日志(debug、trace)
###4.6.3 日志分级### 'debug' : 1, 'trace' : 2, 'notice' : 3, 'warn' : 4, 'fatal' : 5, 'error' : 6
###4.6.4 日志打印方式###
使用node的文件流打印 createWriteStream
###4.6.5 生成logid规则### Date.now()*1000+Math.floor(Math.random()*1000)
###4.6.6 配置项设置### 'bdlog' : { 'path' : './log/tcwise.log', //日志打印目录 'maxLength' : 6000, //单条最大长度 'level' : 3, //输出级别 'printTty' : false, //是否显示反馈 'printFile' : true //是否打印日志文件 }
###4.6.7 其他### 为了便于调试和定位,系统的console.log 被重写debug日志方法,写入到tiancai.log.dev
##4.7 browser端##
###架构描述###
- 配合浏览器端ejs的同步输出,以多页面形态呈现,同步为主、异步为辅样的思想
- 交互开发上主要以jq为core面向dom编程,以事件绑定为驱动,不用做到组件化编程
- 样式和js采用层次层叠的方式,即由site->page这样的层次,其中抽象的UI部分也在site的范畴,在页面中只是实例化为page内的具体业务功能。
###Site Level JS###
- 包含内容:jq、jqui、zeus(page、utils)
- page部分在下节介绍,utils提供公共方法如cookie、localstorage等,可以由大家继续扩充
###Page Level JS###
-
对于page提供一个zeus.page()方法,内置initDatas(datas)、initParts(parts)、bindEvent供统一开发风格。
-
initData用于统一初始化页面内状态数据、其他地方不再用var页面级别变量
-
initParts用于统一缓存化页面中需要交互的jq对象,供后面的逻辑使用,其他地方不再用$直接获取,但可以用find方法寻找下一级dom。
-
bindEvent用于统一事件绑定,绑定到对应的业务函数入口。
-
$.ready之后会自动调用page的init的方法,完成initDatas(datas)、initParts(parts)、bindEvent
-
其他逻辑封装成其他函数挂在zeus.page()的设置对象中,函数不允许堆砌,以独立的逻辑为单位,过长的函数需进一步拆分
-
示例:
zeus.page({ //初始化数据 initDatas: function() { var time = new Date(); this.data = { time: time, timeHasShow: false, timeMultiplier: 3 } }, //初始化部件 initParts: function() { this.parts = { $timeContent: $('.time-content'), $showTimeBtn: $('.time-btn') } }, //绑定事件 bindEvent: function() { var this = me; var parts = me.parts; parts.$showTimeBtn.on('click', function() { me.showTime(); }) }, //业务函数 showTime: function() { var data = this.data; if(!data.timeHasShow){ var timeText = data.time * data.timeMultiplier; this.parts.$timeContent.html(timeText); data.timeHasShow = true; } }, //业务函数 ... //业务函数 ... })
###Site Level CSS###
- 包含bootstrap、jqui css、global、jqui custom
- global是根据整体UI风格对bootstrap的补充和覆盖
- jqui custome 是根据整体UI风格对jq ui样式的覆盖
###Page Level CSS### 主要用于页面级别的样式微调,根据规范(见8章)照写即可。
###打包### site Level的js和css打成一个包,page的不需要打包,跟页面走即可
#5 H5架构设计#
##5.1 概述##
- H5采用单页模式开发(SPA),对于规模较大的app,可以进一步拆分,拆分成多个spa组合。
- 该模式下,browser端采用reflux的架构,server端架构和PC几乎保持一致,唯一区别在于使用上的角色差异。
- PC的server端扮演了较多的业务逻辑和模板渲染的角色,而H5的server端更多的扮演数据接口、首页渲染的角色。
##5.2 架构图##
##5.3 目录结构##
##5.4 server端## 与pc端架构一致,参考4.4章节
##5.5 browser端##
#6 APP架构设计#
##6.1 概况### 由于APP采用的是native用webview嵌入H5的思路,APP的整体架构和H5保持一致,server端和browser端均一致,差异在于具体开发业务时,可能根据实际的需要,Native shell会和H5进行数据交互,这里只约定数据交互的规范,其他在具体的开发过程中,由开发双方根据场景确定。
##6.2 架构### 参考H5部分(5章节)
##6.3 native分工### native负责主要的外部逻辑,转场动画等 H5仅仅作为展示的内部区块,以webview方式提供页面,区块的划分由native来划分,并最终提需求到H5这边提供对应的页面
##6.3 native数据交互约定###
-
native获取H5数据:在页面中定义一段script,用于专门包装给native
<script id="toNative"> window.PageData = { ... } <script>
-
H5获取native数据:native包装成统一的方法供JS调用,获取数据均以getXXX的方式获取
-
两者各自处理各自的逻辑
#工程化设计#
##初始化##
-
命令
zeus pc zeus h5
-
作用:创建一个新的工程的骨架,支持pc和h5两种形态
-
设计思路:基于yo开发两套generator,generator包含设计中两种形态的架构模板
##开发环境##
-
命令
zeus dev
-
作用:启动开发环境,同时开启热重启模式,支持开发时自动刷新浏览器
-
设计思路:使用runjs和live-reload二次开发,同时支持修改client代码和server代码的重启
-
工作流程示意图
##调试##
-
命令
zeus debug
-
作用: 一般开发使用开发模式,结合log可以解决大多数问题,遇到疑难杂症,可以开启debug模式,支持浏览器中的inspector,便于可视化的断点调试等。
-
设计思路:将node-inspector集成到命令的逻辑中
##提测##
-
命令
zeus test
-
作用:检查代码规范 -> 执行单元测试 -> 检索依赖打包 -> ci
-
设计思路:集成fecs进行代码检查、支持mocha进行单元测试、对于less、jsx进行编译、使用gulp、browsify等进行代码打包压缩,输出output。并ci
##上线##
-
命令
zeus deploy
-
作用: 线上更新代码、无缝重新加载
-
设计思路:集成pm2,并封装相关命令
##运维##
- 提供PM2 web视图监视进程、同时产出多份log供追查问题
##规范##
- javascript 规范
- Css 规范
- HTML 规范
##资料##
###harmony### node 0.12.3中harmony的支持情况
harmony 开启方式:node --harmony app.js
###Generator###
###koajs###
###koa-static###
###koa-router###
###co###
###ejs###
###supervisor###
###live-reload###
###node-inspector###
项目地址 https://github.com/node-inspector/node-inspector 学习资料 http://jingyan.baidu.com/album/dca1fa6fbd580ff1a44052de.html
###gulp###
###mocha###
###shouldjs###
###fecs###
###pm2###
###pm2-web###
###less###
###bootstrap###
###browserify###
###reactjs###
学习资料 http://www.ruanyifeng.com/blog/2015/03/react.html?utm_source=tuicool
###reactify###
###reflux###
学习资料 http://segmentfault.com/a/1190000002793786?utm_source=tuicool