Vitepress+EdgeOne Pages快速迁移旧网站内容

news/2025/3/3 22:11:57/文章来源:https://www.cnblogs.com/wan-deuk/p/18746497

Vitepress+EdgeOne Pages快速迁移旧网站内容

目录
  • Vitepress+EdgeOne Pages快速迁移旧网站内容
    • 下载旧网站文章、图片
    • 网站文章转Markdown
    • Vitepress项目快速开始
    • EdgeOne Pages零帧起手
    • 参考材料

去年在阿里云码上公益平台报名了一个公益项目,这周收到了公益组织负责人的邮件,请求帮助开发一个用于查询志愿者服务时长的网页,另外该组织官网的服务器即将到期,需要尽快迁移服务器上的网站数据。

第一个需求比较简单,使用飞书多维表格的查询视图很快就完成了;第二个就相对复杂了,各种debuff因素加满:

  1. 官网是基于老旧的CMS系统做的,没有导出文章、图片的功能
  2. 密码丢了,无法远程登录服务器
  3. 服务器几天后就到期,时间紧

通过对比AI工具给出的几种建议方案,最终决定使用Vitepress+腾讯云EdgeOne Pages快速搭建网站,迁移旧网站的文章。

本文详细记录使用Vitepress+腾讯云EdgeOne Pages迁移旧网站内容的过程。

下载旧网站文章、图片

  1. 登录网站CMS后台,打开浏览器开发者工具,通过DOM获取网站文章列表
  2. 通过fetch方法发送网络请求,提取响应网页中的文章内容(富文本,HTML),保存文章内容到本地
const items = [];
const rows = document.querySelectorAll('tr[height="35"]');
for (const row of rows) {const cells = row.querySelectorAll('td');const id = cells.item(1).textContent.trim();const links = cells.item(2).querySelectorAll('a');const category = links.item(0).textContent.slice(1, -1);const title = links.item(1).textContent.trim();const updatedAt = cells.item(3).textContent.trim();items.push({id,category,title,updatedAt,});
}function stringToDOM(htmlString) {const parser = new DOMParser();const doc = parser.parseFromString(htmlString, "text/html");return doc;
}function downloadAsFile(filename, content) {const blob = new Blob([content], { type: "text/plain;charset=utf-8" });const url = URL.createObjectURL(blob);const a = document.createElement("a");a.href = url;a.download = filename;a.style.display = "none";document.body.appendChild(a);// 触发点击事件,模拟用户点击下载a.click();// 释放URL对象,避免内存泄漏URL.revokeObjectURL(url);document.body.removeChild(a);
}function sleep(delayTime = 1000) {return new Promise(resolve => setTimeout(resolve, delayTime));
}const recordIds = ["580", "579", ...];
for (const id of recordIds) {fetch(`${baseUrl}/article_edit.php?aid=${id}`).then(response => response.text()).then(html => {const element = stringToDOM(html);const content = element.querySelector('textarea#body');if (content) {downloadAsFile(`${id}.txt`, content.value);}});await sleep(1500);
}
  1. 通过Python lxml解析HTML,抽取其中的图片标签,获取图片链接
  2. 根据图片链接,下载图片到本地
from lxml import etreeparser = etree.HTMLParser()def find_images(html: str) -> list[str]:"""解析HTML,抽取img标签中图片的路径"""tree = etree.fromstring(html, parser)images = []for image in tree.xpath('//img'):image_url = image.get('src')if image_url.startswith('/uploads'):images.append(image_url)return imagesimages = []
for file in (data_dir / 'articles').rglob('*.txt'):with open(file, mode='r', encoding='utf8') as fp:html = fp.read()images.extend(find_images(html))print('Found {} images'.format(len(images)))

网站文章转Markdown

Vitepress推荐把图片放到public目录下,在Markdown中通过以/为前缀的路径进行引用,为了保证网站文章在转Markdown后图片路径是正确的,需要在转换之前更新HTML中图片标签的src属性。

  1. 更新图片标签的src属性
  2. 使用Python markdownify把网站文章转换为Markdown
