vite - „ReferenceError: exports nu este definit” pentru un monorepo TypeScript + SvelteKit folosind pnpm
Încerc să construiesc un monorepo în jurul aplicației mele SvelteKit, unde aplicația și diversele pachete din monorepo sunt toate scrise în TypeScript.
Aplicația SvelteKit funcționează bine, până când încerc să creez un link simbolic către un anumit pachet din monorepo. Pachetul problemă depinde de @redis/client (la care m-aș aștepta să fie foarte fiabil) și mesajul de eroare face referire la acel modul:
ReferenceError: exports nu este definit la /@fs/Users/me/project/node_modules/.pnpm/@[email /node_modules/@redis/client/dist/index.js:16:23 la instantiateModule (file:///Users/me/project/node_modules/.pnpm/[email /node_modules/vite/dist/node/chunks/dep-ca21228b.js:52420:15)
Dacă, în schimb, public pachetele monorepo în registrul nostru privat de pachete GitHub și le instalez de acolo, funcționează bine... așa că aș crede că modul în care îmi construiesc pachetele TS este ok... Dar, pentru referință, iată un fragment din package.json al pachetului care depinde de @redis/client:
"type": "module",
"types": "dist/index.d.ts",
"exports": {
"import": "./dist/index.js",
"require": "./dist/index.cjs"
},
și tsconfig-ul din același pachet:
{
"compilerOptions": {
"target": "es6", //also tried ES2022
"module": "commonjs", //also tried ES2022
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true,
"noUncheckedIndexedAccess": true,
"noEmit": true,
"moduleResolution": "node"
}
}
Aplicația SvelteKit, așa cum este tipic, are type=module în package.json și folosește Vite. Configurația vite este destul de simplă:
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vitest/config';
export default defineConfig({
plugins: [sveltekit()],
test: {
include: ['src/**/*.{test,spec}.{js,ts}']
}
});
Folosește, într-adevăr, un tsconfig ușor diferit, care a fost generat pentru mine de vrăjitorul de creare a aplicațiilor noi din SvelteKit:
{
"extends": "./.svelte-kit/tsconfig.json",
"compilerOptions": {
"allowJs": true,
"checkJs": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"ignoreDeprecations": "5.0"
}
}
Deoarece funcționează dacă pachetele sunt publicate într-un depozit privat de pachete și instalate în mod obișnuit folosind pnpm, trebuie să cred că acesta este un fel de problemă de configurare Vite.
Am încercat fiecare permutare la care mă pot gândi pentru a face ca setările optimizeDeps.include și/sau build.commonjsOptions.include din configurația Vite să rezolve acest lucru, pe baza unei sugestii de la cineva de pe un server Discord; dar nu am observat nicio schimbare. Nici măcar nu sunt sigur dacă urmărim direcția corectă.
Am creat aici cel mai mic caz posibil de reproducere, incluzând o listă a pașilor pe care i-am urmat pentru a crea reproducerea, în ordinea în care i-am făcut.
Dacă te uiți la codul de reproducere și te întrebi de ce aș vrea să împachetez @redis/client în acest fel, răspunsul se află în toate lucrurile pe care le omit din motive de afaceri, concizie a codului de reproducere etc. Îți asigur că trebuie făcut în acest fel; dar pe scurt, metoda
getRedisdin proiectul real acceptă unele argumente care definesc ce mediu și ce client (de exemplu, ABC, producție) dorim să conectăm la clientul redis și caută configurația corectă și returnează un client conectat.
Răspuns #1
Se pare că acest lucru ar putea avea legătură cu modul în care Vite gestionează link-urile simbolice generate de pnpm. Se pare că schimbarea configurației tale în:
export default defineConfig({
plugins: [sveltekit()],
resolve: {
preserveSymlinks: true,
},
});
conform https://v2.vitejs.dev/config/#resolve-preservesymlinks rezolvă Internal server error: exports is not defined. Încă primesc Error: The client is closed, dar presupun că acesta este comportamentul așteptat.
