淘宝开放产品前端实践

61
淘淘淘淘淘淘淘淘淘淘 店店店店 & 店店店店 JS SDK 淘淘 & 淘淘 2012-07-07

Transcript of 淘宝开放产品前端实践

Page 1: 淘宝开放产品前端实践

淘宝开放产品前端实践店铺装修 & 开放平台 JS SDK

清羽 & 沉鱼2012-07-07

Page 2: 淘宝开放产品前端实践

1. 店铺装修1.1 概要1.2 数据1.3 展现1.4 安全

Page 3: 淘宝开放产品前端实践

关于作者

周骞(清羽)http://weibo.com/carffuca

08 年加入淘宝之前是 Java 工程师之后是前端开发工程师

目前负责淘宝店铺、服务、数据业务

Page 4: 淘宝开放产品前端实践

1.1 概要店铺装修

Page 5: 淘宝开放产品前端实践

店铺装修

Page 6: 淘宝开放产品前端实践

装修的本质

店铺平台

模板数据

HTML/CSS

JS

Page 7: 淘宝开放产品前端实践

装修的本质

基于模板的内容管理系统

Page 8: 淘宝开放产品前端实践

开放装修的历程:第一阶段

店铺平台

模板

数据( 卖家 )

HTML/CSS

JS

Page 9: 淘宝开放产品前端实践

1.2 数据店铺装修

Page 10: 淘宝开放产品前端实践

模块化 基于模块的店铺

Page 11: 淘宝开放产品前端实践

数据的形式 资源类,如一张图片 URL

文本类,如一个标题、一段广告词

条件类,如选择使用某种预置的展现形式

Page 12: 淘宝开放产品前端实践

所见即所得 VS 格式化的编辑界面

数据的编辑方式

Page 13: 淘宝开放产品前端实践

数据的编辑方式 所见即所得 VS 格式化的编辑界面• 用户编辑的数据并不都是“看得见”的

• 引入第三方设计模板后,格式化的编辑界面便于设计师定义,由程序生成

Page 14: 淘宝开放产品前端实践

开放装修的历程:第二阶段

店铺平台

模板(设计师)

数据(卖家)

HTML/CSS

JS

Page 15: 淘宝开放产品前端实践

1.3 展现店铺装修

Page 16: 淘宝开放产品前端实践

魔高一丈

Page 17: 淘宝开放产品前端实践

魔高一丈 通过浮动元素遮挡系统重要内容

通过 CSS 修改重要内容的样式

伪造官方模块

……

Page 18: 淘宝开放产品前端实践

规范、有序 明确的 CSS 覆盖关系

•[0,2,0,0]<w<[0,3,0,0]

模块设计师

•[0,1,0,0]<w<[0,2,0,0]

模块默认

•w<[0, 1, 0, 0]

全局基础

Page 19: 淘宝开放产品前端实践

规范、有序 模块化的 CSS 书写

Page 20: 淘宝开放产品前端实践

规范、有序 层级的规范

设计师模块

z-index <100

官方模块

z-index < 200

系统及全局z-index >200

Page 21: 淘宝开放产品前端实践

规范、有序 一整套约束平台上各方代码关系的规范

Page 22: 淘宝开放产品前端实践

规范、有序 完善的校验系统

设计师模板制作

HTML

CSS

可选校验

必须校验

设计师模板提交 卖家装修发布

HTML

CSS

HTML

CSS

Page 23: 淘宝开放产品前端实践

开放装修的历程:第三阶段

店铺平台

模板(设计师)

数据(卖家)

HTML/CSS

JS

Page 24: 淘宝开放产品前端实践

1.4 安全店铺装修

Page 25: 淘宝开放产品前端实践

初现端倪的 JS 开放 通过 J_TWidget 的 class hook 与 data-*

的自定义属性提供官方动态组件。

<div class=“J_TWidget” data-type=“Slide” data-cfg=“{…}”><!-- code -->

</div>

Page 26: 淘宝开放产品前端实践

如果让设计师写 JS

Cookie 盗取

跳转钓鱼网站

恶意修改官方功能

……

Page 27: 淘宝开放产品前端实践

店铺开放 JSiframe ADSafe Caja

保障安全程度高 3 4 5

JS 书写限制少 5 2 4

最终用户体验好 1 3 4

方便调试 5 4 2

性能损耗小 5 4 3

项目活跃度高 / 2 4

项目有应用产品 4 1 3

Page 28: 淘宝开放产品前端实践

店铺开放 JS

基于 google-caja 的实现

取其 JS 部分

接入 Kissy DOM 、 Event 等 API

+服务端静态检查 + 翻译

浏览器端运行时检查

Page 29: 淘宝开放产品前端实践

店铺开放 JS

用户代码

var el = document.getElementById(“id”)

;

服务端

编译后代码moduleResult___ =

IMPORTS___.w___('el', (x0___ =

IMPORTS___.document_v___? IMPORTS___.document:

___.ri(IMPORTS___, 'document'),

x0___.getElementById_m___? x0___.getElementById('id'):

x0___.m___('getElementById', [ 'id' ]))); 

编译

静态分析代码

Page 30: 淘宝开放产品前端实践

Caja.JS

动态拦截代码

店铺开放 JS

浏览器端

编译后代码moduleResult___ =