from lxml import etree
from markdownify import markdownify as mdparser = etree.HTMLParser()def handle_image_tags(title, html: str) -> str:"""解析HTML,过滤图片标签,更新图片标签的src属性"""tree = etree.fromstring(html, parser)for index, image in enumerate(tree.xpath('//img')):image_url = image.get('src')image_name = Path(image_url).nameif not image_url.startswith('/uploads') or image_name not in valid_images:image.getparent().remove(image)continueimage.set('src', '/{}'.format(image_name))image.set('alt', '{}-{}'.format(title, index + 1))return etree.tostring(tree, encoding='utf8', method='html').decode('utf8')def convert_article_to_markdown(title: str, created_at: str, content: str) -> str:"""HTML文章转Markdown"""metadata = """---
outline: deep
title: {}
author: 江津阳光社工
date: {}
version: 1.0
---# {}""".format(title, created_at, title)converted = md(content, heading_style='ATX').strip()return metadata + '\n' + convertedtable = str.maketrans(r'\/:*?"<>|', '_' * 9)
filename = title.translate(table) + '.md'

Vitepress项目快速开始

  1. 参考Vitepress快速开始初始化项目,启动起来
  2. 把转换后的网站文章移动docs目录下
  3. 安装插件VitePress Sidebar,自动生成侧边栏
  4. 安装插件vitepress-plugin-image-viewer,点击预览文章中的图片
  5. 编辑Vitepress配置文件docs/.vitepress/config.mjs,最后上传代码到Github:
import { defineConfig } from 'vitepress'
import { withSidebar } from 'vitepress-sidebar';function nav() {return [{text: '关于我们',items: [{text: '荣誉资质',link: '/about-us/awards-and-certifications/中心资质.md',},{text: '组织架构',link: '/about-us/organizational-structure/江津阳光社工中心组织架构.md',},]},// ...]
}// https://vitepress.dev/reference/site-config
const vitePressOptions = {title: "江津阳光社会工作服务中心",description: "让儿童都能健康快乐成长,让社区更加和谐幸福。",lang: "zh-CN",locales: {"/": {label: "简体中文",lang: "zh-CN",},},lastUpdated: true,themeConfig: {nav: nav(),search: {provider: "local",options: {placeholder: "搜索文章",translations: {button: { buttonText: "搜索文章" },modal: {searchBox: {resetButtonTitle: "清除查询条件",resetButtonAriaLabel: "清除查询条件",cancelButtonText: "取消",cancelButtonAriaLabel: "取消",},startScreen: {recentSearchesTitle: "搜索历史",noRecentSearchesText: "没有搜索历史",saveRecentSearchButtonTitle: "保存至搜索历史",removeRecentSearchButtonTitle: "从搜索历史中移除",favoriteSearchesTitle: "收藏",removeFavoriteSearchButtonTitle: "从收藏中移除",},errorScreen: {titleText: "无法获取结果",helpText: "你可能需要检查你的网络连接",},footer: {selectText: "选择",navigateText: "切换",closeText: "关闭",searchByText: "搜索提供者",},noResultsScreen: {noResultsText: "无法找到相关结果",suggestedQueryText: "你可以尝试查询",reportMissingResultsText: "你认为该查询应该有结果?",reportMissingResultsLinkText: "点击反馈",},},},},},footer: {copyright: `版权所有 © 2019-${new Date().getFullYear()} 重庆市江津阳光社会工作服务中心`},docFooter: {prev: '上一页',next: '下一页'},outline: {label: '页面导航'},lastUpdated: {text: '最后更新于',formatOptions: {dateStyle: 'short',timeStyle: 'medium'}},langMenuLabel: '多语言',returnToTopLabel: '回到顶部',sidebarMenuLabel: '菜单',darkModeSwitchLabel: '主题',lightModeSwitchTitle: '切换到浅色模式',darkModeSwitchTitle: '切换到深色模式',skipToContentLabel: '跳转到内容',}
};const vitePressSidebarOptions = [{documentRootPath: 'docs',scanStartPath: 'about-us',basePath: '/about-us/',resolvePath: '/about-us/',collapsed: true,capitalizeFirst: true,useTitleFromFrontmatter: true,useFolderTitleFromIndexFile: true,},// ...
];export default defineConfig(withSidebar(vitePressOptions, vitePressSidebarOptions));

注意:由于VitePress Sidebar插件默认按目录名生成侧边栏,需要在目录下添加index.md文件,指定名称才能让侧边栏显示为中文。

---
title: 荣誉资质
---

EdgeOne Pages零帧起手

EdgeOne Pages是基于Tencent EdgeOne基础设施打造的前端开发和部署平台,专为现代Web开发设计,帮助开发者快速构建、部署静态站点和无服务器应用。通过集成边缘函数能力,实现高效的内容交付和动态功能扩展,支持全球用户的快速访问。

  1. 连接Github仓库
  2. 填写构建参数:
    • 输出目录:docs/.vitepress/dist
    • 编译命令:pnpm run docs:build
    • 安装命令:pnpm install
  3. 点击开始部署,部署完成后就可以通过临时(3小时)的域名访问网页了,添加自定义域名后,即可通过自己的域名访问网站。

EdgeOne Page管理面

参考材料

  • 飞书多维表格的查询视图
  • VitePress由Vite和Vue驱动的静态站点生成器
  • EdgeOne Pages文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/892303.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录:tinyrenderer

Bresenham’s line drawing(布雷森汉姆算法) 进行games101的光栅化作业时,对其渲染原理仍不甚了解,找到tinyrenderer软光栅项目。在此记录下试错的过程。 作者在最初为我们做好了framebuffer,读者入手的方向实际是从渲染的过程开始。对于如何渲染出像素显示在画面上,应该需…

2025-2-28-媒体查询

媒体查询示例 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=devi…

Sunshine Moonlight 串流 再玩一把

前言 其实我已经配置好了,目前的配置是不过我额外安装vdd是因为基地版自带的那个显示屏有点问题。 只不过我自己也忘了有什么问题了。 但是现在什么?有更新? 更新来玩玩。 博主能这样随便更新,是因为这个软件不怎么用,而且喜欢折腾才这样做的,如果经常需要使用建议是稳定…

牛客 周赛82 20250227

牛客 周赛82 20250227 https://ac.nowcoder.com/acm/contest/102303 A: 题目大意:给定字符串 \(s\) ,判断首尾是否相同 #include<bits/stdc++.h> #define cintie ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define Trd int T;cin>>T;while (T--)sol…

002搜索框-搜索功能的实现

1、设置js的data值 给Zcpmingxi一个测试值 2、把 sousuo这个名字 绑定到wxml里面的 搜索框上 <inpu/>         是一个搜索框标签 type="text"        表示格式是文本格式 value="{{sousuo}}"    …

Spring面试知识

Spring优点 1.通过控制反转和依赖注入实现低耦合 2.面向切面编程,将业务逻辑和系统功能区分开来(日志记录、事务管理、安全性) 3.切面和模板可以减少板式代码 4.声明式事务的支持(@Translation)可以实现对事务代码的灵活管理,提高代码的质量和效率 5.多种内置的框架(Mybaties…

GVIM环境配置记录

背景 GVIM只用自带安装的软件,可以完成文本编辑的功能,不过很多开发者编写了很多插件,配合这些插件来做文字代码编辑,能很好地提高速度与效率 GVIM的配置环境,装机后只配置一次,很容易忘记,下次重装系统或者配新机时,又要重新查找相关资料 这里做一次记录,方便后续重新…

VIM环境配置记录

背景 VIM只用自带安装的软件,可以完成文本编辑的功能,不过很多开发者编写了很多插件,配合这些插件来做文字代码编辑,能很好地提高速度与效率 VIM的配置环境,装机后只配置一次,很容易忘记,下次重装系统或者配新机时,又要重新查找相关资料 这里做一次记录,方便后续重新配…

endnote 基础使用

因为工作的原因,综述格式统一使用endnote。一小时速成,可以满足基础的综述引用。 安装 安装的是endnote 21,这个界面感觉比较简洁。 EndNote 21 的安装包中有汉化补丁 "D:\Program Files (x86)\EndNote 21\安装包\Crack\汉化补丁.exe" 2024-11-18 Endnote21更新-…

Day1-Markdown学习笔记

MarkDown学习 标题 一个#然后空格加内容是一级标题,两个是二级标题,三个是三级标题 字体 hello world hello world *** hello world*** hello world 一对*加上内容是斜体,两对是加粗,三对是既加粗又斜体, 一对~是加横线,就是废弃的意思 引用引用别人的内容一个> 加…

2025-03-02 闲话

2025-03-02 闲话走进这里时,求是园欢迎您。离开时,它会说,再见。昨天十一点,从这里走上蒋墩路,过了马路,是夜晚的学军。周末不再灯火通明,只剩下校门口的主灯,照亮着蓝色匾额的威严。昨天发了点牢骚,2023 年时进这个校园,不需要预约,刷脸时能发现不只一个我在这里的…