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

实践

  • sublime利用ClosureCompiler和YUICompressor本地压缩

    / 分类: 工具,实践 / 1 Comment

    server端基本靠nodejs来压缩了, 本地也可能因为特殊需求而需要直接压缩js/css, 不同的系统node的兼容不算好, 不好配置统一的环境, 而且有些人也用不到到node. 所以想到了利用基于java的ClosureCompiler和YUICompressor(下面简称CC和YUI).

    写了2个ST的build tool, 源码:
    https://github.com/kairyou/SublimeGoogleClosureCompiler
    https://github.com/kairyou/SublimeYUICompressor
    在ST2/ST3(Windows/Mac)下面测试通过, Linux应该也能跑.
    如果有语法错误可以直接双击console面板的错误行, 就会跳到源文件的对应行.
    直接git clone或下载到ST插件目录就可以了.
    使用时在ST的tool-build system选择CC或YUI后, ctrl+b直接压缩(推荐js使用CC压缩, css使用YUI压缩).

    因为之前用editplus和vim时, 用到了淘宝压缩的cmd, 所以写cmd时copy了大部分代码, 节约了很多时间, 感谢.
    开发中也遇到几个蛋疼的问题, 花了不少功夫才解决了这些问题:
    sublime的build system设计的不够好, 如果console面板错误行没输出文件的绝对路径, 双击错误行不会跳转.
    YUI的输出错误不带路径, 所以需要自己再包一层cmd/bash脚本, 捕获输出并加上文件路径再返回给ST.
    而且YUI返回错误时还附带了一堆java信息, 需要过滤掉.
    另外, Windows下面cmd捕获/修改输出太弱了, 不得不写个hack来存放输出再读取再修改. 有兴趣的可以对比下SublimeYUICompressor/bin下面的cmd和sh文件就明白了.

    另外Windows下面要有%JAVA_HOME%的环境变量, 如果没有需要装JDK, 请查看https://github.com/kairyou/JDK, 里面有快速搭建说明.

  • Mac下配置mnmp环境

    / 分类: 工具,实践 / 9 Comments

    虽然比较喜欢玩下新语言, 但是php还是常会用到的. lnmp很多人都听过, 但是不能用在Mac上面, 另外还有个mnpp但在osx 10.8.3下面跑不起来.
    所以自己手动一步步安装, 整理了方便安装的bash脚本, 暂且叫mnmp吧, 实际上也是Mac+nginx+mysql+php, 也许有点标题党, 见谅见谅~ 不过总体上能为准备装mnmp的同学省掉不少弯路, 因为我参考一些文章安装时也碰到几个问题卡住了.

    安装:

    把: https://github.com/kairyou/mac-bash-scripts的脚本下载下来.
    安装前请确认安装了homebrew, 就不提了. 开始安装:
    bash切换到setup-mnmp.sh目录, 然后执行:sh setup-mnmp.sh 就等着自动安装吧.

    必要的一些配置:


    nginx:
    vim /usr/local/etc/nginx/nginx.conf
    http {...} 里面最后面加上: include vhost/*.conf; (大概是倒数第三行的位置)
    vim /usr/local/etc/nginx/vhost/default.conf , 添加类似下面的内容:

    server {
        listen       8080;
        server_name  dev.local;
        root   /Users/leon/Workspace;
        index  index.html index.htm index.php;
    
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
        #error_page  404 /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {root html;}
        location ~ .*\.(php|php5)?$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
        location / {
            if (!-e $request_filename){
                rewrite ^/sitemap.xml$ /sitemap.php; # rewrite
            }
        }
        access_log off;
    }
    

    sudo sh -c "echo '127.0.0.1 dev.local' >> /etc/hosts"
    上面的nginx配置和命令是绑定http://dev.local作为域名, 绑定到/Users/leon/Workspace目录(域名和目录根据自己的需要修改吧).

    php-fpm:
    vim /usr/local/etc/php/5.6/php-fpm.conf, 找到并修改下面3行, 后面两个是要注释掉的:
    error_log = /tmp/php-fpm.log
    ;user = _www
    ;group = _www
    另外php.ini的路径: /usr/local/etc/php/5.6/php.ini, 如果有额外需求自己修改, 比如:
    date.timezone = Asia/Shanghai
    error_reporting = E_ALL

    mysql:
    基本不需要配置了, 配置文件在/usr/local/opt/mysql/my-new.cnf 如果没有就是 my.cnf.
    默认不需密码, 如果需要可以执行: mysql_secure_installation 一步步来, 本地开发意义不大.

    启动重启service脚本:

    设置权限: chmod +x ./mnmp.sh
    然后运行: ./mnmp.sh start | stop | restart 即可.
    推荐加到profile里面, 比如: echo "alias mnmp='/Users/你的路径/mnmp.sh'" >> ~/.bash_profile
    source ~/.bash_profile
    因为我不需要开机启动, 如果有需要开机启动的可以参考gist.github.com/mystix/3041577最下面的那几行.
    然后就可以直接: mnmp start 这样用了.

    Ps: 如果遇到类似这样的错误: "xxx" failed (13: Permission denied), 需要设定下权限:
    chmod 755 $HOME && chmod 755 $HOME/Documents/

    phpmyadmin:(可选)
    下载: www.phpmyadmin.net/home_page/downloads.php
    解压到nginx的conf指定的目录, config.sample.inc.php重命名为config.inc.php, 修改$cfg['Servers'][$i]['AllowNoPassword'] = true;
    Ps: 如果phpmyadmin报错:The mcrypt extension is missing. 可以关掉mnmp, 执行下:brew install php54-mcrypt
    之后打开: http://dev.local:8080/phpmyadmin 应该就OK了.

  • 解决Mac下SublimeLinter的Unsafe Characters警告

    / 分类: 开发,实践 / 1 Comment

    Mac下编辑JS文件, 如果是中文字符的行会警告: This character may get silently deleted by one or more browsers.

    SublimeLinter 的官方文档http://goo.gl/VYzZ0, 里面也说的含糊不清, 只是告诉要装nodejs或设置sublimelinter_executable_map.
    On Mac OS X, you must install Node.js if you plan to edit Javascript or CSS files that use non-ASCII characters in strings or comments, because JavaScriptCore is not Unicode-aware.
    OS X默认的JavaScriptCore(jsc)不支持非ASCII字符, 所以会报上面的警告, 使用nodejs才行.

    debug了下SublimeLinter的源码, 发现把Package Settings->SublimeLinter->Settings - User加上:
    "sublimelinter_executable_map":
    {
    "javascript": "/Users/leon/.nvm/v0.10.8/bin/node" // which node
    },
    就OK了, 开始还以为要设置"node":"node path", 原来是设置"javascript"..

    没安装nodejs到/usr/local/bin, 如果使用其他编辑器里的jshint/jslint应该也会遇到这个警告, 可以尝试修改node路径来解决.

  • nodejs配合sass监听项目文件变动自动生成css文件

    / 分类: 开发,工具,实践 / No Comments

    以前弄scss只能在ruby下面, nodejs版less.js已经比较成熟, 而sass.js(1)不支持scss(后面作者又去开发Stylus了~), 后面出现的scss-js(2)已经错过时机(支持scss语法有限, 已很久没更新了).
    这大概是导致目前less在国内爆发的一个原因吧. 排除环境依赖影响, 个人感觉sass比less好很多, 相信不少同学也这样认为~
    对比了目前的4种css预处理语法: sass(scss)/less/stylus/closure-stylesheets, 还是更喜欢scss.

    用nodejs写小工具蛮适合的, 但之前苦于sass在nodejs下没有比较好的package. 终于node-sass(3)出现, 目前npm里最好的sass package, 测试了一些scss文件基本都OK, 语法有误时也会返回错误信息.

    基于node-sass写了个小工具, 监听项目目录, 当文件夹里的.scss文件被修改则立即编译成css文件, 使用:
    1. sudo /path/scss.js # 载入已写好的配置, 侦听多个项目;
    推荐这种方法, 把多个项目的配置信息写到 scssConfig.js中, 不需要额外的参数.
    2. sudo /path/scss.js -build # 读取所有的.scss并编译成.css文件;
    3. sudo /path/scss.js -clear # 清除错误日志(如果配置了 scssConfig.js里logDir的路径);
    4. sudo /path/scss.js /path/project1/ /path/lib/ # 临时监听project1目录, lib为.scss里@import的path(无@import,可以省略);

    源码放在: https://github.com/kairyou/f2e-tools/tree/master/scss

    附送使用node-sass时遇到的问题以及解决方法:
    1. error reading values after :
    读取value出错, 可能是颜色错误不是6位或3位, 比如:color:#abcde;
    2. .scss里面写: @charset "UTF-8"; 会报错: top-level blockless directive must be terminated by ';'
    @see: https://github.com/andrew/node-sass/issues/23
    3. error reading values after opacity / progid
    使用: unquote("..."); @see: https://github.com/hcatlin/libsass/issues/72

    文中提到的sass几个package的link:
    1) sass: https://github.com/visionmedia/sass.js
    2) scss: https://github.com/bmavity/scss-js
    3) node-sass: https://github.com/andrew/node-sass

    有了nodejs版, 其他语言(非ruby), 比如PHP的phpsass/scssphp等就可以忽略了~

  • html5 canvas 前端生成缩略图

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

    更新:
    2015/03/02: 解决了Chrome/IE11下面的图片空白问题;
    + 优先用二进制代替base64, 提升性能;
    + before/always 参数, 针对很大的图(>=20M), 缩图时间较长时, 可以设置loading提示.
    2013/08/01: 解决了后面遇到的bug: 图片被压扁(IOS6); 图片被旋转;
    整个源码放在: https://github.com/kairyou/html5-make-thumb
    新方案需要后面实现的, 就是下面的旧版本里的功能(水印/是否强制拉伸以适应目标尺寸等功能).

    w3ctech长沙站交流会, 里面分享的PPT: http://www.slideshare.net/99leon/html5-create-thumbnail

    之前有bug的版本放在分支old里(不推荐使用), 请使用更新的方案~

    2013/01/07:
    11年做的公司的移动页面, 上传图片时缩略图是靠后端生成, 但是随着现在的手机越来越牛X(摄像头比数码相机还厉害~), 图片体积也越来越大.
    一个几M的图, 也许我们只是用来生成一个100*100的小图, 上传到后端再生成缩略图就大大的浪费了, 而且提交表单的等待时间也非长久, 对用户体验也不好.
    普通的web表单, 上传图片靠后端来生成缩略图很平常, 但有了HTML5, 针对移动Web开发可以考虑使用前端生成缩略图了.

    写了个生成缩略图的jquery的插件, 主要参数:

    width: 生成缩略图的宽; height: 生成缩略图的高;
    fill: 图片小于缩略图尺寸时, 是否填充(false: 缩略图宽高自动缩放到适应图片, true: 缩略图尺寸不变)
    background:生成图片填充背景(默认#fff, 设置null时, 背景透明)
    type: 生成图片类型 ('image/jpeg' 或 'image/png')
    size: 生成缩略图方式, 生成缩略图的效果主要参考了CSS3的background-size属性:
      contain: 等比缩放并拉伸, 图片全部显示;
      cover: 等比缩放并拉伸, 图片把容器完全覆盖;
      auto: 图片不拉伸, 居中显示.
    mark: 水印
      文字水印: mark = {padding: 5, height: 18, text: 'test', color: '#000', font: '400 18px Arial'}
      图片水印: mark = {padding: 5, src: 'mark.png', width: 34, height: 45};
    stretch: 小图是否强制拉伸以适应缩略图的尺寸(size = auto/contain时)
    success: 生成缩略图后 callback
    

    大体思路如下:
    首先判断是否支持fileReader(支持fileReader, canvas就不在话下了)
    不支持的话: 不做任何操作, 默认的input type="file"上传, 靠后端生成缩略图.
    支持的情况: input change时, 判断选择的文件是图片, 就创建一个隐藏的canvas, 并把图片画到canvas里,
    因为要生成缩略图, 所以在canvas里画图的时候, 控制剪切坐标和被剪切的宽高就OK了.
    另外可以加上水印, 图片水印或者文字水印加到canvas上面也是比较方便的.
    最后 canvas.toDataURL 转成base64, post到后端(先把input type="file"移除, 再生成个新的input type="hidden"储存图片数据), 后端接收后直接保存为图片就OK了.
    主要用到: FileReader和canvas, 一个用来读取本地图片, 一个用来生成缩略图.

    做移动网页开发的同学可以考虑下.