Nuxt config

Le fichier nuxt.config.ts est le cœur de la configuration de l'application Nuxt 3. Il définit toutes les options, modules, plugins et paramètres nécessaires au bon fonctionnement de l'application e-commerce B2B Djust Front Partners Starter.

Architecture de Configuration

graph TB
    subgraph "Configuration Nuxt"
        APP[Configuration Application]
        MODULES[Modules Nuxt]
        RUNTIME[Runtime Config]
        VITE[Configuration Vite]
        PLUGINS[Plugins]
    end

    subgraph "Modules Intégrés"
        UI[@nuxt/ui]
        I18N[@nuxtjs/i18n]
        STORYBLOK[@storyblok/nuxt]
        PINIA[@pinia/nuxt]
        IMAGE[@nuxt/image]
        ICON[@nuxt/icon]
        FONTS[@nuxt/fonts]
        ESLINT[@nuxtjs/eslint-module]
    end

    APP --> MODULES
    MODULES --> UI
    MODULES --> I18N
    MODULES --> STORYBLOK
    MODULES --> PINIA
    MODULES --> IMAGE
    MODULES --> ICON
    MODULES --> FONTS
    MODULES --> ESLINT

    style APP fill:#e1f5fe
    style MODULES fill:#f3e5f5
    style RUNTIME fill:#fff3e0

Configuration de Base

1. Configuration Application

export default defineNuxtConfig({
  // Désactive le Server-Side Rendering
  ssr: false,

  // Configuration de l'application
  app: {
    baseURL: process.env.BASE_URL,
    head: {
      title: "Djust Front Partners Starter",
      link: [
        {
          rel: "icon",
          type: "image/x-icon",
          href: "/favicon.ico",
        },
      ],
    },
  },

  // Date de compatibilité Nuxt
  compatibilityDate: "2024-09-23",
});

Options Détaillées

OptionValeurDescriptionImpact
ssrfalseDésactive le rendu côté serveurApplication SPA uniquement
app.baseURLprocess.env.BASE_URLURL de base de l'applicationRouting et assets
app.head.title'Djust Front Partners Starter'Titre par défautSEO et navigation
compatibilityDate'2024-09-23'Version de compatibilité NuxtFonctionnalités disponibles

2. Outils de Développement

{
  // Désactive les devtools Nuxt
  devtools: {
    enabled: false,
  },

  // Configuration des sourcemaps
  sourcemap: {
    server: true,
    client: true,
  },
}
OptionValeurDescriptionUsage
devtools.enabledfalseDésactive l'interface devtoolsPerformance en développement
sourcemap.servertrueActive les sourcemaps serveurDebug côté serveur
sourcemap.clienttrueActive les sourcemaps clientDebug côté client

Configuration des Imports

Auto-imports

{
  imports: {
    dirs: ['shared', 'shared/**/*', 'composables/**/*'],
  },
}

Description : Configure l'auto-import pour les composables et utilitaires partagés.

Dossiers inclus :

  • shared/ : Types et utilitaires partagés
  • shared/**/* : Tous les sous-dossiers shared
  • composables/**/* : Tous les composables de l'application

Avantages :

  • ✅ Import automatique des composables
  • ✅ Pas besoin d'imports explicites
  • ✅ Meilleure DX (Developer Experience)

Configuration Nitro (Serveur)

Options Nitro

{
  nitro: {
    experimental: {
      openAPI: true,
    },
    payloadExtraction: false,
    routeRules: {
      '/': {
        cors: {
          origin: ['*'],
          methods: ['POST', 'OPTIONS'],
          allowHeaders: ['Content-Type', 'Authorization'],
        },
      },
      '/api/impersonate': {
        cors: {
          origin: ['*'],
          methods: ['POST', 'OPTIONS'],
          allowHeaders: ['Content-Type', 'Authorization'],
        },
      },
    },
  },
}

Configuration CORS

RouteConfigurationDescription
/origin: ['*']Autorise toutes les origines
/api/impersonatemethods: ['POST', 'OPTIONS']Méthodes autorisées
ToutesallowHeaders: ['Content-Type', 'Authorization']Headers autorisés

