typescript - Comment désactiver resolveJsonModule pour un seul fichier JSON dans une application NextJs ?
Je suis en train de créer une application Next.js, en la déployant avec Vercel. Tout fonctionnait bien, jusqu'à ce que je fasse récemment quelques modifications sur un gros fichier JSON, ce qui a encore augmenté sa taille d'environ 20 %. L'augmentation de taille semble avoir dépassé une sorte de limite, et je reçois maintenant des erreurs Webpack 5, qui semblent être dues à la résolution des types TypeScript.
J'importe le fichier JSON directement avec un import. D'après ce que j'ai pu comprendre, il semble que l'option de compilation resolveJsonModule dans tsconfig.json soit responsable de dire à webpack d'essayer de résoudre les types des fichiers JSON à la volée, afin qu'il puisse vraisemblablement vérifier que je fais des choses sensées avec le fichier JSON.
C'est en fait un fichier assez simple - c'est juste un tableau d'objets FoodItem assez simples comme suit (exemple illustratif ci-dessous) :
import allFoodOriginal from '../data/all-food-data.json'
interface FoodData {
Calories: string,
Kilojoules: string
}
interface FoodItem {
id: number,
name: string,
folders: string[],
slug: string,
image?: string,
data?: FoodData
}
const allFood = allFoodOriginal as FoodItem[]
Le fichier JSON lui-même fait environ 1,4 million de lignes, ce qui correspond à environ 82 021 éléments. Il semble que ce soit tout simplement trop volumineux, car il provoque l'erreur dans les journaux ci-dessous lors de la compilation dans le déploiement Vercel.
14:39:23.522 Installing dependencies...
14:39:28.885 npm WARN @babel/[email requires a peer of @babel/core@^7.0.0-0 but none is installed. You must install peer dependencies yourself.
14:39:28.896 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: @next/[email (node_modules/@next/swc-darwin-arm64):
14:39:28.896 npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for @next/[email : wanted {"os":"darwin","arch":"arm64"} (current: {"os":"linux","arch":"x64"})
14:39:28.907 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: @next/[email (node_modules/@next/swc-win32-x64-msvc):
14:39:28.908 npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for @next/[email : wanted {"os":"win32","arch":"x64"} (current: {"os":"linux","arch":"x64"})
14:39:28.922 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email (node_modules/fsevents):
14:39:28.922 npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email : wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
14:39:28.933 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: @next/[email (node_modules/@next/swc-darwin-x64):
14:39:28.933 npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for @next/[email : wanted {"os":"darwin","arch":"x64"} (current: {"os":"linux","arch":"x64"})
14:39:28.934
14:39:28.935 updated 1 package in 4.846s
14:39:29.060
14:39:29.060 50 packages are looking for funding
14:39:29.060 run `npm fund` for details
14:39:29.061
14:39:29.847 Detected Next.js version: 11.1.2
14:39:29.850 Running "npm run build"
14:39:30.131
14:39:30.131 > [email build /vercel/path0
14:39:30.131 > next build
14:39:30.132
14:39:30.868 info - Using webpack 5. Reason: Enabled by default https://nextjs.org/docs/messages/webpack5
14:39:31.072 info - Checking validity of types...
14:45:11.987
14:45:11.989 > Build error occurred
14:45:12.003 RangeError: Value undefined out of range for undefined options property undefined
14:45:12.004 at Map.set (<anonymous>)
14:45:12.004 at recursiveTypeRelatedTo (/vercel/path0/node_modules/typescript/lib/typescript.js:62613:30)
14:45:12.004 at isRelatedTo (/vercel/path0/node_modules/typescript/lib/typescript.js:62112:34)
14:45:12.004 at checkTypeRelatedTo (/vercel/path0/node_modules/typescript/lib/typescript.js:61742:26)
14:45:12.004 at isTypeRelatedTo (/vercel/path0/node_modules/typescript/lib/typescript.js:61694:24)
14:45:12.005 at removeSubtypes (/vercel/path0/node_modules/typescript/lib/typescript.js:58445:33)
14:45:12.005 at getUnionType (/vercel/path0/node_modules/typescript/lib/typescript.js:58547:31)
14:45:12.005 at checkArrayLiteral (/vercel/path0/node_modules/typescript/lib/typescript.js:70038:17)
14:45:12.005 at checkExpressionWorker (/vercel/path0/node_modules/typescript/lib/typescript.js:76283:28)
14:45:12.005 at checkExpression (/vercel/path0/node_modules/typescript/lib/typescript.js:76204:38)
14:45:12.146 npm ERR! code ELIFECYCLE
14:45:12.146 npm ERR! errno 1
14:45:12.150 npm ERR! [email build: `next build`
14:45:12.150 npm ERR! Exit status 1
14:45:12.151 npm ERR!
14:45:12.151 npm ERR! Failed at the [email build script.
14:45:12.151 npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
14:45:12.157
14:45:12.157 npm ERR! A complete log of this run can be found in:
14:45:12.158 npm ERR! /vercel/.npm/_logs/2021-10-26T13_45_12_151Z-debug.log
14:45:12.174 Error: Command "npm run build" exited with 1
En exécutant localement npm run build, je reçois simplement une erreur de mémoire du tas Javascript.
Je suis heureux de ne pas avoir à m'occuper de la vérification de type du fichier JSON, mais je ne sais pas comment désactiver la vérification de type depuis mon application NextJs.
Si je définis resolveJsonModule sur false, il est automatiquement remis à true par le processus de build qui prétend savoir mieux.
Y a-t-il des options pour désactiver la vérification de type uniquement pour ce fichier JSON ?
Mise à jour
Il est apparemment possible de surmonter cette erreur spécifique de vérification de type en chargeant le fichier JSON avec le module fs :
import fs from 'fs'
import path from 'path'
const allFood = JSON.parse(fs.readFileSync(path.join(process.cwd(), '/data/all-food-data.json'), 'utf-8')) as FoodItem[]
Cependant, cela a introduit une erreur différente, où les pages ne se généraient plus dynamiquement à la demande, et à la place j'obtenais une erreur 404. Si je mets l'appel fs.readFileSync() à l'intérieur de la fonction getStaticProps, alors j'obtiens une erreur 500. Ces erreurs n'étaient présentes que lors du déploiement sur Vercel, et la version locale fonctionnait toujours correctement.
Il peut y avoir un moyen de résoudre ces problèmes, mais j'ai fini par trouver une solution de contournement différente :
Solution de contournement
Il a suffi de diviser le fichier JSON en deux fichiers plus petits et de les fusionner à l'exécution pour résoudre le problème.
import allFood1 from '../data/all-food-data.json'
import allFood2 from '../data/all-food-data-2.json'
const allFood = [...(allFood1 as FoodItem[]), ...(allFood2 as FoodItem[])] as FoodItem[]
Ce n'est pas vraiment une réponse particulièrement satisfaisante, donc je vais laisser la question sans réponse dans l'espoir de trouver une meilleure façon de la surmonter.