简单修改Ghost 0.5.8,使其支持反代方式CDN加速
发布于 2个月前 作者 soulteary 248 次浏览 来自 分享

Ghost最近势头不错,连续几个月,基本每个月都是release 2个版本,不过也正是因为如此,ghost每次发布之后,API都会有些许变动。

故,不建议在官方merge任何i18N功能之前,使用中文版本,毕竟后台没几个英文,前台主题可以依赖自己的主题模板去实现i18N,没有使用影响。

下面分享一个简单修改的细节,可以使用七牛一类的CDN服务商无痛加速网站资源。

七牛官方分享的加速方案是网友修改storage接口,将内容不存自己的服务器,直接使用CDN,个人觉得不妥,不利于迁移维护,以及临时灾备,况且把AK,SK都存下来,对于后续升级也不利。而且CDN基本都提供反代功能,可能大家不叫这个词,业界唤作“一键加速”。

0.5.8版本的Ghost默认暂时不支持CDN,不过简单修改模板helpers可以完成我们的需求。 首先,我们需要把通用配置添加到config.js中。这里我们使用一个对象来储存cdn信息,以方便扩展和维护。

varpath=require('path'),
    config;
 
config={
    // ### Production
    // When running Ghost in the wild, use the production environment
    // Configure your URL and mail settings here
    production:{
        url:'http://my-ghost-blog.com',
        mail:{},
        database:{
            client:'sqlite3',
            connection:{
                filename:path.join(__dirname,'/content/data/ghost.db')
            },
            debug:false
        },
 
        server:{
            // Host to be passed to node's `net.Server#listen()`
            host:'127.0.0.1',
            // Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT`
            port:'2368'
        },
        cdn:{assets:"//your-cdn-path"}
    },
    ...

如果你想关闭CDN,请设置cdn:false,或者删除这个对象。

然后我们需要修改模板的assets helper,这个helper主要是针对模板使用assets方法引入的资源进行地址修正。

关键代码如下:

...
    // Get rid of any leading slash on the context
    context=context.replace(/^\//, '');
    output+=context;
 
 
    // cdn assets option
    // 如果设置了CDN,那么使用CDN配置项目中的路径进行资源替换
    if(!isAdmin&&config['cdn']&&config['cdn']['assets']){
        output=utils.assetTemplate({
            source:config['cdn']['assets']+output,
            version:config.assetHash
        });
    }else{
        if(!context.match(/^favicon\.ico$/)){
            output=utils.assetTemplate({
                source:output,
                version:config.assetHash
            });
        }
    }
...

image helper会修改markdown中的image标签的路径,如果你直接有使用低版本,会插入完整的路径,需要自己修改,或者在此基础上,进一步修改,没几篇内容的话,自己手动改下吧。

关键代码如下:

image=function(options){
    varabsolute=options&&options.hash.absolute,
        imgPath=this.image;
    if(this.image){
        // cdn assets
        // 如果设定了cdn,那么对内容添加cdn
        if(config['cdn']&&config['cdn']['assets']){
            imgPath=config['cdn']['assets']+this.image;
        }
        returnconfig.urlFor('image',{image:imgPath},absolute);
    }
};

最后修改url helper对遗漏的内容进行补刀,在这个helper里,你可以拿到最后的render结果。

关键代码如下:

    if(schema.isUser(this)){
        returnconfig.urlFor('author',{author:this},absolute);
    }
    // compressing page content can improve the response speed
    // 较稳妥的压缩页面输出内容,提高响应速度,markdown转换之后,效果明显。
    this.body=this.body.replace(/>(\n*|\r*|\s*)</gm,'><').replace(/>(\s*|\n*|\r*)/gm,'>');
    // enable cdn for post content
    if(config['cdn']&&config['cdn']['assets']){
        this.body=this.body.replace(/<img.*?src=\"(.*?)\".*?\/?>/g,function(src,uri){
            if(uri.indexOf(config['cdn']['assets'])!==0){
                if(uri.indexOf(config['url'])===0){
                    returnsrc.replace(config['url'],config['url'].split('://')[0]+':'+config['cdn']['assets']);
                }else{
                    if(uri.indexOf('://')===-1){
                        returnsrc.replace(uri,config['cdn']['assets']+uri);
                    }
                }
            }
        });
    }
    returnconfig.urlFor(this,absolute);

另外,英文摘要输出对于中文摘要来说不太友好,简单的优化如下:

    // Strip inline and bottom footnotes
    excerpt=excerpt.replace(/<a href="#fn.*?rel="footnote">.*?<\/a>/gi,'');
    excerpt=excerpt.replace(/<div class="footnotes"><ol>.*?<\/ol><\/div>/,'');
 
    // truncate for GBK when use character mode
    // 中文内容截断,根据字符的方式
    if(truncateOptions.characters){
        // remove heading tags with content and other html tags
        excerpt=excerpt.replace(/<h\d.*?\/h\d>/gi,'');
        excerpt=excerpt.replace(/<\/?[^>]+>/gi,'');
        vararr=excerpt.split("\n"),tmp="";
        for(vari=0,j=arr.length;i<j;i++){
            // remove \n && \r
            arr[i]=arr[i].replace(/(\r\n|\n|\r)+/gm,'');
            if(arr[i]){
                if(tmp.length<truncateOptions.characters){
                    varlen=tmp.length;
                    if(len+arr[i].length>truncateOptions.characters){
                        tmp+=arr[i];
                        tmp=tmp.substr(0,truncateOptions.characters-3);
                        tmp=tmp.substr(0,len)+tmp.substr(len).replace(/(,|\,|\:|\-|\"|、|“|”)/gm,'')+'...';
                        break;
                    }else{
                        // less than 10 chars is unnecessary
                        if(truncateOptions.characters-len<10&&arr[i].length<10){
                            break;
                        }else{
                            tmp+=arr[i];
                        }
                    }
                }
            }
        }
        excerpt=tmp.replace(/(\r\n|\n|\r)+/gm,' ');
    }else{
        // Strip other html
        excerpt=excerpt.replace(/<\/?[^>]+>/gi,'');
        excerpt=excerpt.replace(/(\r\n|\n|\r)+/gm,' ');
    }
 
    /*jslint regexp:false */
 
    if(!truncateOptions.words&&!truncateOptions.characters){
        truncateOptions.words=50;
    }

如果你觉得修改麻烦,也可以直接到相关PR页面下载文件: https://github.com/TryGhost/Ghost/pull/4839/files

–EOF–

原文地址: http://www.soulteary.com/2015/01/24/speedly-ghost-static-files.html

回到顶部