typescript - Nextjs Πώς να μεταφέρετε έναν προσαρμοσμένο φάκελο στην παραγωγή στο Vercel


Έχω αρχίσει πρόσφατα την ανάπτυξη στο περιβάλλον NextJS. Στο πρότζεκτ μου, έχω μερικά αρχεία JSON μέσα σε ένα φάκελο στον βασικό κατάλογο, και διαβάζω το περιεχόμενο αυτών των αρχείων μέσα στον κώδικά μου. Λειτουργεί καλά στον τοπικό μου υπολογιστή, αλλά όταν πηγαίνει σε παραγωγή στο διακομιστή της vercel, δεν μπορεί να διαβάσει το αρχείο γιατί το αρχείο δεν υπάρχει στον διακομιστή.

δώστε μου τη δομή αρχείων του έργου μου στον τοπικό υπολογιστή:

|--.next
|--components
|--jsonfiles
|--node_modules
|--pages
|--public
|--package.json

(and more)...

αλλά μετά την ανάπτυξη, όταν διαβάζω το περιεχόμενο του ριζικού καταλόγου χρησιμοποιώντας fs.readdirSync("./"), περιέχει μόνο τα ακόλουθα αρχεία και καταλόγους:

|--.next
|--___next_launcher.js
|--___vc_bridge.js
|--node_modules
|--package.json

και εδώ είναι ο κώδικας μου για την ανάγνωση του αρχείου:

   const fs = require('fs');
   const rawcontent = fs.readSync('./jsonfiles/list.json');
   const list:array[] = JSON.parse(rawcontent);
   ...

Υπάρχει κάποια λύση γι' αυτό το πρόβλημα;

Απάντηση #1

Η Vercel βασίζεται σε κάποια εσωτερική μαγεία με την αντικατάσταση/ενίσχυση μονάδων που γίνεται από το NextJS. Π.χ. αν εισάγετε το path συγχρονισμένα, μπορείτε να ελέγξετε ποιοι φάκελοι θα είναι αναγνώσιμοι στη Vercel. Ακούγεται περίεργο αλλά είναι αλήθεια!

export async function getStaticProps() {
  const path = await import("path").then(m => m.default) // won't be bundled
  path.resolve("content") // works, does nothing
  return {props: {}}
}

εναντίον

import "path" // won't be bundled unless used outside of SSR hooks

export async function getStaticProps() {
  path.resolve("content") // works, does nothing, makes "content" accessible to lambdas on Vercel 🤷
  return {props: {}}
}

Περισσότερες λεπτομέρειες εδώ: https://github.com/vercel/vercel/discussions/7971