惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
宝玉的分享
宝玉的分享
量子位
Recent Announcements
Recent Announcements
Martin Fowler
Martin Fowler
J
Java Code Geeks
V
Visual Studio Blog
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
S
SegmentFault 最新的问题
B
Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 【当耐特】
小众软件
小众软件
The Cloudflare Blog
Y
Y Combinator Blog
I
InfoQ
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
GbyAI
GbyAI
IT之家
IT之家

博客园 - 麦舒

网站访问速度的优化 ERP 订单打印的优化 一个网站首页重构小记 广告播放软件的开发 项目分享九:客户端的异常处理 项目分享八:基于按钮点击事件的弹窗 项目分享七:客户端防止表单重复提交 项目分享六:图片的延迟加载 项目分享五:H5图片压缩与上传 项目分享四:购物车页面的更新 项目分享三:页面之间的传值 项目分享二:APP 小红点中数字的处理 项目分享一:在项目中使用 IScroll 所碰到的那些坑 微信开发——通过授权获取用户的基本信息 千呼万唤岂出来,写款软件不容易——Visual Entity 2.0 发布 实现虽易,写好不易——小玩意也能体现编码功力,微信消息处理框架发布 代码重构之 —— 一堆if、esle 逻辑的处理 ALinq Dynamic 使用指南——慨述(上) ALinq Dynamic 使用指南——代码的获取与编译
页面 SEO 信息的优化
麦舒 · 2023-02-06 · via 博客园 - 麦舒

2023-02-06 15:30  麦舒  阅读(39)  评论()    收藏  举报

接到业务部门的一个需求,有一个运营了 10 多年的网站,现在需要添加一个功能,允许运营人员修改首页,商品页,博客页的标题,描述,关键词等信息。功能不复杂,但是有两个点需要注意的:

  1. 这个网站运营了 10 多年,中间已经换了好几拨人了。
  2. 网站必须稳定,可靠。
    对于这种历史性的网站,能不去动里的代码,最好还是不要去动。一旦动了,很容易踩坑,背锅。比如说:一旦流量下降,或者单量减少。运营人员首先就会觉得,是不是做开发那帮人,改了啥导致的。
    所以,对于这个需求,可以通过一个中间件去处理。

如下图:左边是原来的架构,右边是新的架构

原理
中间件对需求修改的页面请求进行拦截,然后对 HTML 进行处理,加上标题,描述,关键词等信息,再返回给客户端。

优点

  1. 不需要改动原来的代码。
  2. 可插拔。一旦出现,可以把中间件去掉,恢复原貌。

缺点
加了一个中间件,增加了系统的复杂性。

后台截图

代码
下面是实现的部分代码

export function processPageSEO(doc: Document, pageInfo: PageInfo) {

    if (!doc) throw errors.argumentNull("doc");
    if (!pageInfo) throw errors.argumentNull("pageInfo");

    if (!doc.head)
        throw new Error(`Head element is null.`);

    if (pageInfo.title)
        doc.title = pageInfo.title;

    if (pageInfo.keywords) {
        let keywordsMeta = doc.head.querySelector("meta[name='keywords']") as HTMLMetaElement;
        if (!keywordsMeta) {
            keywordsMeta = doc.createElement("meta");
            keywordsMeta.name = "keywords";
            doc.head.appendChild(keywordsMeta);
        }

        keywordsMeta.content = pageInfo.keywords;
    }

    if (pageInfo.description) {
        let descriptionMeta = doc.head.querySelector("meta[name='description']") as HTMLMetaElement;
        if (!descriptionMeta) {
            descriptionMeta = doc.createElement("meta");
            descriptionMeta.name = "description";
            doc.head.appendChild(descriptionMeta);
        }
        descriptionMeta.content = pageInfo.description;
    }
}

PS: 对于维护旧的系统,并且在不熟悉的情况下,增加一个中间件,是非常有必要的,这个中间件,对原来的系统做了隔离,避免因为修改代码出现的 BUG。事实上,这个中间件在后面一系列的新需求,发挥了很大的作用。