使用 Rendertron 进行服务器端渲染 - 不带 firebase 的 Angular 5

2023-12-01

我使用 rendertron 作为服务器端渲染的解决方案,下面是 index.js 文件。如何执行index.js以及在哪里执行。我已经在我的服务器上使用 docker 设置了自己的 redertron 实例,并且我的角度应用程序构建位于 dist 文件夹中,如何使用 rendertron 渲染我的角度应用程序的完整 html 以及在哪里执行 index.js

const express = require('express');
const fetch = require('node-fetch');
const url = require('url');
const app = express('');

const appUrl = 'http://xyzabc.com';
const renderUrl = 'http://pqr.com/render';


    function generateUrl(request) {
        return url.format({
            protocol: request.protocol,
            host: appUrl,
            pathname: request.originalUrl
        });
    }
    function detectBot(userAgent){
        const bots = [
            'bingbot',
            'yandexbot',
            'duckduckbot',
            'slurp',
            //Social
            'twitterbot',
            'facebookexternalhit',
            'linkedinbot',
            'embedly',
            'pinterest',
            'W3C_Validator'
        ]

        const agent = userAgent.toLowerCase();

        for (const bot of bots) {
            if (agent.indexOf(bot) > -1) {
                console.log('bot detected', bot, agent);
                return true;
            }
        }

        console.log('no bots found');
        return false;
    }
app.get('*', (req, res) =>{
    const isBot = detectBot(req.headers['user-agent']);

    if (isBot) {
        const botUrl = generateUrl(req);

        fetch(`${renderUrl}/${botUrl}`)
            .then(res => res.text())
            .then(body => {
                res.set('Cache-Control', 'public, max-age=300, s-maxage=600');
                res.set('Vary', 'User-Agent');

                res.send(body.toString())
            });
    } else {
        fetch(`https://${appUrl}/`)
            .then(res => res.text())
            .then(body => {
                res.send(body.toString());
            });
    }
});

我正在使用 Angular 6 应用程序,并且遇到了同样的问题。我没有使用 Express 服务器或 Firebase 来完成此操作,而是使用 NGINX 检查代理标头并将它们路由到 rendertron(如果它是机器人)或 Angular 应用程序(如果它是普通用户)。

以防万一,如果您想使用 NGINX 采取这种方法。使用此配置。

server {
    server_name your-server-name;

    root /path to your dist;

    index index.html;

    location ~ /\. {
        deny all;
    }

    location / {
        try_files $uri @prerender;
    }

    location @prerender {
        set $prerender 0;

        if ($http_user_agent ~* "googlebot|yahoo|bingbot|baiduspider|yandex|yeti|yodaobot|gigabot|ia_archiver|facebookexternalhit|twitterbot|developers\.google\.com") {
            set $prerender 1;
        }

        if ($args ~ "_escaped_fragment_|prerender=1") {
            set $prerender 1;
        }

        if ($http_user_agent ~ "Prerender") {
            set $prerender 0;
        }

        if ($prerender = 1) {
            rewrite .* /render/$scheme://$host$request_uri? break;
            proxy_pass https://render-tron.appspot.com; #You can use our own hosted Rendertron
        }

        if ($prerender = 0) {
            rewrite .* /index.html break;
        }
    }
}

是的,如果它是机器人,您现在可以预渲染。

如果您仍然想使用 Express 来完成此操作,Rendertron 提供了 Express 中间件。你可以检查一下here.

我发现这个 NGINX 配置来自预渲染io,您可以找到对不同服务器有用的东西或他们的任何其他方法repo.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Rendertron 进行服务器端渲染 - 不带 firebase 的 Angular 5 的相关文章

