博客

  • PHP 魔术变量

    所有魔术变量表示的值均区分大小写

    __CLASS__

    表示代码所在类的名字

    // 文件 define.php
    namespace Base
    {
        abstract class Fruit
        {
            public function __construct()
            {
                // 输出 Base\Fruit
                echo __CLASS__;
                echo "\n";
                // 输出 Sub\Apple
                echo get_class($this);
                echo "\n";
            }
    
            public function hello()
            {
                // 输出 Base\Fruit
                echo __CLASS__;
                echo "\n";
            }
        }
    }
    
    namespace Sub
    {
        class Apple extends \Base\Fruit
        {
            public function say()
            {
                // 输出 Sub\Apple
                echo __CLASS__;
                echo "\n";
            }
        }
    }
    
    // 文件 test.php
    require __DIR__ . '/define.php';
    
    $Apple = new Sub\Apple();
    $Apple->hello();
    $Apple->say();
    

    __DIR__

    表示代码所在文件所在的完整目录名,等价于 dirname(__FILE__),不包括末尾的斜杠 /

    // 文件 test.php
    // 输出 test.php 所在目录 /opt/wwwroot/test
    echo __DIR__;
    echo "\n";
    

    __FUNCTION__

    表示代码所在函数的名称

    function foo()
    {
        // 输出函数名 foo
        echo __FUNCTION__;
        echo "\n";
    }
    foo();
    

    __FILE__

    表示代码所在文件的完整路径名

    // 文件 test.php
    // 输出 test.php 所在目录 /opt/wwwroot/test/test.php
    echo __FILE__;
    

    __LINE__

    表示代码所在文件中的行号

    // 文件 test.php
    // 输出代码行号
    echo __LINE__;
    

    __METHOD__

    表示代码所在函数的名称

    // 文件 define.php
    namespace Base;
    
    function foo()
    {
        // 输出函数名 Base\foo
        echo __FUNCTION__;
        echo "\n";
        // 输出函数名 Base\foo
        echo __METHOD__;
        echo "\n";
    }
    
    class Foo
    {
        public function bar()
        {
            // 输出函数名 bar
            echo __FUNCTION__;
            echo "\n";
            // 输出方法名 Base\Foo::bar
            echo __METHOD__;
            echo "\n";
        }
    
        public static function staticBar()
        {
            // 输出函数名 staticBar
            echo __FUNCTION__;
            echo "\n";
            // 输出方法名 Base\Foo::staticBar
            echo __METHOD__;
            echo "\n";
        }
    }
    
    // 文件 test.php
    require __DIR__ . '/define.php';
    
    Base\foo();
    
    $foo = new Base\Foo();
    $foo->bar();
    $foo->staticBar();
    

    __TRAIT__

    表示代码所在 trait 的名称,包含完整限定的 namespace

    // 文件 define.php
    namespace Base
    {
        trait Wheel
        {
            public function roll()
            {
                // 输出 Base\Wheel
                echo __TRAIT__;
                echo "\n";
                // 输出 Sub\Car
                echo __CLASS__;
                echo "\n";
            }
        }
    }
    
    namespace Sub
    {
        class Car
        {
            use \Base\Wheel;
    
            public function start()
            {
                $this->roll();
                // 输出空字符串
                echo __TRAIT__;
                echo "\n";
                // 输出 Sub\Car
                echo __CLASS__;
                echo "\n";
            }
        }
    }
    
    // 文件 test.php
    require __DIR__ . '/define.php';
    
    $car = new Sub\Car();
    $car->start();
    

    __NAMESPACE__

    表示当前代码所在命名空间

    namespace Vendor\Util;
    
    // 输出命名空间 Vendor\Util
    echo __NAMESPACE__;
    echo "\n";
    
    function foo()
    {
        // 输出命名空间 Vendor\Util
        echo __NAMESPACE__;
        echo "\n";
    }
    
    foo();
    
  • mysqldump 命令

    mysqldump 常用操作命令

  • PHP 超全局变量

    PHP 超全局变量(Superglobal)是自动化的全局变量,在任何作用域都可以使用,不需要使用 global 关键字声明 $variable。

    变量名 说明
    $GLOBALS 引用了全部全局变量的数组,如 $GLOBALS[‘_GET’]、$GLOBALS[‘_POST’] 等等,以及一个对自身 GLOBALS 的引用。
    $_COOKIE PHP 解析浏览器请求携带的 cookie 生成的数组
    $_ENV $_ENV 包含当前的环境变量,与 phpinfo() 输出的 Environment 表格一致,但默认为空,通过 getenv() 可以获取到指定的环境变量
    $_FILES $_FILES 包含当前 HTTP POST 上传的文件列表。
    $_GET $_GET 包含 URL 参数列表
    $_POST $_POST 包含 POST 参数列表
    $_REQUEST 可能包含 $_GET、$_POST、$_COOKIE,不包含 $_FILES。 request_order 控制包含的参数列表。
    $_SERVER 包含服务器和脚本执行环境信息,比如 HTTP 请求头信息、脚本信息,不同服务器信息会有不同。
    $_SESSION 包含当前 SESSION 变量列表。需要先调用 session_start() 开启会话。
    $argc 以命令行(CLI)形式运行 PHP 脚本,传递给脚本的参数总数。需要开启 register_argc_argv
    $argv 以命令行(CLI)形式运行 PHP 脚本,传递给脚本的参数数组。需要开启 register_argc_argv
    $http_response_header 保存当前作用域下最新 HTTP 请求的的响应头信息
    $php_errormsg 开启 track_errors 时,PHP 执行的最新错误信息

    $GLOBALS

    $name = 'Seven';
    function hello() {
    	$name = 'Eight';
    	echo "local name is $name"; // Eight
    	echo "\n",
    	echo "global name is "
    		. $GLOBALS['name']; // Seven
    }

    php.ini 中的 register_globals(在 PHP 5.4.0 中被移除)表示将 globals 变量中的成员自动注册为全局变量。

    // 设置 register_globals = on;
    $_GET['name'] = 'Seven';
    $name === $_GET['name']; // true
    
    // 设置 register_globals = off;
    // 不会将 global 变量中的成员自动注册为全局变量
    

    $_COOKIE

    $_COOKIE 包含当前请求的 cookie 列表,在请求中使用 setcookie 再调用 $_COOKIE 不会立刻获得相同的值。

    // 设置 cookie
    setcookie('name', 'Seven');
    // 获取 cookie
    $_COOKIE['name'] // 不能立刻获得设置的 cookie
    // 因为 $_COOKIE 存放的是当前浏览器发送到服务器的 cookie
    // 其次, setcookie 不一定设置 cookie 成功
    

    $_ENV

    默认的 $_ENV 数组为空,是因为 variables_order可能没有包含 E —— _ENV。

    CEGPS 分别对应 $_COOKIE、$_ENV、$_GET、$_POST、$_SERVER,variables_order 的默认值没有包含 E,因此不会设置超全局变量 $_ENV。variables_order 为空则不会设置任何超全局变量。

    $_FILES

    $_FILES 包含的是文件列表,是一个二维数组,一般结合 move_uploaded_file() 将上传的文件存放到需要的位置,类似结构如下:

    array(
    	// myfile 是 input 表单的 name 属性
    	'myfile' => array(
    		'name' => '', // 文件的原名称
    		'type' => '', // 文件的 MIME 类型
    		'size' => '', // 文件的字节大小
    		'tmp_name' => '', // 存放的包含路径的临时文件名
    		'error' => '', // 上传的错误代码
    	);
    );
    // 如果 php 对 upload_tmp_dir 没有写入权限,
    // 则上传的文件无法存放在文件系统上
    

    $_GET

    $_POST

    $_POST 只解析类似 URL 参数列表结构的 POST BODY 中的数据,比如将 name=Seven 解析为 $_POST[‘name’] = Seven,调用 AJAX XMLHttpRequest 的 send() 方法传递的字符串一般类似 name=Seven&age=20。
    $_POST 不能解析文件流,也不能解析 send() 的 JSON 字符串,需要使用 @file_get_contents(‘php://input’) 获取 POST 的内容,再进行解析——比如 json_decode 获得 JSON,base64_decode 获得二进制流。

    $_REQUEST

    // request_order = 'GP'
    // 表示 $_REQUEST 包含 $_GET、$_POST 内容
    // 同名 key 后者覆盖前者
    
    // request_order = 'GPC'
    // 表示 $_REQUEST 包含 $_GET、$_POST、$_COOKIE 内容
    

    $_SERVER

    $_SERVER['HTTP_HOST'] // HTTP 请求的主机
    $_SERVER['HTTP_USER_AGENT'] // HTTP 请求 User-Agent
    $_SERVER['HTTP_COOKIE'] // HTTP 请求 COOKIE
    $_SERVER['HTTP_ACCEPT_LANGUAGE'] // 可以接受的语言列表
    // 与 HTTP 请求相关的信息大部分以 HTTP_ 开始
    

    get_defined_functions

    返回一个二维数组,包含定义的函数名列表:区分 internal、user。

    // get_defined_functions 返回值
    array (
    	'internal' => array (
    		'zend_version',
    		'func_num_args',
    		'func_get_arg',
    		// ...
    	),
    	'user' => array (
    		'get_client_ip',
    		'get_client_device',
    		'get_client_browser',
    	),
    );
    

    get_defined_constants

    返回定义的常量数组,常量名作为 key,常量值作为 value。

    get_defined_vars

    返回定义的变量数组。

    extract

    将数组的成员导入到当前作用域。

    $a = array(
    	'b' => 'b',
    );
    extract($a);
    echo $b; // 输出字符串 b
    // 如果数组的成员与当前变量名重名会发生什么?
    
  • 网页加载优化 DNS 预解析

    网站功能越来越复杂,除了主站域名、CDN域名、图片域名、接口域名,还可能有第三方分享、OAuth认证。

    <!-- 1, 通过设置 header 或者 meta 标签
        设置 x-dns-prefetch-control 为 on -->
    <meta http-equiv="x-dns-prefetch-control" content="on">
    <!-- 2, 通过 link 标签指定要预解析的域名 -->
    <link rel="dns-prefetch" href="//s.zhengxianjun.com">
    

    附:DNS解析过程

  • 对比jQuery和Zepto

    对比两者到2016年3月8号最新的版本 jQuery 2.2.1 http://jquery.com/ 和 Zepto 1.1.6 http://zeptojs.com/

    简单对比

    jQuery 2.2.1 Zepto 1.1.6
    文件大小
    浏览器支持
  • Internet Explorer 9+
  • Chrome, Edge, Firefox (Current – 1) or Current
  • Safari 5.1+
  • Opera 12.1x, (Current – 1) or Current
  • iOS 6.1+
  • Android 2.3, 4.0+
  • Primary (100% support)

  • Safari 6+ (Mac)
  • Chrome 30+ (Windows, Mac, Android, iOS, Linux, Chrome OS)
  • Firefox 24+ (Windows, Mac, Android, Linux, Firefox OS)
  • iOS 5+ Safari
  • Android 2.3+ Browser
  • Internet Explorer 10+ (Windows, Windows Phone)
  • Secondary targets (fmenuly or mostly supported)

  • iOS 3+ Safari
  • Chrome <30
  • Firefox 4+
  • Safari <6
  • Android Browser 2.2
  • Opera 10+
  • webOS 1.4.5+ Browser
  • BlackBerry Tablet OS 1.0.7+ Browser
  • Amazon Silk 1.0+
  • Other WebKit-based browsers/runtimes
  • 成员函数数量
    工具函数数量
    授权协议 无特殊说明均为MIT MIT

    详细对比

  • 使用JavaScript库jQuery.qrcode生成二维码

    在线二维码生成器

    使用开源二维码库 jquery.qrcode.js (https://github.com/jeromeetienne/jquery-qrcode)在浏览器上直接生成二维码,不需要后端程序支持。该库对中文不友好。

    生成二维码

    $('#qrcode')
    	.empty(()
    	.qrcode({
    		render: window.CanvasPattern ? 'canvas' : 'table',
    		width: 300,
    		height: 300,
    		text: 'blog.zhengxianjun.com'
    	});

    jquery.qrcode 核心是 qrcode.js,jquery.qrcode.js 将其封装成了 jQuery 扩展,封装代码很少。以表格 table 模式可以使在不支持 canvas 的浏览器下也能正常运行。

    二维码配置

    var options = {
    	render        : "canvas", // 渲染方式 table|canvas
    	width         : 256, // 二维码宽度
    	height        : 256, // 二维码高度
    	typeNumber    : -1, // 计算模式
    	correctLevel  : QRErrorCorrectLevel.H, // 纠错等级
    	background    : "#ffffff", // 背景色
    	foreground    : "#000000" // 前景色
    };

    中文二维码

    jquery.qrcode 使用 charCodeAt 转码,charCodeAt 使用的 2 位的 Unicode 编码,中文字符采用 3 位的 UTF8 编码,两者长度不匹配,导致生成二维码的源字符流有误。

    需要先将 UTF16 转 UTF8,实现来自 http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt

    function utf16to8(str) {
    	var out, i, len, c;
    	out = '';
    	len = str.length;
    	for(i = 0; i < len; i++) { c = str.charCodeAt(i); if ((c >= 0x0001) && (c <= 0x007F)) { out += str.charAt(i); } else if (c > 0x07FF) {
    			out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
    			out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));
    			out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
    		} else {
    			out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));
    			out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
    		}
    	}
    	return out;
    }
  • 微信 WebView User-Agent

    Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12H143 MicroMessenger/6.2.2 NetType/WIFI Language/zh_CN

  • AngularJS 取消对 HTML 转义

    AngularJS 默认情况下会对输出的变量进行HTML转义。

    <div class="feature_brief">{{item.brief}}</div>
    

    使用 trustHTML 过滤器信任字段,取消对 HTML 转义。

    <div ng-bind-html="item.brief|trustHtml"></div>
    

    AngularJS 代码如下:

    app.filter('trustHtml', function($sce) {
    	return function(input) {
    		return $sce.trustAsHtml(input);
    	};
    });
    
  • HTTP Content-Type 对照表

    Content Type 对照表

    Content-Type(Mime-Type) 扩展名 Content-Type(Mime-Type) 扩展名
    application/fractals .fif application/futuresplash .spl
    application/hta .hta application/mac-binhex40 .hqx
    application/msaccess .mdb application/msword .wiz
    application/octet-stream .* application/pdf .pdf
    application/pics-rules .prf application/pkcs10 .p10
    application/pkcs7-mime .p7m application/pkcs7-signature .p7s
    application/pkix-crl .crl application/postscript .ai
    application/rat-file .rat application/sdp .sdp
    application/smil .smil application/streamingmedia .ssm
    application/vnd.adobe.edn .edn application/vnd.adobe.pdx .pdx
    application/vnd.adobe.rmf .rmf application/vnd.adobe.workflow .awf
    application/vnd.adobe.xdp .xdp application/vnd.adobe.xfd .xfd
    application/vnd.adobe.xfdf .xfdf application/vnd.android.package-archive .apk
    application/vnd.fdf .fdf application/vnd.iphone .ipa
    application/vnd.ms-excel .xls application/vnd.ms-pki.certstore .sst
    application/vnd.ms-pki.pko .pko application/vnd.ms-pki.seccat .cat
    application/vnd.ms-pki.stl .stl application/vnd.ms-powerpoint .pwz
    application/vnd.ms-project .mpx application/vnd.ms-wpl .wpl
    application/vnd.rn-realmedia .rm application/vnd.rn-realmedia-secure .rms
    application/vnd.rn-realmedia-vbr .rmvb application/vnd.rn-realplayer .rnx
    application/vnd.rn-realsystem-rjs .rjs application/vnd.rn-realsystem-rjt .rjt
    application/vnd.rn-realsystem-rmj .rmj application/vnd.rn-realsystem-rmx .rmx
    application/vnd.rn-recording .rec application/vnd.rn-rn_music_package .rmp
    application/vnd.rn-rsml .rsml application/vnd.symbian.install .sisx
    application/vnd.visio .vtx application/x-001 .001
    application/x-301 .301 application/x-906 .906
    application/x-a11 .a11 application/x-anv .anv
    application/x-bittorrent .torrent application/x-bmp .bmp
    application/x-bot .bot application/x-c4t .c4t
    application/x-c90 .c90 application/x-cals .cal
    application/x-cdr .cdr application/x-cel .cel
    application/x-cgm .cgm application/x-cit .cit
    application/x-cmp .cmp application/x-cmx .cmx
    application/x-cot .cot application/x-csi .csi
    application/x-cut .cut application/x-dbf .dbf
    application/x-dbm .dbm application/x-dbx .dbx
    application/x-dcx .dcx application/x-dgn .dgn
    application/x-dib .dib application/x-drw .drw
    application/x-dwf .dwf application/x-dwg .dwg
    application/x-dxb .dxb application/x-dxf .dxf
    application/x-ebx .etd application/x-emf .emf
    application/x-epi .epi application/x-frm .frm
    application/x-g4 .ig4 application/x-gbr .gbr
    application/x-gl2 .gl2 application/x-gp4 .gp4
    application/x-hgl .hgl application/x-hmr .hmr
    application/x-hpgl .hpg application/x-hpl .hpl
    application/x-hrf .hrf application/x-icb .icb
    application/x-icq .uin application/x-iff .iff
    application/x-igs .igs application/x-img .img
    application/x-internet-signup .isp application/x-iphone .iii
    application/x-javascript .mocha application/x-laplayer-reg .lar
    application/x-latex .latex application/x-lbm .lbm
    application/x-ltr .ltr application/x-mac .mac
    application/x-mi .mi application/x-mil .mil
    application/x-mmxp .mxp application/x-ms-wmd .wmd
    application/x-ms-wmz .wmz application/x-msdownload .exe
    application/x-netcdf .cdf application/x-nrf .nrf
    application/x-out .out application/x-pc5 .pc5
    application/x-pci .pci application/x-pcl .pcl
    application/x-pcx .pcx application/x-perl .pl
    application/x-pgl .pgl application/x-pic .pic
    application/x-pkcs12 .pfx application/x-pkcs7-certificates .spc
    application/x-pkcs7-certreqresp .p7r application/x-plt .plt
    application/x-ppm .ppm application/x-pr .pr
    application/x-prn .prn application/x-prt .prt
    application/x-ps .ps application/x-ptn .ptn
    application/x-ras .ras application/x-red .red
    application/x-rgb .rgb application/x-rlc .rlc
    application/x-rle .rle application/x-sam .sam
    application/x-sat .sat application/x-sdw .sdw
    application/x-shockwave-flash .swf application/x-silverlight-app .xap
    application/x-slb .slb application/x-sld .sld
    application/x-smk .smk application/x-stuffit .sit
    application/x-sty .sty application/x-tdf .tdf
    application/x-tg4 .tg4 application/x-tga .tga
    application/x-troff-man .man application/x-vda .vda
    application/x-vpeg005 .vpg application/x-wb1 .wb1
    application/x-wb2 .wb2 application/x-wb3 .wb3
    application/x-wk3 .wk3 application/x-wk4 .wk4
    application/x-wkq .wkq application/x-wks .wks
    application/x-wmf .wmf application/x-wp6 .wp6
    application/x-wpd .wpd application/x-wpg .wpg
    application/x-wq1 .wq1 application/x-wr1 .wr1
    application/x-wri .wri application/x-wrk .wrk
    application/x-ws .ws2 application/x-x509-ca-cert .der
    application/x-x_b .x_b application/x-x_t .x_t
    application/x-xlw .xlw application/x-xwd .xwd
    audio/aiff .aiff audio/basic .snd
    audio/mid .rmi audio/mp1 .mp1
    audio/mp2 .mp2 audio/mp3 .mp3
    audio/mpegurl .m3u audio/rn-mpeg .mpga
    audio/scpls .xpl audio/vnd.rn-realaudio .ra
    audio/wav .wav audio/x-la-lms .lmsff
    audio/x-liquid-file .la1 audio/x-liquid-secure .lavs
    audio/x-mei-aac .acp audio/x-ms-wax .wax
    audio/x-ms-wma .wma audio/x-musicnet-download .mnd
    audio/x-musicnet-stream .mns audio/x-pn-realaudio .rmm
    audio/x-pn-realaudio-plugin .rpm drawing/907 .907
    drawing/x-slk .slk drawing/x-top .top
    image/fax .fax image/gif .gif
    image/jpeg .jpg image/pnetvue .net
    image/png .png image/tiff .tiff
    image/vnd.rn-realpix .rp image/vnd.wap.wbmp .wbmp
    image/x-icon .ico java/* .java
    java/class .class message/rfc822 .nws
    text/asa .asa text/asp .asp
    text/css .css text/h323 .323
    text/html .xhtml text/iuls .uls
    text/plain .txt text/scriptlet .wsc
    text/vnd.rn-realtext .rt text/vnd.rn-realtext3d .r3t
    text/vnd.wap.wml .wml text/webviewhtml .htt
    text/x-component .htc text/x-ms-odc .odc
    text/x-vcard .vcf text/xml .xslt
    video/avi .avi video/mpeg .mpv2
    video/mpeg4 .mp4 video/mpg .mpv
    video/vnd.rn-realvideo .rv video/x-ivf .IVF
    video/x-mpeg .mps video/x-mpg .mpa
    video/x-ms-asf .asx video/x-ms-wm .wm
    video/x-ms-wmv .wmv video/x-ms-wmx .wmx
    video/x-ms-wvx .wvx video/x-sgi-movie .movie

    PHP 数组

    $ar_type = array(
    	'*' => 'application/octet-stream',
    	'001' => 'application/x-001',
    	'301' => 'application/x-301',
    	'323' => 'text/h323',
    	'906' => 'application/x-906',
    	'907' => 'drawing/907',
    	'IVF' => 'video/x-ivf',
    	'a11' => 'application/x-a11',
    	'acp' => 'audio/x-mei-aac',
    	'ai' => 'application/postscript',
    	'aif' => 'audio/aiff',
    	'aifc' => 'audio/aiff',
    	'aiff' => 'audio/aiff',
    	'anv' => 'application/x-anv',
    	'apk' => 'application/vnd.android.package-archive',
    	'asa' => 'text/asa',
    	'asf' => 'video/x-ms-asf',
    	'asp' => 'text/asp',
    	'asx' => 'video/x-ms-asf',
    	'au' => 'audio/basic',
    	'avi' => 'video/avi',
    	'awf' => 'application/vnd.adobe.workflow',
    	'biz' => 'text/xml',
    	'bmp' => 'application/x-bmp',
    	'bot' => 'application/x-bot',
    	'c4t' => 'application/x-c4t',
    	'c90' => 'application/x-c90',
    	'cal' => 'application/x-cals',
    	'cat' => 'application/vnd.ms-pki.seccat',
    	'cdf' => 'application/x-netcdf',
    	'cdr' => 'application/x-cdr',
    	'cel' => 'application/x-cel',
    	'cer' => 'application/x-x509-ca-cert',
    	'cg4' => 'application/x-g4',
    	'cgm' => 'application/x-cgm',
    	'cit' => 'application/x-cit',
    	'class' => 'java/class',
    	'cml' => 'text/xml',
    	'cmp' => 'application/x-cmp',
    	'cmx' => 'application/x-cmx',
    	'cot' => 'application/x-cot',
    	'crl' => 'application/pkix-crl',
    	'crt' => 'application/x-x509-ca-cert',
    	'csi' => 'application/x-csi',
    	'css' => 'text/css',
    	'cut' => 'application/x-cut',
    	'dbf' => 'application/x-dbf',
    	'dbm' => 'application/x-dbm',
    	'dbx' => 'application/x-dbx',
    	'dcd' => 'text/xml',
    	'dcx' => 'application/x-dcx',
    	'der' => 'application/x-x509-ca-cert',
    	'dgn' => 'application/x-dgn',
    	'dib' => 'application/x-dib',
    	'dll' => 'application/x-msdownload',
    	'doc' => 'application/msword',
    	'dot' => 'application/msword',
    	'drw' => 'application/x-drw',
    	'dtd' => 'text/xml',
    	'dwf' => 'application/x-dwf',
    	'dwg' => 'application/x-dwg',
    	'dxb' => 'application/x-dxb',
    	'dxf' => 'application/x-dxf',
    	'edn' => 'application/vnd.adobe.edn',
    	'emf' => 'application/x-emf',
    	'eml' => 'message/rfc822',
    	'ent' => 'text/xml',
    	'epi' => 'application/x-epi',
    	'eps' => 'application/x-ps',
    	'etd' => 'application/x-ebx',
    	'exe' => 'application/x-msdownload',
    	'fax' => 'image/fax',
    	'fdf' => 'application/vnd.fdf',
    	'fif' => 'application/fractals',
    	'fo' => 'text/xml',
    	'frm' => 'application/x-frm',
    	'g4' => 'application/x-g4',
    	'gbr' => 'application/x-gbr',
    	'gif' => 'image/gif',
    	'gl2' => 'application/x-gl2',
    	'gp4' => 'application/x-gp4',
    	'hgl' => 'application/x-hgl',
    	'hmr' => 'application/x-hmr',
    	'hpg' => 'application/x-hpgl',
    	'hpl' => 'application/x-hpl',
    	'hqx' => 'application/mac-binhex40',
    	'hrf' => 'application/x-hrf',
    	'hta' => 'application/hta',
    	'htc' => 'text/x-component',
    	'htm' => 'text/html',
    	'html' => 'text/html',
    	'htt' => 'text/webviewhtml',
    	'htx' => 'text/html',
    	'icb' => 'application/x-icb',
    	'ico' => 'image/x-icon',
    	'iff' => 'application/x-iff',
    	'ig4' => 'application/x-g4',
    	'igs' => 'application/x-igs',
    	'iii' => 'application/x-iphone',
    	'img' => 'application/x-img',
    	'ins' => 'application/x-internet-signup',
    	'ipa' => 'application/vnd.iphone',
    	'isp' => 'application/x-internet-signup',
    	'java' => 'java/*',
    	'jfif' => 'image/jpeg',
    	'jpe' => 'image/jpeg',
    	'jpeg' => 'image/jpeg',
    	'jpg' => 'image/jpeg',
    	'js' => 'application/x-javascript',
    	'jsp' => 'text/html',
    	'la1' => 'audio/x-liquid-file',
    	'lar' => 'application/x-laplayer-reg',
    	'latex' => 'application/x-latex',
    	'lavs' => 'audio/x-liquid-secure',
    	'lbm' => 'application/x-lbm',
    	'lmsff' => 'audio/x-la-lms',
    	'ls' => 'application/x-javascript',
    	'ltr' => 'application/x-ltr',
    	'm1v' => 'video/x-mpeg',
    	'm2v' => 'video/x-mpeg',
    	'm3u' => 'audio/mpegurl',
    	'm4e' => 'video/mpeg4',
    	'mac' => 'application/x-mac',
    	'man' => 'application/x-troff-man',
    	'math' => 'text/xml',
    	'mdb' => 'application/msaccess',
    	'mfp' => 'application/x-shockwave-flash',
    	'mht' => 'message/rfc822',
    	'mhtml' => 'message/rfc822',
    	'mi' => 'application/x-mi',
    	'mid' => 'audio/mid',
    	'midi' => 'audio/mid',
    	'mil' => 'application/x-mil',
    	'mml' => 'text/xml',
    	'mnd' => 'audio/x-musicnet-download',
    	'mns' => 'audio/x-musicnet-stream',
    	'mocha' => 'application/x-javascript',
    	'movie' => 'video/x-sgi-movie',
    	'mp1' => 'audio/mp1',
    	'mp2' => 'audio/mp2',
    	'mp2v' => 'video/mpeg',
    	'mp3' => 'audio/mp3',
    	'mp4' => 'video/mpeg4',
    	'mpa' => 'video/x-mpg',
    	'mpd' => 'application/vnd.ms-project',
    	'mpe' => 'video/x-mpeg',
    	'mpeg' => 'video/mpg',
    	'mpg' => 'video/mpg',
    	'mpga' => 'audio/rn-mpeg',
    	'mpp' => 'application/vnd.ms-project',
    	'mps' => 'video/x-mpeg',
    	'mpt' => 'application/vnd.ms-project',
    	'mpv' => 'video/mpg',
    	'mpv2' => 'video/mpeg',
    	'mpw' => 'application/vnd.ms-project',
    	'mpx' => 'application/vnd.ms-project',
    	'mtx' => 'text/xml',
    	'mxp' => 'application/x-mmxp',
    	'net' => 'image/pnetvue',
    	'nrf' => 'application/x-nrf',
    	'nws' => 'message/rfc822',
    	'odc' => 'text/x-ms-odc',
    	'out' => 'application/x-out',
    	'p10' => 'application/pkcs10',
    	'p12' => 'application/x-pkcs12',
    	'p7b' => 'application/x-pkcs7-certificates',
    	'p7c' => 'application/pkcs7-mime',
    	'p7m' => 'application/pkcs7-mime',
    	'p7r' => 'application/x-pkcs7-certreqresp',
    	'p7s' => 'application/pkcs7-signature',
    	'pc5' => 'application/x-pc5',
    	'pci' => 'application/x-pci',
    	'pcl' => 'application/x-pcl',
    	'pcx' => 'application/x-pcx',
    	'pdf' => 'application/pdf',
    	'pdx' => 'application/vnd.adobe.pdx',
    	'pfx' => 'application/x-pkcs12',
    	'pgl' => 'application/x-pgl',
    	'pic' => 'application/x-pic',
    	'pko' => 'application/vnd.ms-pki.pko',
    	'pl' => 'application/x-perl',
    	'plg' => 'text/html',
    	'pls' => 'audio/scpls',
    	'plt' => 'application/x-plt',
    	'png' => 'image/png',
    	'pot' => 'application/vnd.ms-powerpoint',
    	'ppa' => 'application/vnd.ms-powerpoint',
    	'ppm' => 'application/x-ppm',
    	'pps' => 'application/vnd.ms-powerpoint',
    	'ppt' => 'application/vnd.ms-powerpoint',
    	'pr' => 'application/x-pr',
    	'prf' => 'application/pics-rules',
    	'prn' => 'application/x-prn',
    	'prt' => 'application/x-prt',
    	'ps' => 'application/x-ps',
    	'ptn' => 'application/x-ptn',
    	'pwz' => 'application/vnd.ms-powerpoint',
    	'r3t' => 'text/vnd.rn-realtext3d',
    	'ra' => 'audio/vnd.rn-realaudio',
    	'ram' => 'audio/x-pn-realaudio',
    	'ras' => 'application/x-ras',
    	'rat' => 'application/rat-file',
    	'rdf' => 'text/xml',
    	'rec' => 'application/vnd.rn-recording',
    	'red' => 'application/x-red',
    	'rgb' => 'application/x-rgb',
    	'rjs' => 'application/vnd.rn-realsystem-rjs',
    	'rjt' => 'application/vnd.rn-realsystem-rjt',
    	'rlc' => 'application/x-rlc',
    	'rle' => 'application/x-rle',
    	'rm' => 'application/vnd.rn-realmedia',
    	'rmf' => 'application/vnd.adobe.rmf',
    	'rmi' => 'audio/mid',
    	'rmj' => 'application/vnd.rn-realsystem-rmj',
    	'rmm' => 'audio/x-pn-realaudio',
    	'rmp' => 'application/vnd.rn-rn_music_package',
    	'rms' => 'application/vnd.rn-realmedia-secure',
    	'rmvb' => 'application/vnd.rn-realmedia-vbr',
    	'rmx' => 'application/vnd.rn-realsystem-rmx',
    	'rnx' => 'application/vnd.rn-realplayer',
    	'rp' => 'image/vnd.rn-realpix',
    	'rpm' => 'audio/x-pn-realaudio-plugin',
    	'rsml' => 'application/vnd.rn-rsml',
    	'rt' => 'text/vnd.rn-realtext',
    	'rtf' => 'application/msword',
    	'rv' => 'video/vnd.rn-realvideo',
    	'sam' => 'application/x-sam',
    	'sat' => 'application/x-sat',
    	'sdp' => 'application/sdp',
    	'sdw' => 'application/x-sdw',
    	'sis' => 'application/vnd.symbian.install',
    	'sisx' => 'application/vnd.symbian.install',
    	'sit' => 'application/x-stuffit',
    	'slb' => 'application/x-slb',
    	'sld' => 'application/x-sld',
    	'slk' => 'drawing/x-slk',
    	'smi' => 'application/smil',
    	'smil' => 'application/smil',
    	'smk' => 'application/x-smk',
    	'snd' => 'audio/basic',
    	'sol' => 'text/plain',
    	'sor' => 'text/plain',
    	'spc' => 'application/x-pkcs7-certificates',
    	'spl' => 'application/futuresplash',
    	'spp' => 'text/xml',
    	'ssm' => 'application/streamingmedia',
    	'sst' => 'application/vnd.ms-pki.certstore',
    	'stl' => 'application/vnd.ms-pki.stl',
    	'stm' => 'text/html',
    	'sty' => 'application/x-sty',
    	'svg' => 'text/xml',
    	'swf' => 'application/x-shockwave-flash',
    	'tdf' => 'application/x-tdf',
    	'tg4' => 'application/x-tg4',
    	'tga' => 'application/x-tga',
    	'tif' => 'image/tiff',
    	'tiff' => 'image/tiff',
    	'tld' => 'text/xml',
    	'top' => 'drawing/x-top',
    	'torrent' => 'application/x-bittorrent',
    	'tsd' => 'text/xml',
    	'txt' => 'text/plain',
    	'uin' => 'application/x-icq',
    	'uls' => 'text/iuls',
    	'vcf' => 'text/x-vcard',
    	'vda' => 'application/x-vda',
    	'vdx' => 'application/vnd.visio',
    	'vml' => 'text/xml',
    	'vpg' => 'application/x-vpeg005',
    	'vsd' => 'application/vnd.visio',
    	'vss' => 'application/vnd.visio',
    	'vst' => 'application/vnd.visio',
    	'vsw' => 'application/vnd.visio',
    	'vsx' => 'application/vnd.visio',
    	'vtx' => 'application/vnd.visio',
    	'vxml' => 'text/xml',
    	'wav' => 'audio/wav',
    	'wax' => 'audio/x-ms-wax',
    	'wb1' => 'application/x-wb1',
    	'wb2' => 'application/x-wb2',
    	'wb3' => 'application/x-wb3',
    	'wbmp' => 'image/vnd.wap.wbmp',
    	'wiz' => 'application/msword',
    	'wk3' => 'application/x-wk3',
    	'wk4' => 'application/x-wk4',
    	'wkq' => 'application/x-wkq',
    	'wks' => 'application/x-wks',
    	'wm' => 'video/x-ms-wm',
    	'wma' => 'audio/x-ms-wma',
    	'wmd' => 'application/x-ms-wmd',
    	'wmf' => 'application/x-wmf',
    	'wml' => 'text/vnd.wap.wml',
    	'wmv' => 'video/x-ms-wmv',
    	'wmx' => 'video/x-ms-wmx',
    	'wmz' => 'application/x-ms-wmz',
    	'wp6' => 'application/x-wp6',
    	'wpd' => 'application/x-wpd',
    	'wpg' => 'application/x-wpg',
    	'wpl' => 'application/vnd.ms-wpl',
    	'wq1' => 'application/x-wq1',
    	'wr1' => 'application/x-wr1',
    	'wri' => 'application/x-wri',
    	'wrk' => 'application/x-wrk',
    	'ws' => 'application/x-ws',
    	'ws2' => 'application/x-ws',
    	'wsc' => 'text/scriptlet',
    	'wsdl' => 'text/xml',
    	'wvx' => 'video/x-ms-wvx',
    	'x_b' => 'application/x-x_b',
    	'x_t' => 'application/x-x_t',
    	'xap' => 'application/x-silverlight-app',
    	'xdp' => 'application/vnd.adobe.xdp',
    	'xdr' => 'text/xml',
    	'xfd' => 'application/vnd.adobe.xfd',
    	'xfdf' => 'application/vnd.adobe.xfdf',
    	'xhtml' => 'text/html',
    	'xls' => 'application/vnd.ms-excel',
    	'xlw' => 'application/x-xlw',
    	'xml' => 'text/xml',
    	'xpl' => 'audio/scpls',
    	'xq' => 'text/xml',
    	'xql' => 'text/xml',
    	'xquery' => 'text/xml',
    	'xsd' => 'text/xml',
    	'xsl' => 'text/xml',
    	'xslt' => 'text/xml',
    	'xwd' => 'application/x-xwd',
    );
    

    JSON 字符串

    {"*":"application\/octet-stream","001":"application\/x-001","301":"application\/x-301","323":"text\/h323","906":"application\/x-906","907":"drawing\/907","IVF":"video\/x-ivf","a11":"application\/x-a11","acp":"audio\/x-mei-aac","ai":"application\/postscript","aif":"audio\/aiff","aifc":"audio\/aiff","aiff":"audio\/aiff","anv":"application\/x-anv","apk":"application\/vnd.android.package-archive","asa":"text\/asa","asf":"video\/x-ms-asf","asp":"text\/asp","asx":"video\/x-ms-asf","au":"audio\/basic","avi":"video\/avi","awf":"application\/vnd.adobe.workflow","biz":"text\/xml","bmp":"application\/x-bmp","bot":"application\/x-bot","c4t":"application\/x-c4t","c90":"application\/x-c90","cal":"application\/x-cals","cat":"application\/vnd.ms-pki.seccat","cdf":"application\/x-netcdf","cdr":"application\/x-cdr","cel":"application\/x-cel","cer":"application\/x-x509-ca-cert","cg4":"application\/x-g4","cgm":"application\/x-cgm","cit":"application\/x-cit","class":"java\/class","cml":"text\/xml","cmp":"application\/x-cmp","cmx":"application\/x-cmx","cot":"application\/x-cot","crl":"application\/pkix-crl","crt":"application\/x-x509-ca-cert","csi":"application\/x-csi","css":"text\/css","cut":"application\/x-cut","dbf":"application\/x-dbf","dbm":"application\/x-dbm","dbx":"application\/x-dbx","dcd":"text\/xml","dcx":"application\/x-dcx","der":"application\/x-x509-ca-cert","dgn":"application\/x-dgn","dib":"application\/x-dib","dll":"application\/x-msdownload","doc":"application\/msword","dot":"application\/msword","drw":"application\/x-drw","dtd":"text\/xml","dwf":"application\/x-dwf","dwg":"application\/x-dwg","dxb":"application\/x-dxb","dxf":"application\/x-dxf","edn":"application\/vnd.adobe.edn","emf":"application\/x-emf","eml":"message\/rfc822","ent":"text\/xml","epi":"application\/x-epi","eps":"application\/x-ps","etd":"application\/x-ebx","exe":"application\/x-msdownload","fax":"image\/fax","fdf":"application\/vnd.fdf","fif":"application\/fractals","fo":"text\/xml","frm":"application\/x-frm","g4":"application\/x-g4","gbr":"application\/x-gbr","gif":"image\/gif","gl2":"application\/x-gl2","gp4":"application\/x-gp4","hgl":"application\/x-hgl","hmr":"application\/x-hmr","hpg":"application\/x-hpgl","hpl":"application\/x-hpl","hqx":"application\/mac-binhex40","hrf":"application\/x-hrf","hta":"application\/hta","htc":"text\/x-component","htm":"text\/html","html":"text\/html","htt":"text\/webviewhtml","htx":"text\/html","icb":"application\/x-icb","ico":"image\/x-icon","iff":"application\/x-iff","ig4":"application\/x-g4","igs":"application\/x-igs","iii":"application\/x-iphone","img":"application\/x-img","ins":"application\/x-internet-signup","ipa":"application\/vnd.iphone","isp":"application\/x-internet-signup","java":"java\/*","jfif":"image\/jpeg","jpe":"image\/jpeg","jpeg":"image\/jpeg","jpg":"image\/jpeg","js":"application\/x-javascript","jsp":"text\/html","la1":"audio\/x-liquid-file","lar":"application\/x-laplayer-reg","latex":"application\/x-latex","lavs":"audio\/x-liquid-secure","lbm":"application\/x-lbm","lmsff":"audio\/x-la-lms","ls":"application\/x-javascript","ltr":"application\/x-ltr","m1v":"video\/x-mpeg","m2v":"video\/x-mpeg","m3u":"audio\/mpegurl","m4e":"video\/mpeg4","mac":"application\/x-mac","man":"application\/x-troff-man","math":"text\/xml","mdb":"application\/msaccess","mfp":"application\/x-shockwave-flash","mht":"message\/rfc822","mhtml":"message\/rfc822","mi":"application\/x-mi","mid":"audio\/mid","midi":"audio\/mid","mil":"application\/x-mil","mml":"text\/xml","mnd":"audio\/x-musicnet-download","mns":"audio\/x-musicnet-stream","mocha":"application\/x-javascript","movie":"video\/x-sgi-movie","mp1":"audio\/mp1","mp2":"audio\/mp2","mp2v":"video\/mpeg","mp3":"audio\/mp3","mp4":"video\/mpeg4","mpa":"video\/x-mpg","mpd":"application\/vnd.ms-project","mpe":"video\/x-mpeg","mpeg":"video\/mpg","mpg":"video\/mpg","mpga":"audio\/rn-mpeg","mpp":"application\/vnd.ms-project","mps":"video\/x-mpeg","mpt":"application\/vnd.ms-project","mpv":"video\/mpg","mpv2":"video\/mpeg","mpw":"application\/vnd.ms-project","mpx":"application\/vnd.ms-project","mtx":"text\/xml","mxp":"application\/x-mmxp","net":"image\/pnetvue","nrf":"application\/x-nrf","nws":"message\/rfc822","odc":"text\/x-ms-odc","out":"application\/x-out","p10":"application\/pkcs10","p12":"application\/x-pkcs12","p7b":"application\/x-pkcs7-certificates","p7c":"application\/pkcs7-mime","p7m":"application\/pkcs7-mime","p7r":"application\/x-pkcs7-certreqresp","p7s":"application\/pkcs7-signature","pc5":"application\/x-pc5","pci":"application\/x-pci","pcl":"application\/x-pcl","pcx":"application\/x-pcx","pdf":"application\/pdf","pdx":"application\/vnd.adobe.pdx","pfx":"application\/x-pkcs12","pgl":"application\/x-pgl","pic":"application\/x-pic","pko":"application\/vnd.ms-pki.pko","pl":"application\/x-perl","plg":"text\/html","pls":"audio\/scpls","plt":"application\/x-plt","png":"image\/png","pot":"application\/vnd.ms-powerpoint","ppa":"application\/vnd.ms-powerpoint","ppm":"application\/x-ppm","pps":"application\/vnd.ms-powerpoint","ppt":"application\/vnd.ms-powerpoint","pr":"application\/x-pr","prf":"application\/pics-rules","prn":"application\/x-prn","prt":"application\/x-prt","ps":"application\/x-ps","ptn":"application\/x-ptn","pwz":"application\/vnd.ms-powerpoint","r3t":"text\/vnd.rn-realtext3d","ra":"audio\/vnd.rn-realaudio","ram":"audio\/x-pn-realaudio","ras":"application\/x-ras","rat":"application\/rat-file","rdf":"text\/xml","rec":"application\/vnd.rn-recording","red":"application\/x-red","rgb":"application\/x-rgb","rjs":"application\/vnd.rn-realsystem-rjs","rjt":"application\/vnd.rn-realsystem-rjt","rlc":"application\/x-rlc","rle":"application\/x-rle","rm":"application\/vnd.rn-realmedia","rmf":"application\/vnd.adobe.rmf","rmi":"audio\/mid","rmj":"application\/vnd.rn-realsystem-rmj","rmm":"audio\/x-pn-realaudio","rmp":"application\/vnd.rn-rn_music_package","rms":"application\/vnd.rn-realmedia-secure","rmvb":"application\/vnd.rn-realmedia-vbr","rmx":"application\/vnd.rn-realsystem-rmx","rnx":"application\/vnd.rn-realplayer","rp":"image\/vnd.rn-realpix","rpm":"audio\/x-pn-realaudio-plugin","rsml":"application\/vnd.rn-rsml","rt":"text\/vnd.rn-realtext","rtf":"application\/msword","rv":"video\/vnd.rn-realvideo","sam":"application\/x-sam","sat":"application\/x-sat","sdp":"application\/sdp","sdw":"application\/x-sdw","sis":"application\/vnd.symbian.install","sisx":"application\/vnd.symbian.install","sit":"application\/x-stuffit","slb":"application\/x-slb","sld":"application\/x-sld","slk":"drawing\/x-slk","smi":"application\/smil","smil":"application\/smil","smk":"application\/x-smk","snd":"audio\/basic","sol":"text\/plain","sor":"text\/plain","spc":"application\/x-pkcs7-certificates","spl":"application\/futuresplash","spp":"text\/xml","ssm":"application\/streamingmedia","sst":"application\/vnd.ms-pki.certstore","stl":"application\/vnd.ms-pki.stl","stm":"text\/html","sty":"application\/x-sty","svg":"text\/xml","swf":"application\/x-shockwave-flash","tdf":"application\/x-tdf","tg4":"application\/x-tg4","tga":"application\/x-tga","tif":"image\/tiff","tiff":"image\/tiff","tld":"text\/xml","top":"drawing\/x-top","torrent":"application\/x-bittorrent","tsd":"text\/xml","txt":"text\/plain","uin":"application\/x-icq","uls":"text\/iuls","vcf":"text\/x-vcard","vda":"application\/x-vda","vdx":"application\/vnd.visio","vml":"text\/xml","vpg":"application\/x-vpeg005","vsd":"application\/vnd.visio","vss":"application\/vnd.visio","vst":"application\/vnd.visio","vsw":"application\/vnd.visio","vsx":"application\/vnd.visio","vtx":"application\/vnd.visio","vxml":"text\/xml","wav":"audio\/wav","wax":"audio\/x-ms-wax","wb1":"application\/x-wb1","wb2":"application\/x-wb2","wb3":"application\/x-wb3","wbmp":"image\/vnd.wap.wbmp","wiz":"application\/msword","wk3":"application\/x-wk3","wk4":"application\/x-wk4","wkq":"application\/x-wkq","wks":"application\/x-wks","wm":"video\/x-ms-wm","wma":"audio\/x-ms-wma","wmd":"application\/x-ms-wmd","wmf":"application\/x-wmf","wml":"text\/vnd.wap.wml","wmv":"video\/x-ms-wmv","wmx":"video\/x-ms-wmx","wmz":"application\/x-ms-wmz","wp6":"application\/x-wp6","wpd":"application\/x-wpd","wpg":"application\/x-wpg","wpl":"application\/vnd.ms-wpl","wq1":"application\/x-wq1","wr1":"application\/x-wr1","wri":"application\/x-wri","wrk":"application\/x-wrk","ws":"application\/x-ws","ws2":"application\/x-ws","wsc":"text\/scriptlet","wsdl":"text\/xml","wvx":"video\/x-ms-wvx","x_b":"application\/x-x_b","x_t":"application\/x-x_t","xap":"application\/x-silverlight-app","xdp":"application\/vnd.adobe.xdp","xdr":"text\/xml","xfd":"application\/vnd.adobe.xfd","xfdf":"application\/vnd.adobe.xfdf","xhtml":"text\/html","xls":"application\/vnd.ms-excel","xlw":"application\/x-xlw","xml":"text\/xml","xpl":"audio\/scpls","xq":"text\/xml","xql":"text\/xml","xquery":"text\/xml","xsd":"text\/xml","xsl":"text\/xml","xslt":"text\/xml","xwd":"application\/x-xwd"}

  • 在浏览器端使用less.js解析less文件

    非常喜欢 less 的变量、混合以及嵌套。当不断重复书写 CSS 时,嵌套 CSS 必不可少,却又略显多余。因为大部分情况下,它并没有提升编写 CSS 的能力,只是不断地重复。

    了解到有多种 CSS 的扩展语言,首先尝试使用 less。

    less 的特性有很多,支持变量、混合、嵌套、函数、运算、颜色函数、命名空间、作用域、文件引入、甚至 JavaScript 表达式。

    利用 less.js 解析 less

    第一步,引入 style.less 文件

    <link rel="stylesheet/less" type="text/css" href="/static/ran/less/site/common.less?1.0.0"/>
    

    注意 rel 属性需要设置为 stylesheet/less。

    第二步,引入 less.js 文件

    <script src="http://cdn.bootcss.com/less.js/2.5.3/less.min.js?1.0.0"></script>
    

    一定要在所有 less 文件之后引入 less.js。

    第三部,保证 common.less 可以通过 AJAX 输出

    因为 less.js 通过 ajax 下载 common.less 文件,所以若 common.less 与当前网站不在同域,可能会导致无法下载。
    若 common.less 与当前网站不同域,需要在 header 信息中增加 Access-Control-Allow-Origin,允许网站通过 AJAX 访问。