携程 & 饿了么

的前端比较

技术栈

1.框架 & 实践

2.前后端分离

3.监控和漏洞扫描

4.打包工具 & Hybrid

5.新技术的尝试

协同

1.分支策略

2.测试环境

3.自动化测试

4.开发者工具

框架 & 实践

Backbone VS Vue

携程的C端 VS 饿了么的B端

模块划分

所用到的开源库

1.技术栈backbone/underscore/require(2016年版) 

2.由于存在SEO需求,实现了SSR服务端渲染

3.为了解决APP端第一次加载慢,实现了hybrid打包

4.为了解决浏览器劫持用https但是后来又改了回来

5.为了解决无痕模式对loaclstorage和cookie做了无痕模式单独处理

 

携程的C端 

工程结构

Model: 调接口

store: localstorage

base: 父类

tools & commons

除controller以外

都打到config中

饿了么的B端

构建:自定义了模板包含内部库的 vue-cli  引入埋点采集/第三方地图

内部包:rpc实现, 封装了一些常见css minin 块 常量 css初始化等

兼容性(ie9以上):(babel + whatwg-fetch + promise-polyfill) 或 ts

 + autoprefixer

锁版本:yarn 或 npm5

状态机:vuex  mutation 全部都用 action 操作

vuex的单向绑定 和 vue双向绑定冲突的问题

深拷贝切断双向绑定/重写getter setter/

watch对象调用action

打包优化:合并重复包/多chunk(规划中)/按需加载

 

想做的

  • 重新分包commonChunk
  • Tree Shake: 自动删除无用依赖
  • 优化webpack打包速度 dllplugin
  • 子应用之间通信

整体架构 

  • 首先有一个单页应用外壳,做权限控制和导航
    a)啥权限控制是异步的? 权限还是绑定到id每次调接口验证
  • 2.用iframe嵌套多个子应用,子应用根据领域划分用独立的仓库
    a)单页应用跳单页应用的白屏问题
  • 每个子应用随着业务发展不断拆分

qidian-workbench

typescript

vue-property-decorator

 

TODO 分析dependence

前后端分离

 

统一的携程

 

五花八门的饿了么

ctrip

允许cookie, 跨域调用(允许单一域名)

测试环境: 跨域调用gateway

生产环境: 同源不同路径/实际上CORS属性都放开了

服务端渲染:通过node解析页面上的lizard-config 在 #main-viewport中渲染配置中接口调用的结果

ele

三种方案

httpizza:后端代理到前端域名上 (多活策略问题)

sopush:后端和前端代理到第三个域名上

ncp:完全通过CORS跨域访问

生产环境:二级域名之间相互通信

服务端渲染:暂无

 

监控 & 漏洞扫描

 

ctrip

grunt / glup / webpack

eleme

webpack

ctrip

hybrid 离线包

热更新

hybrid 通信

eleme

只有hybrid通信

ctrip

win10应用

react Native

smart banner & universal link & assert link

amp

小程序

公司级浏览器插件

eleme

pwa

小程序

快应用

工具级浏览器插件

 

分支策略

1.只有master分支可发布

2.每个迭代切 release-y/m/d 分支

3.开发从release-y/m/d上切feat分支 (提交时建议rebase这一次所有的commit)

4.release-y/m/d用于发测试环境 alpha uat(alt多活环境)

5.测试时发布的槽位避开前面release的环境

6.合并master前要和master解决冲突, master 发堡垒机

7.最终用于合并上master, 过几天删除过期的release分支

测试

pupteer 的尝试

Ctrip

环境:1.alpha(下设多槽位)测试环境 2.uat 另一个测试环境? 3.smoke 堡垒机: 在生产集群中拉出一台机器用于测试,测试完后放回  4.prod

Eleme

uat环境为多活环境

没有堡垒机

 

 

Eleme

       await page.goto('https://juejin.im')

      var login = await page.$('.login')
      await login.click()

      var loginPhoneOrEmail = await page.$('[name=loginPhoneOrEmail]')
      await loginPhoneOrEmail.click()
      await page.type('18516697699@163.com', {delay: 20})

      var password = await page.$('[placeholder=请输入密码]')
      await password.click()
      await page.type('123456', {delay: 20})

      var authLogin = await page.$('.panel .btn')
      await authLogin.click()

pupteer google官方的headless chrome

https://github.com/zhentaoo/puppeteer-deep

1.模拟用户操作,自动化测试/爬虫

2.结合定时脚本

function monitor() {
puppeteer.launch().then(async browser => {
    let page = await browser.newPage();

    await page.goto('http://www.zhentaoo.com/');
    await timeout(2000);

    let aTags = await page.evaluate(() => {
      let as = [...document.querySelectorAll('ol li a')];
      return as.map((a) =>{
          return {
            href: a.href.trim(),
            name: a.text
          }
      });
    });

    await page.screenshot({path: './data/zhentaoo/zhentaoo.png', type: 'png'});
    browser.close();
  });
}

monitor();
setInterval(monitor, 1000 * 60 * 5);

监控/进行自动操作

await page.tracing.start({path: './data/trace/trace.json'});
await page.goto('http://www.zhentaoo.com');
await page.tracing.stop();

3.结合Chrome Performance 的Trace Api

4.其他应用

生成骨架图

https://zhuanlan.zhihu.com/p/34702561

工具

饿了么的基础工具-开发

faas:持续集成 一键回滚 CDN 一键存储 增量发布 https://faas.ele.me/

httpizza:gateway 对接soa接口 的nginx配置可视化,提供了插件范式,和大量插件(例如获取解析用户token),实现了配置简化,方便版本控制

sopush:站点nginx 反向代理管理工具

crayfish:灰度工具,通过控制一个静态文件灰度展示不同内容

实现灰度控制

 

饿了么的基础工具-业务

前端采集:https://perf.ele.me/

自助申请埋点,自主设置错误告警阈值,页面加载速度,资源加载速度,ajax速度,错误数量,埋点数据可视化,查看错误堆栈

Ubt

 


调查问卷: https://quizer.faas.ele.me/#/

以上都是一些名词

以下全都是主观

携程的正

人员稳定,业务能力强

有一定技术积累

核心业务技术投入大

携程的反

五级不写代码??!!

饿了么的正

人员超级年轻,天性纯良,耿直勤奋

开源社区活跃

公司对技术折腾给出足够容忍度的正反馈

饿了么的反

领导层过于年轻,导致管理混乱

颠簸中的上升期

ctrip & eleme

By zhe zhu

ctrip & eleme

compare

  • 1,039