Utilité :

  • ✅ API ouverte : Permet les appels cross-origin
  • ✅ Impersonation : Support des changements de compte
  • ✅ Sécurité : Headers contrôlés

Modules Nuxt

Liste des Modules

{
  modules: [
    '@nuxt/ui',              // Interface utilisateur
    '@nuxt/icon',            // Gestion des icônes
    '@nuxtjs/i18n',          // Internationalisation
    '@storyblok/nuxt',       // CMS Storyblok
    '@pinia/nuxt',           // Gestion d'état
    '@nuxtjs/eslint-module', // Linting
    '@nuxt/image',           // Optimisation images
    '@nuxt/fonts',           // Gestion des polices
  ],
}

Configuration Détaillée des Modules

1. Nuxt UI & Interface

{
  // Mode couleur
  colorMode: {
    preference: 'light',
  },

  // Configuration des icônes
  icon: {
    customCollections: [
      {
        prefix: 'djust-icon',
        dir: './assets/icons',
      },
    ],
  },

  // Configuration des polices
  fonts: {
    families: [
      { name: 'Inter', provider: 'google' },
      { name: 'Roboto', provider: 'google' },
    ],
  },
}

2. Nuxt Image

{
  image: {
    storyblok: {
      baseURL: 'https://a.storyblok.com',
    },
  },
}

Fonction : Optimisation automatique des images depuis Storyblok CMS.

3. Internationalisation (i18n)

{
  i18n: {
    lazy: true,
    langDir: 'locales',
    strategy: 'prefix_except_default',
    defaultLocale: process.env.LOCALE === 'en-GB' ? 'en-GB' : 'fr-FR',
    locales: [
      {
        code: 'fr-FR',
        file: 'fr-FR.json',
        label: 'Francais',
        icon: 'cif:fr',
        abbr: 'fr'
      },
      {
        code: 'en-GB',
        file: 'en-GB.json',
        label: 'English',
        icon: 'cif:gb',
        abbr: 'en'
      },
    ],
  },
}

Configuration i18n :

OptionValeurDescription
lazytrueChargement paresseux des traductions
strategyprefix_except_defaultPas de préfixe pour la langue par défaut
defaultLocaleVariable d'environnementLangue par défaut dynamique

4. Storyblok CMS

{
  storyblok: {
    accessToken: process.env.STORYBLOK_ACCESS_TOKEN,
    componentsDir: '~/components/storyblok',
    devtools: false,
    apiOptions: {
      cache: { type: 'memory', clear: 'manual' },
    },
  },
}

Fonctionnalités :

  • ✅ CMS Headless : Gestion de contenu
  • ✅ Composants dédiés : Dossier séparé
  • ✅ Cache mémoire : Performance optimisée

5. Pinia (State Management)

{
  pinia: {
    storesDirs: ['./stores/**'],
  },
}

Organisation : Auto-découverte des stores dans le dossier stores/.

Configuration des Composants

Auto-registration

{
  components: [
    {
      path: '~/components/storyblok',
      global: true,
    },
    {
      path: '~/components',
      pathPrefix: false,
      global: true,
    },
  ],
}

Structure :

DossierConfigurationUsage
~/components/storyblokglobal: trueComposants CMS globaux
~/componentspathPrefix: falseComposants app sans préfixe

Avantages :

  • ✅ Import automatique des composants
  • ✅ Organisation claire CMS vs App
  • ✅ Disponibilité globale

Assets et Styles

Configuration CSS

{
  css: [
    '~/assets/css/variables.scss',
    '~/assets/css/main.css'
  ],
}

Fichiers chargés globalement :

  1. variables.scss : Variables CSS/SCSS personnalisées
  2. main.css : Styles principaux (Tailwind CSS)

Plugins

Liste des Plugins

{
  plugins: [
    '~/plugins/djust-user.ts',
    '~/plugins/djust-cart.ts',
    '~/plugins/djust-buyingList.ts'
  ],
}

Plugins Djust :

