在Astros中，通过基类astro.Middleware就能快速创建一个中间件。

    new astro.MiddleWare([filter], function(asset, next){
    
    });
    
`Middleware`的构造函数有两个参数: filter，callback

#### filter

中间件适用的资源类型，

选填，默认是所有中间件

filter以键值对的形式配置，key为asset的属性名称，value为asset的属性值的范围，如只适用于js文件

    {
        fileType: 'js'
    }

适用于处理页面的JS

    {
        fileType: 'js',
        modType : 'page'
    }
    
适用于处理页面和web模块的JS

    {
        fileType: 'js',
        modType : ['page', 'webCom']
    }

只用在发布时

   {
        status: 'release'
    }

> 在项目中引用中间件时，可以动态指定

#### handle

处理asset的函数，有两个参数，`asset`和 `next`，`asset` 指向待处理的资源，在完成处理后，调用 `next(asset)` 执行下一个中间件。


以根成二倍图自动生成一倍图为例

    'use strict';
    
    var path = require('path'),
        img = require('image-magic').size;
    
    /**
     * Astros中间件
     * 
     * 当访问图片（如abc.jpg）时，
     * 如存在abc2x.jpg，则按原图1/2尺寸存储为abc.jpg，并返回
     */
    
    module.exports = new astro.Middleware({
        fileType: 'img'
    }, function(asset, next) {
        // 如果是发布状态，则自动发布一倍图
        if (asset.status == 'release' &&
            (/2x$/i).test(path.basename(asset.path, asset.extname))) {
    
            let half = asset.clone();
        
            half.path = asset.filePath.replace(/2x(\..*?)$/i, function(a, b) {
                return b
            });
            half.name = asset.name.replace(/2x(\..*?)$/i, function(a, b) {
                return b
            });
            img.createImgFrom2xWithCacheSync(half.path,
                path.join(asset.prjCfg.imgCache, 'img2x.json'));
    
            // half.debug = 1;
            half.release(function() {
                next(asset);
            });
            return;
        }
        // 访问 abc.jpg，如存在abc2x.jpg，则返回缩放1/2的abc2x.jpg
        if (img.createImgFrom2xWithCacheSync(asset.filePath,
                path.join(asset.prjCfg.imgCache, 'img2x.json'))) {
            asset.data = asset.read();
        }
        next(asset);
    });