迁移到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