Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
阿里旅行去啊H5首页总结&Promise
Search
ningzbruc
August 06, 2015
Programming
270
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
阿里旅行去啊H5首页总结&Promise
阿里旅行去啊H5首页总结&Promise
ningzbruc
August 06, 2015
More Decks by ningzbruc
See All by ningzbruc
如何写出一个优秀的开源库
ningzbruc
0
68
去啊无线前端的一天
ningzbruc
1
200
React & Component
ningzbruc
0
49
KISSY.Base - all about that Base
ningzbruc
0
140
Hammer.js
ningzbruc
1
350
淘宝旅行门票iPad版开发
ningzbruc
0
150
Travel on KISSY mini
ningzbruc
0
210
Events
ningzbruc
2
130
Why YUI3
ningzbruc
0
190
Other Decks in Programming
See All in Programming
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
500
新卒PdEのリアル
ryu1013
1
500
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
180
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
250
Heart of Swift Concurrency
koher
0
900
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
3k
XHTMLが残したもの
yosuke_furukawa
PRO
2
810
AIエージェント時代のコードレビューを設計する
nogu66
6
2.7k
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
490
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
440
SREの越境 / SRE Collaboration
y0hgi
2
240
Featured
See All Featured
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
990
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
470
GraphQLとの向き合い方2022年版
quramy
50
15k
From π to Pie charts
rasagy
1
370
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Evolving SEO for Evolving Search Engines
ryanjones
0
300
Building an army of robots
kneath
307
46k
So, you think you're a good person
axbom
PRO
2
2.2k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
280
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
300
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
Transcript
去啊H5首页总结 D[夯䔺
module KISSY.add(function(S, require, exports, module) { 'use strict'; var Q
= require('q'), IO = require('io'), UA = require('ua'), MTop = require('mtop'); module.exports = {…}; });
when not use base?
when not use base? KISSY.add(function(S, UA, Base, Util, City, Data,
View) { 'use strict'; return Base.extend([City, Data, View], {…}, { ATTRS: {…} }); }, { requires: [ 'ua', 'base', './util', './city', './data', './view' ] });
when not use base? KISSY.add(function(S, require, exports, module) { 'use
strict'; var UA = require('ua'), Util = require('./util'), City = require('./city'), Data = require('./data'), View = require('./view'); module.exports = S.merge(City, Data, View, {…}); });
when not use base? S.merge(S.Event.Target, City, Data, View, {…});
when not use base? Base is good but we should
not abuse it…
sketch 解放生产力!!!
sass ✓ rem - 字体自适应 ✓ scale - 比例缩放 ✓
1px - 高清屏细边
(function (root) { var docEl = document.documentElement; function changeRem ()
{ root.rem = docEl.getBoundingClientRect().width / 20; docEl.style.fontSize = root.rem + 'px'; } changeRem(); //... })(window, undefined); sass - rem
@function rem($values){ $list: (); @each $value in $values { $list:
#{$value/32}rem; } @return $list(); } h2 { font-size: rem(32); padding:0 rem(20); height:rem(80); line-height:rem(80); color:rgba(32,35,37,0.8); } sass - rem
sass - 1px .r1b:after { position: absolute; content: ""; top:
0; left: 0; -webkit-box-sizing: border-box; box-sizing: border-box; width: 100%; height: 100%; border: 1px solid rgba(32,35,37,0.15); } @media (-webkit-device-pixel-ratio: 2) { .r1b:after { width: 200%; height: 200%; -webkit-transform: scale(.5); transform: scale(.5); } }
sass - scale .banner { @include scaleOutter(324); } .banner-scroller {
@include scaleInner; overflow:hidden; }
@mixin scaleOutter($height, $width:640) { position:relative; padding-bottom:percentage($height / $width); height:0; overflow:visible;
} @mixin scaleInner($width:100%,$height:100%,$top:0,$left:0,$right:auto,$bottom:auto) { position:absolute; width:$width; height:$height; top:$top; left:$left; right:$right; bottom:$bottom; } sass - scale
image optimize <img data-src="${item.image|image_optim,'640x640','q75'}" class="lazyload fade" /> // 图⽚片优化 Juicer.register('image_optim',
function(url, size, q) { var suffix = '', regx = /_(\d+x\d+)?(q\d+)?\.(jpg|jpeg|png|gif)$/i, match, format; // 获取URL上的参数 if ((match = url.match(regx))) { url = url.replace(regx, ''); size = size || match[0]; q = q || match[1]; format = match[2]; } size && (suffix += size); // 尺⼨寸 q && (suffix += q); // 质量 suffix && (suffix = '_' + suffix + '.jpg'); // 后缀格式 self.isSupportWebp && (suffix += '_.webp'); // ⽀支持webp url && (url += suffix); return url; });
image optimize - webp http://gtms01.alicdn.com/tps/i1/TB1uBH9IFXXXXc.XFXXXETMFFXX-1080-547.jpeg_640x640q75.jpg_.webp use webp: 24.9kb -> 14.6kb
http://gtms01.alicdn.com/tps/i1/TB1uBH9IFXXXXc.XFXXXETMFFXX-1080-547.jpeg_640x640q75.jpg
loading render default page render getCity getData getCity getData flow
optimize 1 2
getCity getData default page / cache page getCity getData default
page / cache page diffHTML 3 4 flow optimize render render
diff html diffHTML: function(tpls, cache) { //... return { add:
add, del: del, update: update, resort: resort, rerender: add.concat(update), modify: add.length || del.length || update.length }; }, renderHTML: function(data) { // diff⼀一下各模块是否有修改 diff = this.diffHTML(tpls, ctpls); console.log(diff); // 如果有修改(增删改) if (diff.modify) { // 先销毁原先的模块逻辑 rerender = diff.rerender; this.destroyMods(rerender); // 先删除没有的模块 diff.del.forEach(function(t) { node = S.one('.' + t.id); node && node.remove(true); }); // 增加新增的模块 diff.add.forEach(function(t) { container.append(t.html); }); // 更新原有的模块 diff.update.forEach(function(t) { // !!!去抢购不需要重新替换HTML if (t.id !== 'trip_home_sale') { node = S.one('.' + t.id); node && node.replaceWith(t.html); } }); } // 如果顺序发⽣生变化 if (diff.resort) { tpls.forEach(function(t) { node = S.one('.' + t.id); node && container.append(node); }); } return rerender; },
Promise “A promise represents the eventual result of an asynchronous
operation. The primary way of interacting with a promise is through its then method, which registers callbacks to receive either a promise’s eventual value or the reason why the promise cannot be fulfilled.” - Promises/A+ https://promisesaplus.com/
Promise getCity getData default page / cache page diffHTML render
Promise getCity getData default page / cache page diffHTML render
Promise
Promise // sync this.getCity() .getData() .render();
Promise // sync this.getCity() .getData() .render(); // async - callbacks
this.getCity(function(city) { this.getData(city, function(data) { this.render(data); }); });
Promise // sync this.getCity() .getData() .render(); // async - callbacks
this.getCity(function(city) { this.getData(city, function(data) { this.render(data); }); }); 回调过度嵌套
Promise // sync this.getCity() .getData() .render(); // async - callbacks
this.getCity(function(city) { this.getData(city, function(data) { this.render(data); }); }); // async - promise this.getCity() .then(this.getData) .then(this.render); 回调过度嵌套
Promise
Promise // async - callbacks getData: function(city, callback) { if
(yes) { callback(null, data); } else { callback(reason, null); } }
Promise // async - callbacks getData: function(city, callback) { if
(yes) { callback(null, data); } else { callback(reason, null); } } 混淆参数与返回值
Promise // async - callbacks getData: function(city, callback) { if
(yes) { callback(null, data); } else { callback(reason, null); } } // async - promise getData: function(city) { return new Promise(function(resolve, reject) { if (yes) { resolve(data); } else { reject(reason); } }); } 混淆参数与返回值
Promise
Promise // async - callbacks this.getData(city, function(err, data) { if
(err) { this.handleError(err); } else { this.render(data); } });
Promise // async - callbacks this.getData(city, function(err, data) { if
(err) { this.handleError(err); } else { this.render(data); } }); 处理错误麻烦
Promise // async - callbacks this.getData(city, function(err, data) { if
(err) { this.handleError(err); } else { this.render(data); } }); // async - promise this.getData(city) .then(this.render, this.handleError); 处理错误麻烦
Promise // async - callbacks this.getData(city, function(err, data) { if
(err) { this.handleError(err); } else { this.render(data); } }); // async - promise this.getData(city) .then(this.render, this.handleError); 处理错误麻烦 // async - promise - catch this.getData(city) .then(this.render) .catch(this.handleError);
Promise - status pending fullfilled rejected resolve reject single way
Promise - status
// async - callbacks getCity: function(callback) { var timer; if
(urlCity) { callback(urlCity); } else if (cacheCity) { callback(cacheCity); } else { this.getLocateCity(function(locateCity) { clearTimeout(timer); callback(locateCity); }); timer = setTimeout(function() { callback(defaultCity); }, 8000); } } Promise - status
// async - callbacks getCity: function(callback) { var timer; if
(urlCity) { callback(urlCity); } else if (cacheCity) { callback(cacheCity); } else { this.getLocateCity(function(locateCity) { clearTimeout(timer); callback(locateCity); }); timer = setTimeout(function() { callback(defaultCity); }, 8000); } } Promise - status 多种状态可能执行多次
// async - callbacks getCity: function(callback) { var timer; if
(urlCity) { callback(urlCity); } else if (cacheCity) { callback(cacheCity); } else { this.getLocateCity(function(locateCity) { clearTimeout(timer); callback(locateCity); }); timer = setTimeout(function() { callback(defaultCity); }, 8000); } } Promise - status // async - promise getCity: function(callback) { return new Promise(function(resolve, reject) { resolve(urlCity); resolve(cacheCity); this.getLocateCity.then(resolve); setTimeout(function() { resolve(defaultCity); }, 8000); }); } 多种状态可能执行多次
// async - callbacks getCity: function(callback) { var timer; if
(urlCity) { callback(urlCity); } else if (cacheCity) { callback(cacheCity); } else { this.getLocateCity(function(locateCity) { clearTimeout(timer); callback(locateCity); }); timer = setTimeout(function() { callback(defaultCity); }, 8000); } } Promise - status // async - promise getCity: function(callback) { return new Promise(function(resolve, reject) { resolve(urlCity); resolve(cacheCity); this.getLocateCity.then(resolve); setTimeout(function() { resolve(defaultCity); }, 8000); }); } 多种状态可能执行多次 多种状态只执行一次
Promise - all
Promise - all // async - callbacks getData: function(city, callback)
{ var count = 0, datas = []; function checkDone(data) { datas.push(data); if (++count == 2) { callback(datas); } } this.getLayoutData(city, function(data) { checkDone(data); }); this.getOnsaleData(function(data) { checkDone(data); }); }
Promise - all // async - callbacks getData: function(city, callback)
{ var count = 0, datas = []; function checkDone(data) { datas.push(data); if (++count == 2) { callback(datas); } } this.getLayoutData(city, function(data) { checkDone(data); }); this.getOnsaleData(function(data) { checkDone(data); }); } 并行异步操作麻烦,并且无法保证返回值顺序
Promise - all // async - callbacks getData: function(city, callback)
{ var count = 0, datas = []; function checkDone(data) { datas.push(data); if (++count == 2) { callback(datas); } } this.getLayoutData(city, function(data) { checkDone(data); }); this.getOnsaleData(function(data) { checkDone(data); }); } // async - promise getData: function(city) { return Promise.all([ this.getLayoutData(city), this.getOnsaleData() ]); } 并行异步操作麻烦,并且无法保证返回值顺序
Promise - api • Promise.all(promises) - 并行处理异步,全部结束时返回值 • Promise.race(promises) -
并行处理异步,第一个结束时返回值 • Promise.resolve(value) - 生成一个成功的 Promise 对象 • Promise.reject(reason) - 生成一个失败的 Promise 对象 • promise.then(onFullfilled, onRejected) - 处理回调 • promise.catch(onRejected) - 处理失败回调 Static Prototype
• caniuse • RSVP.js • Q.js • https://promisesaplus.com/ • http://www.html5rocks.com/en/tutorials/es6/promises/
• https://www.youtube.com/watch?v=qbKWsbJ76-s • https://www.youtube.com/watch?v=wc72cyYt8-c can I use Promise?
感想
感想 • “迷途知返”- 要及时跳出坑
感想 • “迷途知返”- 要及时跳出坑 • 写注释可以帮助重新梳理逻辑与优化代码
感想 • “迷途知返”- 要及时跳出坑 • 写注释可以帮助重新梳理逻辑与优化代码 • 极致体验精益求精是我们永无止境的追求
感想 • “迷途知返”- 要及时跳出坑 • 写注释可以帮助重新梳理逻辑与优化代码 • 极致体验精益求精是我们永无止境的追求 • 把每一个项目都当做是一次超越自己的机会
感想 • “迷途知返”- 要及时跳出坑 • 写注释可以帮助重新梳理逻辑与优化代码 • 极致体验精益求精是我们永无止境的追求 • 把每一个项目都当做是一次超越自己的机会
• ES6 is Comming !!!
None
THE END.