随机推荐

  • SupportPlaceAutocompleteFragment 的 OnPlaceSelectedListener 未触发

    我遇到了问题OnPlaceSelected监听器的方法支持地点自动完成片段 My onViewCreated method Override public void onViewCreated View view Bundle savedI
  • 移动网站 - 仅强制横向/不自动旋转

    我有一个具有移动样式表的网站 我还使用 jQuery 来检查移动设备并相应地更改功能 但我想知道是否有办法强制仅横向方向并禁用自动旋转 CSS 或 jQuery 解决方案都可以 Thanks 使用媒体查询来测试方向 在纵向样式表中隐藏所有内
  • 欧拉项目 #10 (Python)

    为什么我求 200 万以下所有素数总和的算法这么慢 我是一个相当初级的程序员 这就是我为寻找解决方案而想出的方法 import time sum 2 start time time for number in range 3 2000000
  • 为什么 secp256k1 未压缩公钥的格式不符合预期?

    一小段 Rust 代码 let secret key SecretKey from slice rand thread rng gen lt u8 32 gt expect 32 bytes within curve order let p
  • 带有回形针的水印

    根据这个例子 http dimaspriyanto com 2010 06 08 image watermarking with paperclip 我尝试在我上传的每张图片上添加水印 目前 我限制自己在大一 你猜怎么着 这不起作用 所以在
  • WPF 用户控件与父视图/视图模型的交互

    您好 我有一个 mainView 窗口 其 dataContext 设置为它自己的 viewModel 在该 viewModel 上有一个 DateTime 属性 该属性又使用 2 路绑定绑定到我的主视图上的日期选择器
  • 在 ViewPager 内水平滚动 webview

    我已将加载图像的 WebView 放入 ViewPager 中 当我尝试水平滚动图像时 我会移至下一个视图 而不是滚动图像 在移动到下一个视图之前是否可以使其滚动到图像的末尾 Override public Object instantia
  • 什么是 HTTP“主机”标头?

    由于发送 HTTP 请求时 TCP 连接已经建立 因此 IP 地址和端口是隐式已知的 TCP 连接是 IP 端口 那么 为什么我们需要Host标题 这是否仅在有多个主机映射到 TCP 连接中隐含的 IP 地址的情况下才需要 The Host
  • 使用附加字符串的整数对 WPF 数据网格进行排序

    我有一个 wpf 数据网格 我将 ObservableCollection 分配给它 DG1 DataContext a 其中一列的值如下所示 1 A B 12 A1 B 3 A2 B 10 A3 B 2 A4 B 15 A5 B 我想使用
  • 用 watir 检查标签类别?

    我有一个 div 它会根据表单是否正确提交而发生变化 我想知道是否可以检查类的特定元素 开始元素看起来像这样 div class input text div 如果输入不正确 请添加错误类别 div class input text err
  • iOS:在 ImageView 上绘制矩形并调整边框

    随附的1是一个名为 GeniusScan 的应用程序的屏幕截图 您可以在其中拍摄任何文档 并且图像视图上会显示可调整的矩形网格 您可以用手指轻松调整网格的边框 以选择要扫描的图像部分 然后它将转化为正确的预期 1 如何在图像视图上绘制网格并
  • ListView 中的空间超出了我的需要

    我使用 StackLayout 和 ListView 来显示视图的某些部分 但 ListView 占用的空间超出了我的需要 并且在列表的最后一行和配置文件延续之间留下了空白 看来我的 ListView 的行数比实际列表的长度多 或者它有固定
  • 如何在 swift 4 和 xcode 9 中的 UITableViewCell 中单击按钮时更新 UILabel? [复制]

    这个问题在这里已经有答案了 我正在构建一个订餐应用程序 其中有递增和递减按钮以及用于显示数量的 UILabel 我想更新单击增量和减量按钮时的数量标签 附有其图像 我的 ViewController 的一个片段是 protocol Gond
  • Java TimeZone.getTimeZone("PDT") 不工作

    它返回 GMT 的默认时区 使用 SimpleTimeFormat 并用 z 表示时区 它会打印 PDT 但 PDT 不在 TimeZone getAvailableIDs 返回的列表中 真是奇怪啊 有人知道为什么 PDT 不是标准 tz
  • 非聚集索引和聚集索引在同一列上

    我碰到this在 Stackoverflow 上发帖 第一个答案提到了类似的事情聚集索引包含表的所有数据 而非聚集索引仅包含列 聚集索引的位置或行 如果它位于堆上 没有聚集索引的表 非聚集索引怎么能有聚集索引的位置呢 它只包含在 B 树中排
  • 按列名称中的前缀排列列

    我有一个包含数百列的数据框 这是一个简化的示例 I need to arrange the order of specific columns so they are kept together based on the prefix in
  • 如何在 C# 中低延迟/极少延迟地播放音频文件?

    如何在 C 中以极小的延迟播放音频文件 mp3 我的意思是 文件应该在提供用户输入后立即开始播放 然后再播放 另外 如何同时并行播放两个音频文件 看看NAudio图书馆 要同时播放多个文件 请参阅这个帖子
  • 使用 JButton 将鼠标悬停在事件上

    我正在尝试在 JButton 上创建自定义鼠标悬停事件 原因是我的 JButton 当前是一个图像 所以我必须删除所有边框和动画等等 所以我这样做了 btnSinglePlayer setOpaque false btnSinglePlay
  • Spark 将隐藏参数添加到 Scala 类的构造函数中

    我不知道如何解释这一点 但 Spark 似乎向构造函数添加了一个隐藏 隐式 参数 这是我尝试过的代码spark shell 在常规 Scala shell 中参数列表将为空 scala gt class A defined class A
  • 使用 Rendertron 进行服务器端渲染 - 不带 firebase 的 Angular 5

    我使用 rendertron 作为服务器端渲染的解决方案 下面是 index js 文件 如何执行index js以及在哪里执行 我已经在我的服务器上使用 docker 设置了自己的 redertron 实例 并且我的角度应用程序构建位于