PluginFonctionTiming
djust-user.tsInitialisation utilisateurStartup
djust-cart.tsInitialisation panierStartup
djust-buyingList.tsInitialisation liste d'achatStartup

Runtime Configuration

Configuration Publique

{
  runtimeConfig: {
    public: {
      // === STORYBLOK === //
      storyblokVersion: process.env.STORYBLOK_VERSION || 'published',
      storyblokStories: process.env.STORYBLOK_STORIES_LIST || '',

      // === API DJUST === //
      apiBaseUrl: process.env.VITE_API_BASE_URL,
      djApiClient: process.env.VITE_DJ_API_CLIENT,
      djApiKey: process.env.VITE_DJ_API_KEY,
      djStoreId: process.env.STORE_ID,
      djStoreViewId: process.env.STORE_VIEW_ID,

      // === LOCALISATION === //
      locale: process.env.LOCALE,
      currency: process.env.DEFAULTCURRENCY,
      currencies: process.env.CURRENCIES ?? process.env.DEFAULTCURRENCY,

      // === APPLICATION === //
      defaultIdType: process.env.DEFAULT_ID_TYPE,
      defaultPaginationSize: process.env.DEFAULT_PAGINATION_SIZE || '20',
      frontMode: process.env.FRONT_MODE || 'private',
      multiStores: process.env.MULTI_STORES === 'true',
      applicationEnv: process.env.APPLICATION_ENV,
      clientName: process.env.CLIENT_NAME,
      sentryDsn: process.env.SENTRY_DSN,
      appVersion: pkg.version,
    },
  }
}

Configuration Privée (Serveur)

{
  runtimeConfig: {
    // Accessible uniquement côté serveur
    apiBaseUrl: process.env.VITE_API_BASE_URL,
    djApiClient: process.env.VITE_DJ_API_CLIENT,
    djApiKey: process.env.VITE_DJ_API_KEY,
    djStoreId: process.env.STORE_ID,
    djStoreViewId: process.env.STORE_VIEW_ID,
    currency: process.env.DEFAULTCURRENCY,
    currencies: process.env.CURRENCIES ?? process.env.DEFAULTCURRENCY,
    locale: process.env.LOCALE,
    defaultPaginationSize: process.env.DEFAULT_PAGINATION_SIZE || '20',
    frontMode: process.env.FRONT_MODE || 'private',
  }
}

Tableau des Variables Runtime

CatégorieVariablePublicPrivéDescription
StoryblokstoryblokVersion✅❌Version du contenu
API DjustapiBaseUrl✅✅URL de base API
API DjustdjApiClient✅✅ID Client
API DjustdjApiKey✅✅Clé API
MagasindjStoreId✅✅ID Magasin
Localisationlocale✅✅Langue par défaut
ApplicationappVersion✅❌Version de l'app

Configuration Vite

Options Vite

{
  vite: {
    // Configuration SSR
    ssr: {
      external: ['@sentry/node'],
    },

    // Alias de résolution
    resolve: {
      alias: {
        '~': fileURLToPath(new URL('./', import.meta.url)),
      },
    },

    // Plugins Vite
    plugins: [
      svgLoader(),      // Chargement des SVG
      tailwindcss()     // Tailwind CSS
    ],

    // Assets inclus
    assetsInclude: ['**/*.mdx'],

    // Préprocesseurs CSS
    css: {
      preprocessorOptions: {
        sass: {
          api: 'modern',
        },
        scss: {
          api: 'modern',
        },
      },
    },
  },
}

Détails Configuration Vite

Plugins Intégrés

PluginFonctionSource
svgLoader()Import SVG comme composantsvite-svg-loader
tailwindcss()Support Tailwind CSS@tailwindcss/vite

Préprocesseurs CSS

css: {
  preprocessorOptions: {
    sass: { api: 'modern' },    // API Sass moderne
    scss: { api: 'modern' },    // API SCSS moderne
  },
}

Avantages :

  • ✅ Performance : API moderne plus rapide
  • ✅ Compatibilité : Support des dernières fonctionnalités
  • ✅ Stabilité : API recommandée