IMPORTS___.w___('el', (x0___ =

IMPORTS___.document_v___? IMPORTS___.document:

___.ri(IMPORTS___, 'document'),

x0___.getElementById_m___? x0___.getElementById('id'):

x0___.m___('getElementById', [ 'id' ])));

服务端

Page 31: 淘宝开放产品前端实践

Kissy 接入 DOM

Event

Anim

log

……

Page 32: 淘宝开放产品前端实践

不久的未来 更友好的出错信息提示

如何评估设计师 JS 代码的质量和性能

Page 33: 淘宝开放产品前端实践

店铺平台

模板 ( 设计师 )

数据( 卖家 )

HTML/CSS

JS

1.5 小结店铺装修

Page 34: 淘宝开放产品前端实践

2 开放平台 JS SDK2.1 概要2.2 安全2.3 数据2.4 展现

Page 35: 淘宝开放产品前端实践

关于作者杨周璇(沉鱼)fool2fish.cnweibo.sina.com/fool2fish

07 年毕业于浙江大学08 年加入淘宝目前负责淘宝开放平台项目

Page 36: 淘宝开放产品前端实践

2.1 概要开放平台 JS SDK

Page 37: 淘宝开放产品前端实践

2.1.1 传统的业务模型

资源服务1. 数据交互

2. 返回结果

Page 38: 淘宝开放产品前端实践

2.1.2 开放的业务模型

1. 数据交互

4. 返回结果客户端

2. 数据交互

3. 返回结果

客户 端

客户 端

客户 端

客户 端客户 端

资源服务

Page 39: 淘宝开放产品前端实践

2.1.3 开放的动力 资源拥有者• 更多的访问入口

• 多样化的服务

第三方客户端• 共享用户数据

• 增加用户黏性

Page 40: 淘宝开放产品前端实践

2.1.4 关键的问题

JAVA SDK JS SDK

展现

数据

安全

Page 41: 淘宝开放产品前端实践

2.2 安全开放平台 JS SDK

Page 42: 淘宝开放产品前端实践

2.2.1 保障安全的环节客户端接入许可

资源所有者授权

客户端身份校验

客户端行为监控

Page 43: 淘宝开放产品前端实践

2.2.2 Oauth2 授权模型

客户端 授权服务

资源服务

1. 授权申请

2. 访问许可

3. 访问许可

4. 授权码

5. 签名和授权码

6. 受保护的资源

资源所有者

Page 44: 淘宝开放产品前端实践

2.2.3 签名

客户端 资源服务

3. 时间戳 &签名 授权码 API 参数

4. 受保护的资源

客户端服务

1. 请求页面 2. 页面内容 时间戳 &签名

Page 45: 淘宝开放产品前端实践

2.2.4 免签名

客户端 资源服务3. Ajax 发送标识码和授权码

4. 受保护的资源

1. frame请求组件内容

2. 静态内容和标识码

只有请求的组件为 iframe 时,这种简化的认证方式才能保证安全

Page 46: 淘宝开放产品前端实践

2.3 数据开放平台 JS SDK

Page 47: 淘宝开放产品前端实践

2.3.1 数据获取客户端 开放平台 业务方

授权检查身份校验

生成结果

封装结果

发送请求

返回结果

Page 48: 淘宝开放产品前端实践

2.3.1 API 调用TOP.api({

method:’taobao.user.get’,

nick:’fool2fish’,

app_key:’准入码’ ,

session:’授权码’ ,

sign:’签名’ ,

timestamp:’ 时间戳’}, callback);

接口名接口参数

Page 49: 淘宝开放产品前端实践

2.3.2 API 集成授权

返回结果

发送请求

调 用正常

返回异常信 息

已授权附加授权信 息是

授权异常调 用授权

完 成授权

否 是

添加授权码和签名

Page 50: 淘宝开放产品前端实践

2.3.3 真正的 API 调用TOP.api({

method:’taobao.user.get’,

nick:’fool2fish’,

}, callback);

让用户专注在他真正需要关心的事情上

Page 51: 淘宝开放产品前端实践

2.4 展现开放平台 JS SDK

Page 52: 淘宝开放产品前端实践

2.4.1 组件分类

Page 53: 淘宝开放产品前端实践

2.4.2 代码隔离 iframe

CSS 选择器和属性规范

自定义标签

Page 54: 淘宝开放产品前端实践

客户端

2.4.3 组件通讯

DOM 组件 Iframe 组件 混合组件

Page 55: 淘宝开放产品前端实践

2.4.3 组件通讯 TOP.ev.add ( el, event, fn );

TOP.ev.fire ( el, event, data );

TOP.ev postMessagehtml5PostMessage

flashPostMessage

Page 56: 淘宝开放产品前端实践

2.4.3 组件通讯

TOP.ev.fire 触发本帧事件

客户端帧

通知客户端帧

遍历组件帧

触发帧

通知组件帧

触发帧

Page 57: 淘宝开放产品前端实践

2.5 小结开放平台 JS SDK

Page 58: 淘宝开放产品前端实践

2.5.1 JS SDK 总体结构

UI辅助功能

组件通讯

工具方法lang , dom , event , io…

TOP

监控

开放的 api ( TOP.api )

登录授权 ( TOP.auth )

UI 组件 ( TOP.ui )

登录

购物车

……

Page 59: 淘宝开放产品前端实践

2.5.2 除此之外 SDK 和组件的版本管理

SDK 自动更新

数据回流与分析

……

Page 61: 淘宝开放产品前端实践

Q&A