react-dsfr icon indicating copy to clipboard operation
react-dsfr copied to clipboard

Support de Turbopack sur Next 15 ?

Open ToolReaz opened this issue 1 year ago ‱ 7 comments

Bonjour,

Est-ce que cette librairie supporte l'utilisation de Turbopack dans un projet Next 15 ?

La documentation indique d'ajouter dans le next.config.js:

  webpack: (config) => {
    config.module.rules.push({
      test: /\.woff2$/,
      type: 'asset/resource',
    })
    return config
  },

Ce qui ne fonctionne plus avec Turbopack (qui supporte les fichiers .woff2 par défaut).

D'apres mes tests la libraire fonctionne mais avec des comportements étranges:

  • Navigation ne s'affiche pas
  • Sous menus de la navigation ne s'ouvrent pas
  • Header proprietĂ© brandTop qui ne s'affiche pas

Le support de Turbopack serait vraiment un plus, je continue mes recherches de mon coté.

ToolReaz avatar Jan 15 '25 16:01 ToolReaz

Hello @ToolReaz,

Ce qui ne fonctionne plus avec Turbopack (qui prend en charge les fichiers .woff2 par défaut).

L’objectif est que Next comprenne qu’il doit importer les fichiers .woff2 comme des URLs :

https://github.com/codegouvfr/react-dsfr/blob/main/src/next-appdir/zz_internal/fontUrlByFileBasename.ts

C’est peut-ĂȘtre le cas par dĂ©faut, mais il y a probablement une option Ă  activer pour le garantir.

D’aprĂšs mes tests, la librairie fonctionne, mais avec des comportements Ă©tranges :

đŸ˜© Cela vient probablement du fait que Next ne transpile pas correctement le CSS, ce qui est un problĂšme rĂ©current.

Si tu es prĂȘt Ă  nous aider, on peut t’onboard sur le projet !

garronej avatar Jan 15 '25 18:01 garronej

Re,

đŸ˜© Cela vient probablement du fait que Next ne transpile pas correctement le CSS, ce qui est un problĂšme rĂ©current.

AprÚs quelques tests je pense que c'est le JSX qui est mal transpilé... notamment cette partie là qui ne retourne rien:

// Header.tsx
{(() => {
    const children = (
        <p className={fr.cx("fr-logo")}>{brandTop}</p>
    );

    return serviceTitle !== undefined ? (
        children
    ) : (
        <Link {...homeLinkProps}>{children}</Link>
    );
})()}

En utilisant le test d’intĂ©gration next-appdir dans le repo et en le passant sous Next 14 avec Turbo cela fonctionne toujours. Ce n'est qu'a partir de la version 15 que ça casse. De mĂȘme en rĂ©trogradant mon projet vers 14 cela corrige le problĂšme.

Je vais essayer d'identifier plus précisément la cause de la non transpilation pour éventuellement ouvrir une issue chez Next.

ToolReaz avatar Jan 17 '25 13:01 ToolReaz

Super top merci!

garronej avatar Jan 17 '25 15:01 garronej

@garronej Alors j'ai aussi des problÚmes et j'ai fait un repo de reproduction. C'est vraiment trÚs handicapant car Next chez FCU devient de plus en plus lourd à utiliser et Turbo permet de revenir à un confort de développement parfait mais le DSFR n'étant plus utilisable en l'état est problématique.

Erreur Ă  l'utilisation 1 (solution trouvĂ©e ✅)

La premiÚre erreur trouvée est Error: Failed to load external module @codegouvfr/react-dsfr/Card.js: SyntaxError: Cannot use import statement outside a module et cela peut etre corrigé en utilisant

  transpilePackages: ['@codegouvfr/react-dsfr'],

dans next.config.ts

Erreur à l'utilisation de getLink (Besoin d'aide 🆘)

