Compilateur Next.js
Le compilateur Next.js, écrit en Rust avec SWC, permet à Next.js de transformer et minifier votre code JavaScript pour la production. Il remplace Babel pour les fichiers individuels et Terser pour la minification des bundles.
La compilation avec le compilateur Next.js est 17 fois plus rapide que Babel et est activée par défaut depuis Next.js version 12. Si vous avez une configuration Babel existante ou utilisez des fonctionnalités non prises en charge, votre application continuera à utiliser Babel au lieu du compilateur Next.js.
Pourquoi SWC ?
SWC est une plateforme extensible basée sur Rust pour la nouvelle génération d'outils de développement rapides.
SWC peut être utilisé pour la compilation, la minification, le bundling et plus encore – et est conçu pour être extensible. C'est un outil que vous pouvez appeler pour effectuer des transformations de code (soit intégrées, soit personnalisées). L'exécution de ces transformations se fait via des outils de plus haut niveau comme Next.js.
Nous avons choisi de construire sur SWC pour plusieurs raisons :
- Extensibilité : SWC peut être utilisé comme une Crate à l'intérieur de Next.js, sans avoir à forker la bibliothèque ou contourner des contraintes de conception.
- Performance : Nous avons pu obtenir un rafraîchissement ~3x plus rapide (Fast Refresh) et des builds ~5x plus rapides dans Next.js en passant à SWC, avec encore de la marge pour des optimisations supplémentaires.
- WebAssembly : Le support de WASM par Rust est essentiel pour supporter toutes les plateformes possibles et permettre le développement Next.js partout.
- Communauté : La communauté et l'écosystème Rust sont formidables et en pleine croissance.
Fonctionnalités prises en charge
Styled Components
Nous travaillons à porter babel-plugin-styled-components
vers le compilateur Next.js.
Premièrement, mettez à jour vers la dernière version de Next.js : npm install next@latest
. Ensuite, mettez à jour votre fichier next.config.js
:
Pour des cas d'utilisation avancés, vous pouvez configurer des propriétés individuelles pour la compilation de styled-components.
Note : Les transformations
ssr
etdisplayName
sont les principales exigences pour utiliserstyled-components
dans Next.js.
Jest
Le compilateur Next.js transpile vos tests et simplifie la configuration de Jest avec Next.js, notamment :
- Le mock automatique des imports
.css
,.module.css
(et leurs variantes.scss
), et des images - Configuration automatique de
transform
avec SWC - Chargement de
.env
(et toutes ses variantes) dansprocess.env
- Ignore
node_modules
pour la résolution et transformation des tests - Ignore
.next
pour la résolution des tests - Charge
next.config.js
pour les flags activant les transformations expérimentales SWC
Premièrement, mettez à jour vers la dernière version de Next.js : npm install next@latest
. Ensuite, mettez à jour votre fichier jest.config.js
:
Relay
Pour activer le support de Relay :
Bon à savoir : Dans Next.js, tous les fichiers JavaScript du répertoire
pages
sont considérés comme des routes. Donc, pourrelay-compiler
, vous devrez spécifier les paramètres de configurationartifactDirectory
en dehors depages
, sinonrelay-compiler
générera des fichiers à côté du fichier source dans le répertoire__generated__
, et ce fichier sera considéré comme une route, ce qui cassera les builds de production.
Supprimer les propriétés React
Permet de supprimer les propriétés JSX. Souvent utilisé pour les tests. Similaire à babel-plugin-react-remove-properties
.
Pour supprimer les propriétés correspondant à l'expression régulière par défaut ^data-test
:
Pour supprimer des propriétés personnalisées :
Supprimer les console
Cette transformation permet de supprimer tous les appels console.*
dans le code de l'application (pas dans node_modules
). Similaire à babel-plugin-transform-remove-console
.
Supprimer tous les appels console.*
:
Supprimer les sorties console.*
sauf console.error
:
Décorateurs legacy
Next.js détectera automatiquement experimentalDecorators
dans jsconfig.json
ou tsconfig.json
. Les décorateurs legacy sont couramment utilisés avec des versions plus anciennes de bibliothèques comme mobx
.
Ce flag est uniquement supporté pour la compatibilité avec les applications existantes. Nous ne recommandons pas d'utiliser les décorateurs legacy dans de nouvelles applications.
Premièrement, mettez à jour vers la dernière version de Next.js : npm install next@latest
. Ensuite, mettez à jour votre fichier jsconfig.json
ou tsconfig.json
:
importSource
Next.js détectera automatiquement jsxImportSource
dans jsconfig.json
ou tsconfig.json
et l'appliquera. Ceci est couramment utilisé avec des bibliothèques comme Theme UI.
Premièrement, mettez à jour vers la dernière version de Next.js : npm install next@latest
. Ensuite, mettez à jour votre fichier jsconfig.json
ou tsconfig.json
:
Emotion
Nous travaillons à porter @emotion/babel-plugin
vers le compilateur Next.js.
Premièrement, mettez à jour vers la dernière version de Next.js : npm install next@latest
. Ensuite, mettez à jour votre fichier next.config.js
:
Minification
Le compilateur swc de Next.js est utilisé pour la minification par défaut depuis la v13. C'est 7 fois plus rapide que Terser.
Bon à savoir : À partir de la v15, la minification ne peut plus être personnalisée via
next.config.js
. Le support du flagswcMinify
a été supprimé.
Transpilation de modules
Next.js peut transpiler et bundler automatiquement des dépendances depuis des packages locaux (comme des monorepos) ou des dépendances externes (node_modules
). Cela remplace le package next-transpile-modules
.
Modularisation des imports
Cette option a été remplacée par optimizePackageImports
dans Next.js 13.5. Nous recommandons de mettre à jour pour utiliser la nouvelle option qui ne nécessite pas de configuration manuelle des chemins d'import.
Define (Remplacement de variables pendant le build)
L'option define
vous permet de remplacer statiquement des variables dans votre code au moment du build.
L'option prend un objet comme paires clé-valeur, où les clés sont les variables à remplacer par les valeurs correspondantes.
Utilisez le champ compiler.define
dans next.config.js
pour définir des variables pour tous les environnements (serveur, edge et client). Ou utilisez compiler.defineServer
pour définir des variables uniquement pour le code côté serveur (serveur et edge) :
Hooks du cycle de vie du build
Le compilateur Next.js supporte des hooks de cycle de vie qui vous permettent d'exécuter du code personnalisé à des moments spécifiques du processus de build. Actuellement, le hook suivant est supporté :
runAfterProductionCompile
Une fonction hook qui s'exécute après la fin de la compilation du build de production, mais avant l'exécution des tâches post-compilation comme la vérification des types et la génération des pages statiques. Ce hook donne accès aux métadonnées du projet incluant le répertoire du projet et le répertoire de sortie du build, ce qui le rend utile pour les outils tiers afin de collecter les sorties de build comme les sourcemaps.
Le hook reçoit un objet avec les propriétés suivantes :
distDir
: Le répertoire de sortie du build (par défaut.next
)projectDir
: Le répertoire racine du projet
Fonctionnalités expérimentales
Profilage des traces SWC
Vous pouvez générer les traces internes de transformation de SWC au format trace event de chromium.
Une fois activé, swc générera une trace nommée swc-trace-profile-${timestamp}.json
sous .next/
. Le visualiseur de traces de chromium (chrome://tracing/, https://ui.perfetto.dev/), ou un visualiseur de flamegraph compatible (https://www.speedscope.app/) peut charger et visualiser les traces générées.
Plugins SWC (expérimental)
Vous pouvez configurer la transformation SWC pour utiliser le support expérimental des plugins SWC écrits en wasm afin de personnaliser le comportement de transformation.
swcPlugins
accepte un tableau de tuples pour configurer les plugins. Un tuple pour le plugin contient le chemin vers le plugin et un objet pour la configuration du plugin. Le chemin vers le plugin peut être un nom de package npm ou un chemin absolu vers le binaire .wasm
lui-même.
Fonctionnalités non prises en charge
Lorsque votre application a un fichier .babelrc
, Next.js reviendra automatiquement à l'utilisation de Babel pour transformer les fichiers individuels. Cela assure une compatibilité descendante avec les applications existantes qui utilisent des plugins Babel personnalisés.
Si vous utilisez une configuration Babel personnalisée, partagez votre configuration. Nous travaillons à porter autant de transformations Babel couramment utilisées que possible, ainsi qu'à supporter les plugins dans le futur.
Historique des versions
Version | Changements |
---|---|
v13.1.0 | Transpilation de modules et Modularisation des imports stables. |
v13.0.0 | Minification SWC activée par défaut. |
v12.3.0 | Minification SWC stable. |
v12.2.0 | Support expérimental des plugins SWC ajouté. |
v12.1.0 | Ajout du support pour Styled Components, Jest, Relay, Suppression des propriétés React, Décorateurs legacy, Suppression des console, et jsxImportSource. |
v12.0.0 | Compilateur Next.js introduit. |