Variables d'Environnement Utilisées

Tableau Complet

VariableObligatoireDéfautDescription
BASE_URL❌undefinedURL de base application
LOCALE❌'fr-FR'Langue par défaut
VITE_API_BASE_URL✅-URL API Djust
VITE_DJ_API_CLIENT✅-Client ID Djust
VITE_DJ_API_KEY✅-Clé API Djust
STORE_ID✅-ID Magasin
STORE_VIEW_ID✅-ID Vue Magasin
DEFAULTCURRENCY❌'EUR'Devise par défaut
CURRENCIES❌DEFAULTCURRENCYDevises supportées
DEFAULT_PAGINATION_SIZE❌'20'Taille pagination
FRONT_MODE❌'private'Mode frontend
MULTI_STORES❌'false'Support multi-magasins
APPLICATION_ENV❌-Environnement app
CLIENT_NAME❌-Nom client
SENTRY_DSN❌-URL Sentry
STORYBLOK_ACCESS_TOKEN❌-Token Storyblok
STORYBLOK_VERSION❌'published'Version contenu

Optimisations et Performance

1. Désactivation SSR

ssr: false;

Raisons :

  • ✅ SPA Mode : Application client-side uniquement
  • ✅ Simplicité : Pas de rendu serveur
  • ✅ Performance : Moins de complexité

2. Lazy Loading

i18n: {
  lazy: true,  // Chargement paresseux des traductions
}

3. Cache Storyblok

storyblok: {
  apiOptions: {
    cache: { type: 'memory', clear: 'manual' },
  },
}

4. Extraction de Payload

nitro: {
  payloadExtraction: false,  // Désactive l'extraction
}

Sécurité

1. Configuration CORS

routeRules: {
  '/': {
    cors: {
      origin: ['*'],                              // ⚠️ Attention en production
      methods: ['POST', 'OPTIONS'],
      allowHeaders: ['Content-Type', 'Authorization'],
    },
  },
}

2. Variables Sensibles

runtimeConfig: {
  // Côté serveur uniquement (sécurisé)
  djApiKey: process.env.VITE_DJ_API_KEY,

  public: {
    // Accessible côté client (non sensible)
    appVersion: pkg.version,
  }
}

Exemples d'Usage

1. Accès à la Configuration Runtime

// Dans un composable ou composant
const config = useRuntimeConfig();

// Côté client et serveur
const apiUrl = config.public.apiBaseUrl;

// Côté serveur uniquement
const apiKey = config.djApiKey;

2. Utilisation des Modules

// Auto-import des composables i18n
const { locale, t } = useI18n();

// Auto-import des stores Pinia
const userStore = useUserStore();

// Auto-import des composants
<template>
  <UButton>Bouton Nuxt UI</UButton>
  <Icon name="djust-icon:logo" />
</template>;

Maintenance et Évolution

1. Ajout de Modules

modules: [
  // Modules existants...
  '@nouveau/module',
],

2. Nouvelles Variables

runtimeConfig: {
  public: {
    // Variables existantes...
    nouvelleVariable: process.env.NOUVELLE_VAR,
  }
}

3. Configuration Conditionnelle

{
  // Configuration basée sur l'environnement
  devtools: {
    enabled: process.env.NODE_ENV === 'development',
  },
}

Bonnes Pratiques

1. Sécurité

  • ✅ Variables sensibles côté serveur uniquement
  • ✅ CORS configuré selon les besoins
  • ✅ Tokens protégés dans runtimeConfig privé

2. Performance

  • ✅ Lazy loading activé pour i18n
  • ✅ Cache mémoire pour Storyblok
  • ✅ Sourcemaps en développement

3. Maintenabilité

  • ✅ Configuration centralisée dans .env
  • ✅ Valeurs par défaut définies
  • ✅ Documentation des options

Cette configuration nuxt.config.ts fournit une base solide pour une application e-commerce B2B moderne avec toutes les fonctionnalités nécessaires intégrées et optimisées.


Did this page help you?