Nuxt 3 创建 SSR 介绍和举一个栗子

1,007 阅读4分钟

什么是 SSR?

SSR 提要是一种结构化文件格式,用于发布经常更新的内容,例如博客文章、新闻文章和播客。它使读者无需直接访问网站即可轻松访问和订阅新内容。SSR 提要很重要,因为它们可以节省时间并提供一种方便的方式来从一个平台上获取多个信息源的最新信息。出版商、博主和新闻媒体通常使用它们向他们的受众分发内容。

使用 SSR 提要的好处

为您的网站创建 SSR 提要可以提供多种好处,包括:

  1. 方便:SSR 提要使读者可以在一个地方轻松访问多个内容源并保持更新,而无需单独访问每个网站。这节省了时间并提供了更方便的用户体验。
  2. 增加参与度:SSR 可以让读者轻松地在社交媒体或其他平台上分享您的内容,从而帮助增加与受众的参与度。这可以为您的网站带来更多流量和更高的知名度。
  3. 搜索引擎优化:SSR 提要可以提供源源不断的新鲜相关内容,从而帮助提高网站的搜索引擎排名。这有助于提高您网站的知名度并为您的网站带来更多流量。

设置 Nuxt 3 项目

在本教程中,我将向您展示如何使用服务器路由在 nuxt 3 中生成 RSS 提要,这应该可以很好地了解 nuxt 3 中的新服务器功能如何与 nitro 一起使用

创建一个新项目

npx nuxi init nuxt3-rss

cd 进入nuxt3-rss安装依赖项,我们还需要添加rss

npm i rss && npm i -D @types/rss

为您的 RSS 提要创建服务器路由

Nuxt 3 由一个新的服务器引擎Nitro 提供支持。

服务器目录的工作方式类似于页面目录,带有用于 API 路由的基于文件的路由系统

Nuxt 自动扫描 ~/server/api~/server/routes~/server/middleware 目录中的文件,以注册具有 HMR 支持的 API 和服务器处理程序。

    server/  
    api/  
    test.ts <-- /api/test  
    hello.ts <-- /hello

对于本教程,我们将重点关注服务器路由而不是 API

~/server/api 中的文件在其路由中自动以 /api 为前缀。要添加不带/api前缀的服务器路由,您可以将它们放入~/server/routes目录。

例如

// server/routes/hello.ts  
    export default defineEventHandler(() => 'Hello World!')

鉴于上面的例子,该/hello路线将可在http://localhost:3000/hello.

我们需要server在项目的根目录下创建一个目录,并在 server 目录中创建一个 routes 文件夹

mkdir server
cd server
mkdir routes

server/routes 创建 rss.ts 文件

// server/routes/rss.ts 
export  default  defineEventHandler ( () =>  'RSS page!' )

导航到http://localhost:3000/rss并确保一切正常

这是我们将尝试动态呈现的 RSS 示例

<?xml version="1.0" encoding="UTF-8"?>  
<rss version="2.0">  
    <channel>  
        <title>My Website</title>  
        <link>http://www.example.com/</link>  
        <description>My website's RSS feed</description>  
        <lastBuildDate>Tue, 22 Feb 2023 12:00:00 GMT</lastBuildDate>  
        <item>  
            <title>Article Title</title>  
            <link>http://www.example.com/article1</link>  
            <description>This is the first article on my website.</description>  
            <pubDate>Tue, 21 Feb 2023 12:00:00 GMT</pubDate>  
        </item>  
        <item>  
            <title>Another Article Title</title>  
            <link>http://www.example.com/article2</link>  
            <description>This is the second article on my website.</description>  
            <pubDate>Mon, 20 Feb 2023 12:00:00 GMT</pubDate>  
        </item>  
    </channel>  
</rss>

在示例中,rss标记指定所使用的 RSS 格式的版本(在本例中为 2.0 版)。该channel标签包含有关 RSS 提要的信息,例如网站的标题、描述和链接。每个item标签代表提要中的一篇文章,带有标题、链接、描述和发布日期。

我们的目标是从 API 中获取项目列表,遍历每篇文章并将它们包含在item我们的 RSS 提要的标签中

我将使用 dev.to API 来获取我的 arctiles 列表

// server/routes/rss.ts  
  
import RSS from 'rss';  
  
export default defineEventHandler(async (event) => {  
//用try-catch块包住所有东西
    try {  
        //从dev.to获取数据
        const response = await fetch(  
            'https://dev.to/search/feed_content?per_page=15&page=0&user_id=138553&class_name=Article&sort_by=published_at&sort_direction=desc&approved='  
        );  
        // 如果响应不正常,则抛出错误
        if (!response.ok) {  
            throw new Error(response?.status);  
        }  
        /*  
        等待响应.json()
        api返回一个带有result键的对象,result包含数组中的所有文章
        将结果分配给帖子
        */  
        const {result:posts} = await response.json();  
        // 创建新的rss 这将是我们的新的page,带有网站标题和url
        const feed = new RSS({  
            title: 'Rafael Magalhaes',  
            site_url: 'https://dev.to/rafaelmagalhaes', // 链接到 website/blog  
            feed_url: `https://blog.rrrm.co.uk/rss`, // 链接到 rss feed  
        });  
        // loop over each posts  
        for (const post of posts) {  
        // 用正确的数据为rss feed添加项目标签  
            feed.item({  
                title: post.title, // title from post to item title  
                url: `https://dev.to/${post.path}`, // 文章所在的完整路径  
                //description: '', // dev.to APIs不返回描述,如果你有描述,可以在这里添加。 
                date: post.published_at_int, //帖子创建日期  
                categories: post.tag_list, // 标签列表  
            });  
        }  
            const feedString = feed.xml({ indent: true }); //这将返回XML作为一个字符串。 
            event.node.res.setHeader('content-type', 'text/xml'); 
            event.node.res.end(feedString); // 发送
    } catch (e) {  
    // return an error  
    return e;  
    }  
});

现在,如果打开这个链接http://localhost:3000/rss它应该返回一个包含我们文章列表的 xml 文件

17.png

你可以在这里找到我的栗子代码:github.com/my

总结

nuxt是我在工作中用到的最多的项目工具之一,有幸分享给大家,一起学习吧

每天向前一小步,女神离你进一步