Cette erreur la est plus compliquée et reproductible ici. Cela donne ReferenceError: React is not defined et je ne trouve pas de solution, si ce n'est de

  • copier le composant dans mon code
  • supprimer les rĂ©fĂ©rences Ă  getLink (J'ai passĂ© plusieurs heures Ă  isoler ce problĂšme Ă©tant donnĂ© le message trĂšs peu parlant)

je pense que cette utilisation de getLink avec setLink et un let Link est Ă  l'origine du problĂšme mais je ne trouve pas de solution.

Chargement des svg (solution partielle trouvĂ©e ⚠)

par défaut, turbo n'a pas de loader pour les svg mais on peut les faire supporter par la config de cette maniÚre

experimental: {
    turbo: {
      rules: {
        '*.svg': {
          loaders: ['@svgr/webpack'],
          as: '*.js',
        },
      },
    },
  },

Le problÚme est que cela va supprimer tous les svg loadés en css :-(, j'ai donc du renommer mes fichiers svg à loader directement sous forme de composant par des .svgr (extension complÚtement arbitraire, qui rappelle le nom du loader)

experimental: {
    turbo: {
      rules: {
        '*.svgr': {
          loaders: ['@svgr/webpack'],
          as: '*.js',
        },
      },
    },
  },

Chargement des markdown (solution trouvĂ©e ✅)

pareil

experimental: {
    turbo: {
      rules: {
         '*.md': {
          loaders: ['raw-loader'],
          as: '*.js',
        },
      },
    },
  },

martinratinaud avatar Mar 31 '25 07:03 martinratinaud

Hello @martinratinaud,

Thanks a lot for the detailed breakdown, this kind of issue report is super helpful!

I'll look into what can be done.
But once again, Vercel is shipping half-baked features and offloading the responsibility of making things work onto the ecosystem.

Turbopack also breaks tss-react, and there’s nothing particularly unusual about it. It's ISO-compliant, shipped in both ESM and CJS formats.

I honestly don’t understand how they thought Turbopack was ready to be the default...
Well, I do get it, if you’re not on an M-series Mac, the webpack based Next dev experience feels painfully slow.

garronej avatar Mar 31 '25 10:03 garronej

Thanks

Well 'im on a M1 and webpack is definitely too slow on dev and causing frustration. I agree that NextJs is definitely making it less and less interesting to use it but unfortunately, I think a lot of projects in the Beta ecosystem are using it and feel the same pain than me every day.

I checked the react-dsfr code and this whole getLink thing seems like something I never saw before in component libraries. I'm curious why it is, and how you think it can break turbopack.

Thanks

martinratinaud avatar Mar 31 '25 10:03 martinratinaud

I finally found a way out of this problematic by doing the following

  1. Use aliases only for turbo and for problematic components (ones which use getLink
experimental: {
    turbo: {
      resolveAlias: {
        '@codegouvfr/react-dsfr/Breadcrumb': '@/components/turbo/Breadcrumb',
        '@codegouvfr/react-dsfr/Button': '@/components/turbo/Button',
        '@codegouvfr/react-dsfr/ButtonsGroup': '@/components/turbo/ButtonsGroup',
        '@codegouvfr/react-dsfr/Card': '@/components/turbo/Card',
        '@codegouvfr/react-dsfr/Footer': '@/components/turbo/Footer',
        '@codegouvfr/react-dsfr/Header': '@/components/turbo/Header',
        '@codegouvfr/react-dsfr/MainNavigation': '@/components/turbo/MainNavigation',
        '@codegouvfr/react-dsfr/Menu': '@/components/turbo/Menu',
        '@codegouvfr/react-dsfr/MegaMenu': '@/components/turbo/MegaMenu',
        '@codegouvfr/react-dsfr/Tile': '@/components/turbo/Tile',
      },
      rules: {
        '*.svgr': {
          loaders: ['@svgr/webpack'],
          as: '*.js',
        },
        '*.md': {
          loaders: ['raw-loader'],
          as: '*.js',
        },
      },
    },
  },
  1. Create the problematic components by copy pasting from GitHub and removing the use of const { Link } = getLink() and replacing it with a standard import. Check this commit for reference

💡 And for those who wonder, it is worth it as load times are insanely faster

martinratinaud avatar Apr 01 '25 12:04 martinratinaud

Bonjour, Y-a-t il des avancées sur ce sujet ? Un grand merci pour tout le travail incroyablement utile pour nos projets !

Charlesdoiron avatar Jul 03 '25 11:07 Charlesdoiron

Je viens de tester avec la derniere version de Next 15.4.1 et je n'ai plus les erreurs que je decrivais initialement.

ToolReaz avatar Jul 18 '25 18:07 ToolReaz

Thank you for reporting @ToolReaz!

garronej avatar Jul 19 '25 05:07 garronej