reactjs - Kan ikke bruke 'fs' i getInitialProps
Jeg prøver å få innholdet i en analysert fil inne i getInitialProps når visningen min lastes, problemet er at det sier til meg at Module not found: Can't resolve 'fs' og jeg forstår ikke hvorfor - ifølge dokumentasjonen gjør det det mulig med server-side rendering.
Min API-rute:
import parseCommands, { ICommands } from "../../modules/parser/json";
export const getCommands = (): ICommands => {
const commands = parseCommands("data.json");
return commands;
};
Min React-visning:
import { NextPage } from "next";
import { getCommands } from "../../pages/api/commands";
import { ICommands } from "../../modules/parser/json";
import styles from "./commands.module.scss";
type Props = {
commands: ICommands;
};
const Commands:NextPage<Props> = ({ commands }) => {
return (
<div className={styles.wrapper}>
{commands}
</div>
);
};
Commands.getInitialProps = async () => {
const commands:ICommands = await getCommands();
return {
commands
};
};
export default Commands;
Min fil prøver å importere modulen 'fs':
import fs from "fs";
[...]
const parseCommands = (path: string): ICommands => {
const file:string = fs.readFileSync(path, "utf8");
const json:any = JSON.parse(file);
const commands:ICommands = parseData(json);
return commands;
};
export default parseCommands;
Hva gjør jeg galt?
Svar #1
Du må oppdatere Next.js-versjonen din - Oppdater for moderne Next.js (9.4+)
Du kan også trenge å lage en next.config.js-fil med følgende innhold for å få klientpakken til å bygge:
module.exports = {
webpack: (config, { isServer }) => {
// Fixes npm packages that depend on `fs` module
if (!isServer) {
config.node = {
fs: 'empty'
}
}
return config
}
}
Svar #2
getInitialProps kjører både på server- og klientsiden, så det er ikke mulig å bruke fs uten å lage forgreningslogikk. Bruk getServerSideProps i stedet.
Du kan fikse modulen midlertidig med Ors svar, men det er bare en måte å omgå problemet på.
Alternativt kan du lage en gren i getInitialProps for å avgjøre om vi er på serveren når koden kjøres. Du bør ikke bruke readFileSync i nettserverkode.
export const getInitialProps = async ({ req }) => {
if (res === undefined) {
return { commands: [] }
}
const fs = await import('fs')
const readFile = fs.promises.readFile;
return { commands: await readFile(...) }
}
