koa-assets

最好用的assets代理工具,请与koa-join和koa-charset等其他中间件配合使用。

koa-assets

基于koa的前端开发环境中间件,最好用的前端本地调试映射工具,请与koa-joinkoa-charset等其他中间件配合使用。

koa 依赖支持 generator 的 Node 环境,准确来说,是 node >= 0.11.9 的环境。

$ npm install koa-join
$ npm install koa-assets

请务必使用node --harmony模式运行程序,例如:

$ node --harmony index.js

为了方便,可以将在你的.bash_profile中将node设置为默认启动harmony模式的别名:

alias node='node --harmony'
var koa = require('koa');
var join = require('koa-join');
var assets = require('koa-assets');
 
var app = koa();
 
app.use(join());    //koa-join 用来将combo请求分解成多个url
app.use(assets({
  urls: [{
    rule: /tm\/([\S]+?)\/[\d\.]+/,
    dest: '~/dev/tm/$1'
  }]
}));
 
app.listen(80);
 

在使用koa-assets进行本地调试时,请将g.tbcdn.cng.assets.daily.taobao.net绑定到本地ip 127.0.0.1上。

127.0.0.1  g.tbcdn.cn
127.0.0.1. g.assets.daily.taobao.net
$ node --harmony index.js #mac下监听80端口可能需要sudo权限

koa-assets将assets url请求捕获,并通过可配置的规则,映射到用户本地目录,方便开发和调试。以上面的Example为例,当我们访问:

http://g.tbcdn.cn/tm/detail/1.5.53/app.css

koa-assets的目录查找顺序依次是:

=> ~/dev/tm/detail/src/app.css
 => ~/dev/tm/detail/build/app.css
  => ~/dev/tm/detail/app.css
   => http://10.235.136.37/tm/detail/1.5.53/app.css

当然,只要用其中的一种方式找到了文件,就不会用其他方式继续查找。

  • rule:匹配的url规则,支持正则和字符串
  • dest:映射的目标目录
[{
  rule: /tm\/detail\/[\d\.]+/,
  dest: '~/dev/tm/detail'
}]
[{
  rule: /tm\/detail\/[\d\.]+/,
  dest: function($){
    console.log($);
    return '~/dev/tm/detail';
  }
}]
[{
  rule: 'tm/detail/1.5.53',
  dest: '~/dev/tm/detail'
}]

本地不存在的文件,会到通过请求线上服务器获取,例如koa-assets的默认配置:

{
  'g.tbcdn.cn': '10.235.136.37',
  'g.assets.daily.taobao.net': '10.235.136.37'
}

可以将g.tbcdn.cn指向线上服务器ip地址,例如:

{
  'g.tbcdn.cn': '115.238.23.250',
}

读取映射目录文件的文件编码,默认以utf-8方式读入。当目录文件编码不为utf-8时,可以通过设置inputCharset字段来让koa-assets进行文件读取时的自动转码,例如:

[{
  rule: 'tm/detail/1.5.53',
  dest: '~/dev/tm/detail',
  inputCharset: 'gbk'
}]

也叫响应编码。koa-join和koa-assets响应的默认编码是utf-8,如需定制具体某些请求的响应编码可通过koa-charset中间件进行编码设定和字符编码转换,例如:

//用在koa-join和koa-assets之前
app.use(function *(next){
  yield next;
  //对指定url的请求设置成gbk编码
  if(this.url.indexOf('tm/buy') !== -1){
    this.charset = 'gbk';
  }
});
app.use(join());
app.use(assets());
//...

MIT