专注于前端开发, 追求更好的用户体验, 更好的开发体验 [长沙前端QQ群:234746733]

开发

  • doT.js 模板引擎的使用

    / 分类: 开发,实践 / 47 Comments

    模版引擎之前在介绍mustache时已经提到了。doT、mustache各有优势吧,如果用于JS环境,doT的性能更胜一筹,并且套语句更方便些。现在公司的mobile页面已经被我替换成doT了。

    doT source: https://github.com/olado/doT
    Docs: http://olado.github.com/doT/

    doT上手比较容易,但之前熟悉了mustache,改用doT时有点不习惯,但用两次就好了。

    下载doT.js(里面有个doU.js不要用,doU.js是为了测试遗留问题的)。举个简单的使用例子:

    HTML部分:

    <script id="j-tmpl" type="text/template">
    {{ if(it.success){ }}
    	<h2>results:</h2>
    	<ul>
    		{{ for (var i = 0, l = it.data.length; i < l; i++) { }}
    			<li>
    				<h5>{{=it.data[i].title}}</h5>
    				<p>{{!it.data[i].message}}</p>
    			</li>
    		{{ } }}
    	<ul>
    {{ }else{ }}
    	<h2>暂无数据</h2>
    {{ } }}
    </script>
    

    JS部分:

    <script>
    var obj = {
    	success: true,
    	data:[
    		{title:'item1',message:11},
    		{title:'item1',message:22}
    	]
    }
    var tmpl = document.getElementById('j-tmpl').innerHTML;
    var doTtmpl = doT.template(tmpl);
    console.log(doTtmpl(obj ));
    </script>
    

    看了例子,就应该会使用了。
    {{=it.xx}} 取obj.xx的值
    {{ }} 里面放if els / for 等表达式
    {{!it.xx}} 取把obj.xx转义后的值
    这些基本够用了,还有复杂的应用,可以看doT主页内的examples、docs。
    并且,可以很容易把doT写成jquery插件:

    $.extend({
    tmpl: function(template, data){
    	return doT.template(template).apply(null,[data]);
    }
    });
    
  • TortoiseGit GitHub 使用小计

    / 分类: 开发,工具 / 4 Comments

    装了GIT很久了,最近也没时间鼓捣,今天提交GitHub时发现不太会用了,所以查查资料,简单记录下git的安装和使用。

    1. msysgit

    TortoiseGit依赖msysgit,下载:http://code.google.com/p/msysgit/downloads/list
    有Portable版,我用的就是这个。比如解压.7z到:D:\WebDevelopment\Git\PortableGit

    2. 配置TortoiseGit

    下载:http://code.google.com/p/tortoisegit/downloads/list
    安装TortoiseGit,全部保持默认即可。

    配置git的路径:
    桌面右键 -TortoiseGit - setting - General - MSysGit路径,指定:
    D:\WebDevelopment\Git\PortableGit\bin。

    创建ssh key:
    开始菜单-TortoiseGit-Puttygen, Generate,然后Save private key到本地 (无需key passphrase),比如保存到:D:\WebDevelopment\Git。保存的key下次比如重装系统, 可以继续使用。复制对话框里生成的ssh key,类似:
    ssh-rsa
    .....
    .....
    .....= rsa-key-20120218

    TortoiseGit - setting - Git - Config,填写 name、email。
    新版的默认是只读的, 可以通过右键-git bash里添加配置:
    git config --global user.name 'xxx'
    git config --global user.email "xx@xx"

    3. 使用GitHub

    GitHub功能类似googlecode,方便储存代码。主页,进入Edit Your Profile,找到SSH Keys,Add New SSH Key或edit现有的SSH Key。title随便取,把上面复制的ssh key粘贴到key一栏。

    创建项目:
    主页,New repository创建项目,填写项目名称之类的。创建好后,可以看到一些说明,找到里面的git@github.com:yourName/test.git,复制这个URL。

    本地创建个文件夹,比如test,右键-Git Clone,URL中粘贴刚才复制的URL。Load Putty Key选择上面保存到本地的ssh key。OK,弄完了。

    提交code到github

    右键-Git Commit,然后Push,就可以推到GitHub里面了。

    查看全文 »

  • 使用mustache js模板引擎

    / 分类: 开发,实践 / 5 Comments

    Mustache 是个不错的js模板引擎,源码:https://github.com/janl/mustache.js
    演示:http://mustache.github.com/#demo,不仅支持js,还有PHP/RUBY/nodejs等好多语言。市面上的JS模板引擎也不少了,在公司的项目中,考虑在mustache.js、jquery-tmpl两个里面选择,最后选择了mustache,因为它支持的语言更多些,可以写成JQ插件,不依赖其他库,用在团队比较适合,并且一些不错的web项目也选择了它,性能方面应该都不会有太大差距。

    js模板引擎可以把模板分离出来,在ajax使用较多的场合非常适用。以前我们可能会使用拼接的方法,比如:

    var html=[];
    html.push(‘<h1>’); html.push(‘header’); 
    html = html.push(‘</h1>’).join(‘’);
    

    当遇到数据结构复杂 、大量页面都需要这样做的时候,js看起来可能非常乱,维护很不便。使用js模板引擎,可以方便的把view分离出来。
    mustache的一些说明:http://mustache.github.com/mustache.5.html

    if语句

    因为是Logic-less templates,无逻辑,只有标签,无if、for等,不过这些逻辑可以在写在js里面。基本还是适合大部分场合了。如果使用if语句,可以在js里面做一些判断增加一个has标签,然后在模板里面调用,比如再模板里可以这样:

    {{#hasValue}}
    有{{value}}的情况
    {{/hasValue}}
    {{^hasThumb}}
    无value,显示默认值
    {{/hasThumb}}
  • CentOS下开启mysql远程连接,远程管理数据库

    / 分类: 开发 / 11 Comments

    当服务器没有运行php、没装phpmyadmin的时候,远程管理mysql就显得有必要了。因为在CentOS下设置的,所以标题加上了CentOS,以下的命令在debian等系统下应该也OK。

    mysql -u root -p mysql # 第1个mysql是执行命令,第2个mysql是系统数据名称
    

    在mysql控制台执行:

    grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
    # root是用户名,%代表任意主机,'123456'指定的登录密码(这个和本地的root密码可以设置不同的,互不影响)
    flush privileges; # 重载系统权限
    exit;
    

    允许3306端口

    iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
    # 查看规则是否生效
    iptables -L -n # 或者: service iptables status
    
    # 此时生产环境是不安全的,远程管理之后应该关闭端口,删除之前添加的规则
    iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
    

    PS,上面iptables添加/删除规则都是临时的,如果需要重启后也生效,需要保存修改:
    service iptables save # 或者: /etc/init.d/iptables save
    另外,
    vi /etc/sysconfig/iptables # 加上下面这行规则也是可以的
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT

    远程管理数据库的软件,win系统下可以使用SQLyog,用了几种远程软件,感觉这个用起来蛮不错的。

  • 用javascript预加载图片、css、js的方法研究

    / 分类: 开发,实践 / 10 Comments

    预加载的好处可以让网页更快的呈现给用户,缺点就是可能会增加无用的请求(但图片、css、js这些静态文件可以被缓存),如果用户访问的页面里面的css、js、图片被预加载了,用户打开页面的速度会快很多,提升用户体验。在用到一些大图片展示的时候,预加载大图是很不错的方法,图片更快的被呈现给用户。不多说了,作为一个前端攻城师都懂的,下面分享我做的测试和得到的结果。

    先说需要知道的服务器返回的status code:
    status-code: 200 - 客户端请求成功
    status-code: 304 - 文件已经在浏览器缓存中,服务器告诉客户端,原来缓冲的文档还可以继续使用。
    本文测试判断文件被是否被缓存,用的就是判断是否返回304.

    下面针对预加载的几个方法,在不同的浏览器下加载img/js/css做个测试,主要包括new Image()、object、iframe。以下加载测试的js、css、图片文件,是从几个门户网站找的(为啥找几个?是为了尽可能滴测试到特殊的情况,测试中还真遇到了)。

    1、测试用new Image()预加载

    1.1、new Image()加载


    new Image().src = 'http://img02.taobaocdn.com/tps/i2/T1iQhUXnxpXXXXXXXX-171-48.png'; //淘宝
    new Image().src = 'http://static.paipaiimg.com/module/logo/logo_2011_02_22.png'; //拍拍
    new Image().src = 'http://co.youa.baidu.com/picture/services/images/logo.png'; //有啊
    new Image().src = 'http://img1.t.sinajs.cn/t35/style/images/common/header/logoNew_nocache.png'; //新浪*/

    然后再把图片添加到页面内:<img src="xxx" />

    加载图片没啥好说的,IE6-9/CM/FF/OP/都返回304,预加载成功。

    1.2、测试用new Image()加载css


    new Image().src = 'http://a.tbcdn.cn/p/global/1.0/global-min.css'; //淘宝(1)
    new Image().src = 'http://static.paipaiimg.com/member/activate.css'; //拍拍(2)
    new Image().src = 'http://co.youa.baidu.com/picture/services/base.css'; //有啊(3)
    new Image().src = 'http://img1.t.sinajs.cn/t35/skin/skin_008/skin.css'; //新浪(4)
    // http://auto.sina.com.cn/css/newstyles.css
    // 可以用这个测试IE下Expires设置的时间小于当前时间的情况

    再把css添加到页面内

    这个有区别了:
    CM/OP,都返回304(无论有没有设置Expires)。
    FF, 全部返回了200。
    IE,1/2/4都返回304,而3返回200。对比返回的HTTP-Header可以发现:1/2/4都设置了Expires过期时间,而3没有设置。
    说明IE下缓存需要设置Expires(并且设置的时间要大于当前时间),而FF不支持利用new Image()预加载。

    1.3、测试用new Image()加载js


    new Image().src = 'http://a.tbcdn.cn/s/kissy/1.1.6/kissy-min.js'; //淘宝(1)
    new Image().src = 'http://static.paipaiimg.com/js/pp.noticeBoard.js'; //拍拍(2)
    new Image().src = 'http://co.youa.baidu.com/picture/services/cms_core.js'; //有啊(3)
    new Image().src = 'http://js.t.sinajs.cn/t35/miniblog/static/js/top.js'; //新浪(4)
    new Image().src = 'http://shop.qq.com/act/static/week/fri/bang/day_1_p_0_10.js'; //QQ(5)

    再把js添加到页面内。

    CM/OP,都返回304
    FF,只有5返回了304,也只有5的HTTP-Header最简单(包括:Date、Server、Expires、Cache-Control)。
    另外几个的响应头信息内容都比较多,但也都设置了5里面的这几个。找规律,发现另外几个的响应头都有:Content-Type:text/javascript,而5里面没这个。
    IE,2/5返回了304,1/3/4返回200,对比响应头,应该还是Content-Type影响的,IE里面2/5都没看到Content-Type。
    另外,感谢AndrewZhang(http://www.cnblogs.com/AndyWithPassion/)提到,IE下 image 预加载js在httpwatch下查看content,资源的加载并不是完整的。我这里测试也是如此。貌似有字节限制,测试中2返回的是完整的,5有一部分内容丢失了。所以用new Image加载JS一点都不可取。

    这里总结下:预加载图片用new Image()兼容性没问题。但是css/js只有OP/CM可以,IE/FF基本是无效(这点IE/FF到挺有默契)。

    2、测试用object预加载

    var doc = document,
    	obj = doc.createElement('object');
    	//obj.data = '123.js'; //Ps: 这样写OP下无效(会把data的内容作为object标签里的text node)
    	//obj.setAttribute('data', '123.js'); // img、css、js
    	obj.style.cssText = 'position:absolute;top:-1px;width:1px;height:1px;'; 
    	// obj.style.width = obj.style.height = 0;
    	doc.body.appendChild(obj); // 插入object 标签需要插入到非head部分,以触发加载*/
    	//obj.onload = function(){ alert('loaded') }; // FF/OP/Webkit支持(如果data是图片,IE9也可以)
    

    然后再吧object里面data加载的文件,创建标签加到HTML内测试。

    测试结果:
    FF/OP/CM: 无论是img/js/css,都返回304。
    IE6-8:用object加载img/js/css,会直接Aborted。
    IE9比较特殊:
    IE9加载js/css,先请求并返回HTTP200,再请求并Aborted,这里实际上是请求1次(第2次Aborted了)。
    IE9加载img的情况,先请求并返回HTTP200,再请求返回图片,所以图片需要请求2次。

    查看全文 »