Wie kann ich Next.Js dazu bringen, alle externen Assets herunterzuladen, die ich auf meiner Website verwendet habe, und sie lokal bereitzustellen?

Lesezeit: 3 Minuten

Benutzer-Avatar
Basler Akasha

Ich habe ein Portfolio mit Headless WordPress und NextJs aufgebaut. Ich habe meine eigenen Funktionen geschrieben, um Daten vom GraphQl-Endpunkt abzurufen. Alles funktioniert gut. Aber ich habe Mediendateien (Bilder, PDFs usw.), die auf dem WordPress-CMS gespeichert sind und als Links in die next.Js importiert werden (als externe Bilder importiert). zum Beispiel:

<img src="https://wordpresscms.mywebsite.com/uploads/2020/02/myimage.png" />

Aber ich möchte, dass die Assets auf der nextJs-Website gehostet und bei jedem Build automatisch aktualisiert werden. Gibt es eine Möglichkeit, dies automatisch in Next.Js zu tun? Oder ist dies bereits geschehen, wenn ich meine Website für die Produktion bereitstelle?

Das Szenario in meiner Vorstellung:

  1. Ich lade die Assets in das WordPress-CMS hoch.
  2. NextJs erhält die JSON-Daten von WordPress, die Links zu externen Assets enthalten (unter Verwendung der GraphQL-API zur Erstellungszeit (getStaticProps))
  3. NextJs lädt die Assets herunter.
  4. NextJs ersetzt die externen URLs durch lokale URLs (gehostet auf demselben Host wie meine NextJs-Website).

Vielen Dank.

Ich sehe zwei Lösungen, die Sie interessieren könnten:

  1. Eher ähnlich wie du es erklärt hast

nach Schritt 2. – Schreiben Sie eine Funktion, die innerhalb von getStaticProps verwendet wird, die den JSON mit Links zu externen Assets zuordnet, jedes Asset abruft und als Dateien in einem Array oder einem Wörterbuch speichert, dieses Objekt an Ihre Seite übergibt und verteilt es über die App.

Dadurch werden alle Assets bei jedem Build abgerufen und angezeigt, wo immer Sie sie platzieren. Die externen URLs werden jedoch nicht wie gewünscht aktualisiert. Sie müssen die Dateien von getStaticProps an jedes Element übergeben, für das Sie diese Unterstützung benötigen.

Dies kann Ihnen beim Einstieg helfen: Wie kann ich ein Bild mit JavaScript in einen Base64-String konvertieren?

  1. Viel einfacher: nach Schritt 2. – Übergeben Sie einfach das geparste JSON mit allen Bild-URLs, verwenden Sie die URLs, um beispielsweise Assets anzuzeigen:

  • Die erste Idee ist interessant. Ich mache bereits das, was Sie in Schritt 2 beschrieben haben. Aber der Punkt ist, dass ich mein WordPress-CMS nicht in der Produktion verwenden möchte (beim Anzeigen der Bilder). Ich kann auf beiden Ideen aufbauen und eine Funktion erstellen, die Bilder von URLs abruft und übertrage sie auf base64. wie:

    – Basler Akasha

    18. Februar 2021 um 20:05 Uhr


  • Ich dachte, es gäbe bereits etwas, um dies festzustellen (wie ein nextJs-Plugin), sodass ich die Funktion nicht jedes Mal verwenden muss, wenn ich ein img-Tag hinzufüge.

    – Basler Akasha

    18. Februar 2021 um 20:10 Uhr

  • Es ist ein sehr spezifischer Anwendungsfall, den ich noch nie zuvor gesehen habe. Ich glaube nicht, dass es dafür ein NextJs-Plugin gibt

    – beinger

    19. Februar 2021 um 8:47 Uhr

  • Das ist wirklich ein fehlendes Feature. Ich habe Setups gesehen, bei denen das Headless-CMS privat ist und nur der Build-Prozess darauf zugreifen kann. Hier ist es wichtig, dass der Build die Bilder herunterladen kann, um sie lokal zu speichern.

    – Sascha

    15. November 2021 um 10:19 Uhr


Anstatt Ihre NextJS-Anwendung so zu ändern, dass sie die Bilder in ihrem Bilderordner herunterlädt und erneut hochlädt, ist es besser, die Upload-Funktion in Ihrer WordPress zu ändern. Wenn WordPress also die Upload-Funktion aufruft, wird das hochgeladene Bild auch in Ihr NextJS-Verzeichnis kopiert.

  • Das Hauptproblem ist, dass meine NextJs-Website auf einem anderen Host gehostet wird als mein WordPress-CMS

    – Basler Akasha

    18. Februar 2021 um 19:58 Uhr

  • Außerdem müsste ich einen Weg finden, NextJs-Build bei jedem Bild-Upload auszulösen.

    – Basler Akasha

    18. Februar 2021 um 20:07 Uhr

  • Sie benötigen eine CI/CD-Automatisierung, um den NextJS-Build abzuhören und auszulösen, wenn es ein Bild von Ihrem WP empfängt. Ich nehme an, Sie werden den NextJS-Build für Ihr Szenario manuell auslösen (Punkt Nr. 2)? IMHO ist es immer noch möglich, von Ihrem WP empfangene Bilder über verschiedene Hosts an Ihr NextJS weiterzuleiten, indem Sie dieses Bild per API-Anfrage senden, dann wird das CI/CD auf diesen Auslöser reagieren.

    – Darryl RN

    18. Februar 2021 um 20:30 Uhr

Update: Next.js hat ein eingebautes Tag <Image />. Es lädt die Bilder vor und hat Lazy Loading und viele nette Funktionen. Verknüpfung: https://nextjs.org/docs/api-reference/next/image

Beispiel:

import Image from 'next/image'

...
..
.

<Image
    src={"the link of the image"}
    alt=""
    width="300"
    height="300"
/>

1369290cookie-checkWie kann ich Next.Js dazu bringen, alle externen Assets herunterzuladen, die ich auf meiner Website verwendet habe, und sie lokal bereitzustellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy