ratchet-practice
goratchet.com
它是?
它是twitter出的移动端h5框架。用于原型和快速开发。
优势
- 快速开发
- 小巧
- 和bootstrap思路相近
- 便于定制和集成
Run && Test
npm install
npm start
this will open http://0.0.0.0:8881/index.html
默认,ratchet是不支持pc浏览器的click事件的,所以我们需要【开启移动测试】
然后就可以尽情测试了。
push
原理:以数据结构【栈】的方式存放nav导航页面。
核心技术
- ajax (加载页面)
- pushstate (改变url状态)
push css
入栈
<a class="navigate-right" href="chat.html" data-transition="slide-in">
出栈
<a class="icon icon-left-nav pull-left" href="index.html" data-transition="slide-out"></a>
动画类型
data-transition是push的时候的动画
var transitionMap = {
slideIn : 'slide-out',
slideOut : 'slide-in',
fade : 'fade'
};
push js
默认不写任何js代码就可以完成push的,但是高级定制的是一定要了解每个页面入栈和出栈的生命周期的
这方面ratchet表现的很弱,但可以实现
状态切换
window.addEventListener('push', function(e){
$("#t2").show();
// alert(111);
var url = e.detail.state.url;
if(case_one(url,/chat\.html/g)){
console.log("聊天");
// init_with_chat();
}
if(case_one(url,/index\.html/g)){
console.log("首页");
// $('.content').html(index_content)
}
function case_one(url, pattern){
return (url.match(pattern)) instanceof Array;
}
});
更多见源码里的push.js,当它完成push的时候,会发送一个自定义事件push的。
手动调用
另外可以手动调用的。见源码:
window.PUSH = PUSH;
push的弊端
页面动态是非常头疼的问题,此处还是建议使用服务器端生成页面,不要ajax本地拼装,效果太差了。
推荐方案
express + jade
动态的内容,使用jade来生成,此法可根据参数以及个人信息等定制,是服务器端生成的html页面
静态页面可仍然使用html编写,放到express的public目录下
上面的2种方式可以任意组合,可以胜任各种场景。
- jade学习文档 https://github.com/i5ting/study-jade
源码分析
push state
var locationReplace = function (url) {
window.history.replaceState(null, '', '#');
window.location.replace(url);
};
ajax get
var parseXHR = function (xhr, options) {
var head;
var body;
var data = {};
var responseText = xhr.responseText;
data.url = options.url;
if (!responseText) {
return data;
}
if (/<html/i.test(responseText)) {
head = document.createElement('div');
body = document.createElement('div');
head.innerHTML = responseText.match(/<head[^>]*>([\s\S.]*)<\/head>/i)[0];
body.innerHTML = responseText.match(/<body[^>]*>([\s\S.]*)<\/body>/i)[0];
} else {
head = body = document.createElement('div');
head.innerHTML = responseText;
}
data.title = head.querySelector('title');
var text = 'innerText' in data.title ? 'innerText' : 'textContent';
data.title = data.title && data.title[text].trim();
if (options.transition) {
data = extendWithDom(data, '.content', body);
} else {
data.contents = body;
}
return data;
};
此处并没有把js加载进来,所以你不要期望在将push的页面里写函数。
所有的js代码应该最终都写在一个文件里。
push事件
当多个页面push和pop的时候,可能需要更新数据,此时需要监听push事件
window.addEventListener('push', function(e){
var url = e.detail.state.url;
if(case_one(url,/chat\.html/g)){
// alert("聊天");
init_with_chat();
}
if(case_one(url,/index\.html/g)){
// alert("首页");
// $('.content').html(index_content)
// main();
}
function case_one(url, pattern){
return (url.match(pattern)) instanceof Array;
}
});
my best practice
推荐js库
- ratchet(push,ui,css)
- zepto.js(类jq的移动端库,支持tap、手势等,兼容jquey大部分api)
- iscroll5.js(滚动效果最好的库)
- fastclick.js(增强点击转成touch的库,可定制)
- miniobj.js(js面向对象库)
- collection.js(如果移动端浏览器不支持websql,它会自动转成localstorage)
- http://scottjehl.github.io/picturefill/
ripple 模拟器
There is a command line interface that can be paired with the client (UI).
It can be used for various things, such as statically hosting an application, and running a local (cross origin) XHR proxy.
To install:
npm install -g ripple-emulator
This will install a global script called ripple
. To see usage, run:
ripple help
这只是一个选择而已,待测
使用gulp task
- uglify
- watch
- livereload
- test
- coverage
服务器优化
- appcache
- mime
- zip
- 禁用etag
- ...