• 首页
  • nodejs
  • node.js 利用 sitemap 为你的站点生成站点地图

node.js 利用 sitemap 为你的站点生成站点地图

sm.jpg


文章目录



node.js 下利用 sitemap 生成站点地图.

大致的工作就是,我们生成一份提供给搜索引擎的 Sitemap
之前你获取在网络上找过各种在线生成 sitemap 工具或者服务,使用起来却都不尽人意.有的收费,有的最大抓取2层url ,还有的最大链接数限制在500个.
所以今天和大家分享的是如何用 node.js 来为站点生成 sitemap


什么是sitemap



借用百科的一段话

Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页。最简单的 Sitemap 形式,就是XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度为何等),以便搜索引擎可以更加智能地抓取网站。


sitemap 的结构是什么样?

<url> 
   <loc>http://yijiebuyi.com/</loc> 
   <changefreq>daily</changefreq> 
   <priority>0.5</priority>
</url>

url 这个节点包含3种信息

    • loc:链接地址
    • changefreq:更新频率
    • priority:权重

使用开源包 sitemap

地址:https://github.com/ekalinin/sitemap.js
引用: npm install --save sitemap


sitemap api

结合 express ,根据 sitemap 访问地址,访问 sitemap 路径时动态生成 xml 流,然后 pipe 到 response

var express = require('express')
  , sm = require('sitemap');

var app = express()
  , sitemap = sm.createSitemap ({
      hostname: 'http://example.com',
      cacheTime: 600000,        // 600 sec - cache purge period
      urls: [
        { url: '/page-1/',  changefreq: 'daily', priority: 0.3 },
        { url: '/page-2/',  changefreq: 'monthly',  priority: 0.7 },
        { url: '/page-3/'},    // changefreq: 'weekly',  priority: 0.5
        { url: '/page-4/',   img: "http://urlTest.com" }
      ]
    });

app.get('/sitemap.xml', function(req, res) {
  sitemap.toXML( function (err, xml) {
      if (err) {
        return res.status(500).end();
      }
      res.header('Content-Type', 'application/xml');
      res.send( xml );
  });
});

app.listen(3000);

生成静态 sitemap.xml 文件

var sm = require('sitemap')
    , fs = require('fs');

var sitemap = sm.createSitemap({
    hostname: 'http://www.mywebsite.com',
    cacheTime: 600000,  //600 sec (10 min) cache purge period
    urls: [
        { url: '/' , changefreq: 'weekly', priority: 0.8, lastmodrealtime: true, lastmodfile: 'app/assets/index.html' },
        { url: '/page1', changefreq: 'weekly', priority: 0.8, lastmodrealtime: true, lastmodfile: 'app/assets/page1.html' },
        { url: '/page2'    , changefreq: 'weekly', priority: 0.8, lastmodrealtime: true, lastmodfile: 'app/templates/page2.hbs' } /* useful to monitor template content files instead of generated static files */
    ]
});

fs.writeFileSync("app/assets/sitemap.xml", sitemap.toString());

我在博客中使用的是上面2个方法的一个结合


首先根据拼接的 url 生成静态 sitemap.xml 文件
然后 sitemap 路由去加载 sitemap.xml 文件,并 pipe 到response 流中



准备工作

出自:node.js 利用 sitemap 为你的站点生成站点地图

选定你的更新频率,比如我的博客,我打算发布博文时生成一次 sitemap
每次生成 sitemap 后在根目录下创建一个 sitemap.xml 文件
然后创建一个路由,当访问 /sitemap.xml 路径时,我们用文件流读取 sitemap.xml 然后 pipe 到 response 流中,返回给客户端.


首先我们要定义个生成 sitemap 的方法 createSiteMap()

//引入包文件
var sm = require('sitemap');
var fs = require('fs');
var config = require('config');
var async = require('async');
var lodash = require('lodash');
var blog = require('./lib/blog');

//创建 sitemap文件的方法
var createSiteMap = function () {
    // 定义 urls 数组存放路径
    var urls = [
        { url: '/index.html', changefreq: 'daily', priority: 0.7 }
    ];
    async.waterfall([
        function (done) {
            getBlogPageUrls(function (url) {
                urls = lodash.union(urls, url);
                done();
            });
        },
        function (done) {
            getBlogTimeCount(function (url) {
                urls = lodash.union(urls, url);
                done();
            });
        },
        function (done) {
            getBlogTag(function (url) {
                urls = lodash.union(urls, url);
                done();
            });
        },
        function (done) {
            getBlogCategory(function (url) {
                urls = lodash.union(urls, url);
                done();
            });
        }
    ], function () {
        // 把 关于我 页面 url push 到 urls 数组中
        urls.push(
            {url: '/about.html', changefreq: 'monthly', priority: 0.4}
        );
        //生成 sitemap.xml 文件
        createSiteMapFile(urls);
    })
};

var getBlogPageUrls=function(callback){
    var urls=[];
    //获取博客列表,分页后拼接成url,然后 push 到 urls 数组中
    calllback(urls);
}

var getBlogTimeCount=function(callback){
    var urls=[];
    //获取博客日历列表,拼接好的 url push 到 urls中
    callback(urls);
}

var getBlogTag=function(callback){
    var urls=[];
    //获取博客 tag ,分页后拼接 url ,然后 push 到 urls 数组中
    callback(urls);
}

var getBlogCategory=function(callback){
    var urls=[];
    //获取博客分类, 分页后拼接 url ,然后 push 到 urls 数组中
    callback(urls);
}

var createSiteMapFile=function(urls){
    //生成 sitemap.xml 静态文件
    var sitemap = sm.createSitemap({
        hostname: 'http://yijiebuyi.com',
        cacheTime: 12 * 60 * 60, 
        urls: urls
    });
    fs.writeFileSync("sitemap.xml", sitemap.toString());
}

访问 sitemap.xml 路由时,把上面的文件读取成文件流 pipe 到 response 流中

定义 sitemap 路由
app.get('/sitemap.xml', pageBlog.siteMap);
读取文件流

function siteMap(req, res, next) {
    var stream = fs.createReadStream('./sitemap.xml', {
        flags: 'r'
    });
    stream.pipe(res);
}

然后我在发布博文成功后 调用 上面定义的方法 createSiteMap()

引入生成 sitemap 文件的 js 文件
var sitemap=require('../siteMap');
发布博文成功后,调用 siteMap.js 中的 createSiteMap() 方法

function pagePost(req, res, next) {
    //当博文发布成功
    sitemap.createSiteMap();
}
回到顶部