Projekt-Tagebuch Blog, Tag 30


coden
Rustikaler, tropischer Arbeitsplatz mit einem Laptop auf einem Holztisch, daneben eine Hängematte.
Daniel Kaser|10. Juni 2024
3 min.
Montag, 10. Juni 2024

Wochen-Ziele:

  • Blog-Projekt-Tagebuch (Mai) in den Blog uploaden

Tages-Ziele:


In der letzten Session hab ich die verschiedenen Linkarten in der MDXRemote-Komponente (bei mir CustomStyledMDX) auf die entsprechenden Komponenten gemappt. Einzig fehlten noch die Affiliate-Links. Die waren heute fällig.

Affiliate-Links füttere ich normalerweise nicht mit einer URL, sondern mit einer Partner-Variablen. Die Partner haben in meinem globalen links-Objekt jeweils die URL hinterlegt. Dort kann ich sie dann raussuchen und an die AffiliateLink-Komponente übergeben.

<AffiliateLink partner={tradeRepublic}>Trade Republic</AffliateLink>

Um nicht immer den kompletten JSX-Tag ausschreiben zu müssen, würde ich gerne die Affiliate-Links auch in der MDXRemote-Komponente mappen.

Damit der Kompiler die Affiliate-Links erkennt, setze ich beim Erstellen eines Links im MD(X) künftig ein $-Zeichen vor den Partner.

[Trade Republic]($tradeRepublic)

Meine customComponents in der MDXRemote sehen jetzt also so aus:

// src/components/CustomStyledMDX.tsx

// ...
export const customComponents: MDXComponents = {
  /// nextjs components
  Image,
  /// html-elements compiled from md(x)
  a: (props) => {
    const { href, title, children, ...restProps } = props;
    if (href?.startsWith("#")) return <a {...props}>{children}</a>;
    if (href?.startsWith("/")) return <Link {...props}>{children}</Link>;
    if (href?.startsWith("$"))
      return (
        <AffiliateLink partner={href.slice(1)} tooltip={title} {...restProps}>
          {children}
        </AffiliateLink>
      );
    return <LinkExternal {...props}>{children}</LinkExternal>;
  },
  /// custom components
  SupportButton: ({ className }) => (
    <SupportButton className={`h-7 w-7 ${className}`} />
  ),
  // ...
};

// ...

Mögliche Affiliate Partner in Fehlermeldung

Dann hab ich noch schnell die möglichen Affiliate-Partner in die Fehlermeldung eingefügt. Bekommt man jetzt also einen Fehler, weil man einen falschen Affiliate-Partner verwendet bzw. sich verschrieben hat, kriegt man direkt noch eine Liste mit möglichen Partnern, die im globalen links-Objekt hinterlegt sind. Sweet! 😎

Fehler bei Eingabe von falschem Affiliate-Partner

Dafür habe ich auch die Fehler, also das errors-Objekt aus der siteConfig getrennt und ein eigenes Objekt bzw. eine eigene Datei gegeben.

Um meine Komponenten übersichtlicher zu halten, hab ich die 3 Link-Komponenten (Link, LinkExternal und AffiliateLink) in ein eigenes Unterverzeichnis verschoben.

Bis hierhin lief alles gut, dann aber bekam ich etwas Probleme...

Ich wollte nämlich bei dieser Gelegenheit auch gleich die LinkExternal-Komponente wieder in ExternalLink umbenennen. Nachdem ich fertig war, bekam ich beim Deployen bzw. beim Erstellen eines Builds folgenden fiesen Fehler:

./node_modules/next-mdx-remote/dist/rsc.js:6:0
Module not found: Can't resolve 'os'

Da ich keine Ahnung hatte, was hier passiert war, hab ich den Commit zurückgesetzt und bin noch einmal systematisch alle Schritte durchgegangen. Um zu checken wo der genau der Fehler auftritt, habe ich nach jedem Schritt einen neuen Build erstellt.

O la la

Der Fehler trat in meiner SocialLinks-Komponente auf und wurde von den Barrel-Imports ausgelöst. Durch die Barrel-Imports importiert man anscheinend immer alle Dateien in der Barrel-Datei. Das kann dann bei der Verwendung von Server- und Client-Komponenten zu unerwarteten Ergebnissen führen.

Der Fehler sagt nämlich, dass Node nicht ausgeführt werden kann, weil versucht wird, Node clientseitig auszuführen. Node funzt aber nur auf dem Server.

Diese Erkenntnis hat mich wieder ein paar Stunden gekostet. Aber der Bug ist gefixt und ich bin wieder etwas schlauer geworden.

Feedback

Schreib mir!