迁移到TinaCMS的一部分
作为迁移到TinaCMS的一部分,我还想将所有我的dev.to文章迁移到我的新博客网站上。我的主要目标是将各个平台上的所有博文整合到我的个人网站上。
只需创建一个新的npm项目,并添加以下依赖项:
"devDependencies": {
"@types/node": "^20.8.2",
"typescript": "^5.2.2"
},
"dependencies": {
"axios": "^1.5.1",
"ts-node": "^10.9.1"
}
进入全屏模式 退出全屏模式
另一个要求是从dev.to获取您的API密钥。将其保存在安全存储中,我们将在代码中使用它。您可以将其存储在.env变量中,但为简单起见,我们将硬编码它。
注意:为了按照本教程操作,请先阅读所有内容。以下行中的每个代码块可以添加到一个js文件中。
从dev.to获取文章,循环遍历每个文章并转换为Markdown文件 我的起始入口函数看起来像这样: #
async start() {
// 获取你自己的dev.to已发布的文章
const res = await axios.get("https://dev.to/api/articles/me/published", {
headers: { "api-key": "CSQVPaBYr6aEv8LR5os4m14K" },
});
const files: Article[] = res.data;
/**
* 遍历每篇文章,我们称之为 `file`
* 然后将每篇文章转换为有效的Markdown文件
*/
files.forEach((file) => {
this.convert(
// 第一个参数是整个Markdown的内容
// 我们将frontmatter和markdown内容拼接起来
`${this.createFrontmatter(file)}${file.body_markdown}`,
`${file.slug}.md`
);
});
}
进入全屏模式 退出全屏模式
convert
函数可以在本文下方找到。它接收两个参数:markdown数据(字符串)和文件名(也是字符串)。markdown数据包含了 frontmatter
。 ## 创建前言
前言是Markdown的元数据,可以包含任何数据。此外,由于每个值(如标题)可能包含:
字符,我们将在键后的下一行添加值。例如:${key}: > \n ${data[key]}\n;
以下是代码:
createFrontmatter(
data: Article,
excluded: string[] = ["body_markdown", "user"]
) {
// 前言以`---`开始和结束
// 这是开始部分
let frontmatter = "---\n";
// 这是前言的中间部分
// 类似于键: > \n 值
Object.keys(data).forEach((key) => {
if (!excluded.includes(key)) {
frontmatter += `${key}: > \n ${data[key]}\n`;
}
});
// 这是前言的结束部分
frontmatter += `---\n`;
return frontmatter;
}
进入全屏模式 退出全屏模式
Dev.to提供了很多内容。 将以下Markdown翻译为中文,并删除一级标题:“ of kinds of data for us, but we will exclude body_markdown
and user
data.”
将字符串写入Markdown文件 #
convert(data: string, fileName: string) {
fs.writeFile(`md/${fileName}`, data, (err) => {
if (err) {
console.log("写入文件时出错", err);
} else {
console.log("成功写入文件");
}
});
}
进入全屏模式 退出全屏模式
同时,创建一个Article类型的TS:
type Article = {
title: string;
description: string;
published_at: string;
path: string;
url: string;
slug: string;
body_markdown: string;
};
进入全屏模式 退出全屏模式
运行此脚本后,您可以手动将Markdown文件移动到您的Tina文章文件夹中。
如果您有任何问题或需要澄清,请告诉我, 谢谢 FM