Authored by 周奇琪

Add new file

## YOHO!前端现状和待做事项
### 使用技术
#### 浏览器端
主要是指在浏览器里使用的技术。
##### vue(框架,视图层)
目前vue主要运用于,新版商户端和BLK,以及部分WAP的页面(地址管理,退换货),
目前这些项目全部使用了vue 2.x版本,商户端实现了SSR的实践。后续正在对BLK的SSR做对于的改造。vue提高的复杂页面(页面逻辑)的开发效率(完整的工具链),同时提高代码的可维护性,因为新版vue采用了Virtual Dom的技术,相对性能方面有较大提升[基准测试](https://github.com/krausest/js-framework-benchmark)
但是,vue也有一些弊端,性能无法做到极致,服务端直出(SSR和模板渲染有一定差距),页面的(相对于原生JS处理),同时不支持IE8以及以下的浏览器,所以我们再运用中,PC端没有采用vue,同时,在WAP端的商品展示相关页面采用传统的方式来做(服务端直出HTML)。
##### jquery
目前主要运用于PC端和WAP端大部分页面,提升前端开发效率和浏览器的兼容性。
##### 前端模块化
目前主流的前端js开发方式,采用common.js的方式进行,代码的依赖,引用的组织,通过webpack加上各种加载器,进行前端代码的构建。服务端原生支持这种方式:
``` javascript
//moduleA
const funcA = ()=>{
return 'A';
}
module.exports = {
funcA
};
```
``` javascript
//use a module
const moduleA = require('./a');
moduleA.funcA();
```
##### 响应式布局
支持多个分辨率的适配,通过viewport,已经css的网格系统。目前主要运用要后台项目
##### bootstrap
现在平台端项目就是使用了bootstrap,用于快速构建页面,但不需要设计支持,完整的UI套件。缺点是组件不丰富,需要重复使用html。单独使用bootstrap,前端代码的维护性不高。
##### MIP(百度的移动端加速器)
现在主要改造了逛的详情页面,目前收录情况和百度官方的说明有差异。页面收入情况不佳,目前已暂停新的页面的开发工作。
### css, html,JavaScript
这个不多做说明,浏览器的主要使用的技术。
#### 服务端
##### express(web框架)
现在大部分线上的业务都是使用了这个web框架,有货(PC,WAP),BLK(PC,WAP),平台端,商户端,等。express本身很轻量,通过使用中间件来对框架扩展,如session,消息体解析,防xss等。目前使用的版本是4.x。
##### node
前端WEB服务都是使用node,相对于前端比较友好,使用了Javascript作为开发语言,同时是异步非阻塞的,相对于其他服务端脚本,性能还算可以。缺点是性能相对于Java,不算高,同时是单进程的服务,存在一个多线程行的灵活性,性能也无法发挥极致。
##### zookeeper
用于前端的一些开关配置,便于实时的修改配置无需重启服务。降级开个,以及一些功能开关。
![](1.png)
![](2.png)
##### memcache
用于session和接口缓存,其他缓存,后续打算替换成redis,减少使用的服务种类。
##### redis
目前主要用于SEO的一些TDK的配置,用于快速读取,为什么没有使用memcache,是因为开发的数据结构不支持。
##### mysql
目前用于SEO的mysql,存储托词的数据,方便前端快速开发和推进SEO的页面增量,目前已经增加的10w+的页面,同时第三方搜索的索引量也逐步增加。
活动项目也使用了mysql的服务,存储活动数据。
##### pm2(node 进程管理器)
pm2是的node服务的进程管理工具,主要用于进程守护,进程状态监控和治理(启动,关闭,重启等操作),该工具是否可靠。
##### nginx
nginx是使用了openresty的版本。使用了proxy-cache,配合max-age做对应页面的pagecache,以及多台node服务器的负载均衡。
#### 工程化
##### 项目构建
项目构建主要使用以下工具链,主要实现js代码依赖,es语法转化,css编译,代码压缩,分页面打包,代码静态检查,代码调试。
* webpack(构建工具)
* babel(语法支持编译器)
* eslint(es静态检查)
* stylelint(样式静态检查)
* npm(依赖包管理)
* postcss(css后处理器)
* gulp(pc项目还在使用,需要后续去掉,其实gulp和webpack部分功能是重合的)
##### 项目集成
##### node-ci
仓库地址:http://git.yoho.cn/OPENTECH/yoho-node-ci,
这个项目涉及的功能比较多,集成部分,目前在用的是项目的构建,已发到灰度环境,发布正式的现在已经迁移到运维系统。
![](4.png)
项目的代码静态检查,每天凌晨会完成一次集成和代码检查。
![](3.png)
##### static-ci
仓库地址:http://git.yoho.cn/fe/static-ci/tree/master,静态文件构建部署到云存储(七牛)
![](5.png)
##### 项目部署
在编写node-ci的时候主要使用了如下两个工具模块,pm2是一个进程管理工具,可以启动,重启,停止node进程,并且可以设置日志输出。shelljs可以在node中优雅的执行bash命令。
* pm2
* shelljs
##### 项目治理
* pm2-server-monit(pm2的一个插件,监控服务的资源使用情况)
* pm2-http-interface(pm2的一个插件,监控数据的api接口)
* 日志汇聚(目前是把日志写到/Data目录,运维使用工具汇聚到一个日志服务上)
* pm2-cli(pm2的命令行,方便其他的系统集成和控制node的服务进程)
##### 项目监控
* oneapm (web事务 APM,后面会停用这个服务,自己做指标记录web事务的各个指标,以及服务端异常记录 )
##### 异常监控
目前使用一下的工具进行服务监控,目前还缺少端到端的监控。
* Grafana(指标数据的可视化,目前主要是cpu和内存,异常次数)
* influxdb(作为上报的数据服务,记录指标)
* 错误日志监控告警(记录错误的次数,超过阈值会报警)
* 服务CPU/内存监控告警(超过阈值会报警)
* 浏览器端js脚本错误监控和处理(badjs,一个腾讯的开源浏览器端错误监控分析平台)
##### 版本管理
版本管理是使用git进行管理的,使用了修改过的git-flow,去掉了dev分支,每个开发版本分支都是基于master分支,同时master分支会有一个gray分支。当完成开发会合并到gray分支验证,验证OK会合并master分支,同时如果发现线上问题,使用hot-fix分支处理并合并master和gray。
* git
* git-flow(变种)
##### 依赖包仓库管理
npm是node端和浏览器端的依赖包管理服务,遵循common.js规范。代码依赖和模块版本都是使用npm进行管理的。主要会通过一个package.json的文件进行模块和项目的说明和依赖包注明。
如下是yoho-node-lib项目的package.json
```json
{
"name": "yoho-node-lib",
"version": "0.2.18",
"description": "some common library for yoho fe. http://git.yoho.cn/fe/yoho-node-lib",
"main": "index.js",
"scripts": {
"test": "node_modules/.bin/nyc node_modules/.bin/ava",
"posttest": "node_modules/.bin/nyc report --reporter=html"
},
"repository": {
"type": "git",
"url": "http://git.yoho.cn/fe/yoho-node-lib.git"
},
"keywords": [
"common",
"library",
"yoho",
"node"
],
"author": "jiangfeng <jeff.jiang@yoho.cn>",
"license": "ISC",
"ava": {
"tap": true
},
"dependencies": {
"bluebird": "^3.4.0",
"handlebars": "^4.0.5",
"lodash": "^4.13.1",
"lru-cache": "^4.1.1",
"md5": "^2.1.0",
"memcached": "^2.2.2",
"moment": "^2.13.0",
"request-promise": "^3.0.0",
"uuid": "^3.0.1",
"walk": "^2.3.9",
"winston": "^2.2.0",
"winston-daily-rotate-file": "^1.1.1",
"xss-filters": "^1.2.6"
},
"devDependencies": {
"ava": "^0.15.2",
"eslint": "^4.4.1",
"eslint-config-yoho": "^1.0.1",
"nyc": "^11.1.0",
"express": "^4.15.4"
}
}
```
##### 单元测试
目前只有yoho-node-lib使用了单元测试,使用了ava和nyc,ava是一个测试框架包含断言库,测试报告,等一系列的测试套件,nyc是代码覆盖率的统计工具。方便快速统计单元测试的覆盖率。
#### 系统架构
##### 有货WEB端(node+restful)
![](6.png)
##### 缓存体系(有货WEB)
1. 接口缓存(通过memcache进行一级短时间的接口数据缓存,二级缓存默认缓存24h,用于容灾)
2. 进程缓存(缓存一些配置型热点数据,如导航,品牌,品类)
3. 页面缓存(缓存生产的页面,使用了nginx的能力进行缓存)
4. 浏览器端缓存(设置页面,已经,静态资源的缓存失效时间)
##### 爬虫体系
现在爬虫服务,主要使用了慢慢买接口和神箭手的爬虫服务,通过node进行封装和暴露web-hooks接口进行商品比价的爬取和上报。
爬虫代理服务
![](7.png)
##### 防爬虫体系
1. 访问行为控制
* 一段时间内访问某类页面
* 判断是否出发页面内的Ajax请求
2. 访问频次控制
* 同一IP,访问同一类页面(不同的时间间隔,1m,5m)
3. 黑名单
* 禁止指定IP访问。
* 禁止指定UA访问。
##### SEO体系
1. tdk配置:可以动态针对商品,逛文章,店铺,特定链接设置TDK(title,keywords,description)
2. 托词配置(设置词根,通过词根获取第三方的搜索词)
3. 托词爬取(根据词根获取第三方相关的建议词)
4. 搜索词筛选(筛选出有效的搜索词)
4. 搜索词页面生成(根据获取到的词,匹配出有内容的商品列表页面,并生成)
5. 搜索词监控(监控搜索词的排名,并做出对应的调整)
##### 活动系统
1. 活动页模板化
2. 投票能力封装
3. 发布能力封装
#### 系统优化
##### 服务端优化
* 请求合并
* 全站https
* 接口缓存
* 进程级缓存
* page cache
* 减少接口调用次数
* 模板启动时预编译
* 功能降级
* 计算密集型操作使用原生实现
* 减少串行调用
##### 浏览器端优化
* 首屏直出优化
* 优化直出服务端处理时间
* 直出文档,简化dom结构
* 首屏去除dom的操作
* 首屏只加载所需样式
* 浏览器端缓存优化
* CDN缓存优化(max-age)
* 页面静态资源优化
* 页面只加载所需的css,js
* 加载图片优化
* 预加载优化
* 懒加载优化
* 图片质量和体积控制
* WEBP的运用
* 动画优化
* 减少重布局和重绘
* 减少图层
* DOM操作优化
#### 项目
##### 上线业务
* yohobuy-node(有货pc web端的项目)
* yohobuywap-node(有货wap web端的项目)
* yoho-blk(BLK PC端)
* yohoblk-wap(BLK wap端)
* yoho-shop-manage(商户端)
* yohobuy-portal-fe2(平台端)
* yohobuy-shop-fe2(老商户端)
* yoho-run-dashboard(大数据实时系统)
* mars-activity(mars的活动模块)
* yoho-activity-platform(有货活动平台)
* goods-value-server(商品价值模型)
* yoho-seo(SEO优化)
* doom-spider(比价爬虫)
##### 组件模块
* yoho-node-lib(web框架和工具集)
* eslint-config-yoho(js静态检查配置模块)
* stylelint-config-yoho(CSS静态检查配置模块)
* yoho-lint(静态检查封装)
* YAS-jssdk(前端用户行为数据采集上报)
* YOHO-NPM(依赖包)
* yoho-js-sdk(通用功能封装)
* yoho-node-zookeeper
* yo (web框架)
##### 工具
* yoho-node-ci(前端工具系统)
* static-ci(静态文件构建和发布)
##### 待做事项
##### 业务系统:
* 上下文改造优化:便于后续进行面向切面的信息传递和处理(全部改造完成)。
* 服务端业务模块性能优化:有性能问题的页面进行优化(APM上分析得到)
* 前端缓存体系优化(梳理缓存的页面,以及优化缓存更新的方式,实现主动更新缓存)
##### 可维护性方面:
* web事务上报和性能监控(不依赖第三方的服务)
* 开发时构建优化,开发时构建过程小于2s(提升开发效率)
* node服务docker化(提高node持续集成和部署能力,方便运维弹性伸缩)
* node服务升级到8.x(提升服务性能,开发效率)
##### 技术方面:
* SSR(VUE开发项目,支持服务端直出,先实现BLK的SSR)
* 浏览器端组件整理(优化和精简浏览器端用到的组件)
* PWA(研究性项目,可以从一些活动项目进行实践)
##### SEO方面
* 有货(PC,WAP)100w+级别的新增关键字页面,并完成收录
* 外链推广计划的实施(9-10月之间),实施后:30% UV上升
* 针对关键词优化文章:优化逛文章,媒体文章(有货商品链接),形成内链系统,提升流量和转化
* 商品商品详情页的增加收录,收录量增加10%
\ No newline at end of file
... ...