¿Se recomienda esta estructura de carpetas Next.JS?

10 minutos de lectura

Hemos recurrido a esta siguiente estructura de proyecto

|- pages
    |- <page_name>
        |- index.js             # To do a default export of the main component
        |- MainComponent.jsx    # Contains other subcomponents
        |- main-component.css   # CSS for the main component
        |- OtherComponents.jsx  # more than 1 file for child components that are used only in that page
        |- __tests__            # Jest unit and snapshot tests
|- components
    |- index.js                 # Exports all the default components of each component as named exports
    |- CommonCmpnt1
        |- CommonCmpnt1.jsx
        |- common-cmpnt-1.css
        |- index.js             # To default export the component
        |- __tests__
    |- CommonCmpnt2
        |- CommonCmpnt2.jsx
        |- common-cmpnt-2.css
        |- index.js             # To default export the component
        |- __tests__

Para aclarar, nada se ha roto y funciona increíblemente bien. Tenemos componentes que se reutilizan en varias páginas dentro del components directorio, donde importamos de la siguiente manera

// Assuming we are inside MainComponent.jsx
// ...
import { CommonCmpnt1 } from '../../components';    // We even take it a step further and use absolute imports

Además, los componentes que se usan solo una vez residen uno al lado del otro en su pages carpeta.

El único problema al que nos enfrentamos ahora es la recarga del Hot Module se interrumpe, es decir, cada vez que editamos el .jsx archivo dentro del pages o el components directorio, tenemos que volver a cargar manualmente la página para ver los cambios realizados (no afecta a los archivos CSS). Es algo a lo que nos hemos acostumbrado y por lo tanto no nos afecta seriamente.

Mi pregunta es, ¿hay alguna catástrofe inminente que no sepamos?

  • Bueno, definitivamente css no es general en el próximo proyecto. usan CSS basado en JS. algo como styled components

    – Código maníaco

    19 de diciembre de 2018 a las 16:17


  • @CodeManiac Estoy de acuerdo, pero es más una preferencia que una solución. Alternamos entre styled-jsx (componentes con estilo), sass y css

    – cr05s19xx

    19 de diciembre de 2018 a las 16:27

Tropecé con esta publicación mientras buscaba una estructura de carpetas adecuada para NextJS. He estado usando una estructura similar, pero recientemente descubrí que esto es no cómo se supone que debes usar NextJS.

No sé mucho sobre los detalles, pero NextJS tiene optimizaciones a nivel de página. Cuando crea un proyecto NextJS, verá las páginas registradas como parte de la construcción. SiguienteJS golosinas cada archivo componente bajo la pages carpeta como una página, por lo que al colocar componentes que no son de página en la pages carpeta, eres drásticamente aumentando el tiempo de construcción porque ahora NextJS va y construye cada uno de esos componentes como una página.

  • Estoy de acuerdo… y créeme, lo descubrí por las malas. Todavía tengo que hacer una edición en esta publicación, pero la tuya será apreciada

    – cr05s19xx

    27 de enero de 2020 a las 7:19

  • Sí… También lo descubrí de la manera más difícil, me preguntaba por qué una compilación tomó minutos: o

    – Hans

    27 de enero de 2020 a las 18:19


  • Estoy de acuerdo con ésto. También aprendí de la manera difícil. Ahora considero las páginas como enrutamiento y coloco solo las cosas que deben renderizarse en el servidor e importo todo dinámicamente desde la carpeta de componentes. También facilita el cambio a proyectos que no son de nextjs

    – apnervio

    24 de febrero de 2020 a las 7:17

  • Entonces, ¿cuál es la solución correcta? Su respuesta sugiere que se supone que los componentes no deben pasar por debajo pages entonces, ¿dónde se supone que deben ir?

    – Rylan Schaefer

    10 de junio a las 0:17

  • @RylanSchaeffer puede agregarlos en la carpeta común. Se supone que la carpeta de páginas solo aloja páginas, no componentes. Si coloca un componente en páginas como páginas/inicio/miComponente.tsx, generará una página como localhost:3000/inicio/miComponente

    – Shazil Satar

    20 de junio a las 8:33


Me gusta la estructura propuesta en este artículo.

https://medium.com/@pablo.delvalle.cr/una-opinion-basic-next-js-files-and-directories-structure-88fefa2aa759

/root
  \_ /.next/
  \_ /components/
      \_ Button/
          \_ button.spec.jsx
          \_ button.styles.jsx
          \_ index.jsx
  \_ /constants/
      \_ theme.js
      \_ page.js
  \_ /contexts/
      \_ Locale/
         \_ index.js
      \_ Page/
         \_ index.js
  \_ /pages/
      \_ _app.jsx
      \_ _document.jsx
      \_ about.jsx
      \_ index.jsx
  \_ /providers/
      \_ Locale/
         \_ index.js
      \_ Page/
         \_ index.js
  \_ /public/
      \_ favicon.ico
      \_ header.png
  \_ /redux/
      \_ actions/
         \_ users/
            \_ index.js
         \_ products/
            \_ index.js
      \_ reducers/
         \_ users/
            \_ index.js
         \_ products/
            \_ index.js
      \_ store/
         \_ index.js
      \_ types/
         \_ index.js
  \_ /shared/
      \_ jsons/
          \_ users.json
      \_ libs/
          \_ locale.js
      \_ styles/
          \_ global.css
  \_ /widgets/
      \_ PageHeader/
          \_ index.jsx
  \
  \_ .eslintignore
  \_ .eslintrc
  \_ .env
  \_ babel.config.js
  \_ Dockerfile
  \_ jest.config.js
  \_ next.config.js
  \_ package.json
  \_ README.md

Avatar de usuario de Gabriel Taype
gabriel tappe

Si alguien todavía está interesado, guardo el archivo según su tipo en mi proyecto, por ejemplo:

|-Nextjs-root
  |-Components
    |-Header.js
    |-Footer.js
    |-MoreExamples.js
  |-styles
   |-globals.css
   |-header.module.css
   |-footer.module.css
  |-Services
    |-api              #Axios config to connect to my api
  |-Context
   |-AuthContext.js    #Global context to my app for auth purposes
  |-pages
   |-index.js

  • Dudo que el depurador del lado del servidor no funcione para Services/api porque supongo que next.js crea un mapa fuente solo para archivos dentro del directorio de páginas

    – Nika Tsogiaidze

    7 de febrero a las 11:17


  • Esto no escala. Carpeta por función es mejor para proyectos medianos y grandes.

    – azotado

    25 de septiembre a las 1:50

Para todos los que todavía están interesados ​​en esto, personalmente recomiendo este enfoque debido a que ayuda a compartimentar los recursos y permite encontrar cosas rápidamente y realizar pruebas unitarias.

Se inspiró en un artículo de HackerNoon sobre Cómo estructurar su aplicación React

Esto es lo que recomiendo, usando un patrón de diseño modular:

/public
    favicon.ico
/src
    /common
        /components
            /elements
                /[Name]
                    [Name].tsx
                    [Name].test.ts
        /hooks
        /types
        /utils
    /modules
        /auth
            /api
                AuthAPI.js
                AuthAPI.test.js
            /components
                AuthForm.tsx
                AuthForm.test.ts
            auth.js
    /pages
        /api
          /authAPI
              authAPI.js
          /[Name]API
              [Name]API.js
        _app.tsx
        _document.tsx
        index.tsx

Escribí un artículo al respecto: https://dev.to/vadorequest/a-2021-guide-about-structuring-your-next-js-project-in-a-flexible-and-ficient-way-472

Lo único con lo que realmente debe tener cuidado es no tener nada debajo de las páginas que no sean páginas reales o puntos finales de API (por ejemplo, pruebas, componentes, etc.), porque no hay forma de ignorarlos y Next los empaquetará y desplegará. como páginas reales.

  • ¿Qué pasa con el estilo? módulos css archivos y archivos css globales?

    – Naor

    06/10/2021 a las 21:00

  • Para los archivos CSS de nivel de componente, se pueden incluir dentro del .tsx (cuando se usa CSS-in-JS), o con un .css archivo al lado. (en la misma carpeta, con el nombre del componente)

    – Solicitud de vado

    7 oct 2021 a las 11:33


  • Para estilos globales, tengo un especial src/app carpeta que contiene todo lo que afecta a la aplicación en su conjunto. Como uso CSS-in-JS, tengo un src/app/components/GlobalStyles.tsx archivo que contiene todos los estilos globales (dentro de un Global componente de la @emotion/react biblioteca).

    – Solicitud de vado

    7 oct 2021 a las 11:36

  • ¿Dónde guarda los componentes de su página? Quiero decir: pages/about.tsx lo más probable es que produzca un About.tsx componente. De c, about suele ser un componente muy simple, pero también podríamos estar hablando de pages/posts/[id].tsx eso rendirá un PostContainer que maneja datos dinámicos, etc. ¿Dónde los guardas, ya que no pueden estar dentro del pages carpeta de enrutamiento? Además, si puedes, echa un vistazo a: github.com/vercel/next.js/discusiones/34130

    – cbdeveloper

    9 de febrero a las 15:30


  • @cbdeveloper Usualmente en un /modules subcarpeta.

    – Solicitud de vado

    10 de febrero a las 12:12

Avatar de usuario de Phạm Huy Phát
Phạm Huy Phat

La forma que ahora me conviene más es usar el pages carpeta solo para fines de enrutamiento, los componentes en cada archivo son solo un contenedor para el “real” componentes de página en src carpeta. Con este enfoque, puedo estructurar mi página de inicio con mayor facilidad y se siente más intuitiva, para contener el diseño y sus componentes secundarios en la misma carpeta.

  • ¿Qué pasa con el estilo? módulos css archivos y archivos css globales?

    – Naor

    06/10/2021 a las 21:00

  • Para los archivos CSS de nivel de componente, se pueden incluir dentro del .tsx (cuando se usa CSS-in-JS), o con un .css archivo al lado. (en la misma carpeta, con el nombre del componente)

    – Solicitud de vado

    7 oct 2021 a las 11:33


  • Para estilos globales, tengo un especial src/app carpeta que contiene todo lo que afecta a la aplicación en su conjunto. Como uso CSS-in-JS, tengo un src/app/components/GlobalStyles.tsx archivo que contiene todos los estilos globales (dentro de un Global componente de la @emotion/react biblioteca).

    – Solicitud de vado

    7 oct 2021 a las 11:36

  • ¿Dónde guarda los componentes de su página? Quiero decir: pages/about.tsx lo más probable es que produzca un About.tsx componente. De c, about suele ser un componente muy simple, pero también podríamos estar hablando de pages/posts/[id].tsx eso rendirá un PostContainer que maneja datos dinámicos, etc. ¿Dónde los guardas, ya que no pueden estar dentro del pages carpeta de enrutamiento? Además, si puedes, echa un vistazo a: github.com/vercel/next.js/discusiones/34130

    – cbdeveloper

    9 de febrero a las 15:30


  • @cbdeveloper Usualmente en un /modules subcarpeta.

    – Solicitud de vado

    10 de febrero a las 12:12

Ciro Santilli Avatar de usuario de OurBigBook.com
Ciro Santilli OurBigBook.com

Asegúrese de separar los archivos de solo backend de los archivos de frontend + backend

Independientemente de cómo los llame, recomendaría tener dos directorios con una semántica muy clara:

  • el directorio de solo backend: puede realizar operaciones solo de backend, por ejemplo, accesos directos a la base de datos o al sistema de archivos (require('fs'))
  • el directorio frontend + backend: solo cosas seguras frontend. Dado que Next.js es una configuración de SSR, cualquier cosa que sea segura para el frontend también debe ser segura para el backend, por lo que también puede usarla desde el backend, por ejemplo, configuraciones compartidas o ayudantes.

Esto es importante porque de lo contrario comenzarás a encontrar errores como:

Módulo no encontrado: no se puede resolver ‘fs’

al factorizar las cosas con HoC, y como se menciona en Módulo no encontrado: No se puede resolver ‘fs’ en la aplicación Next.js. No sé cómo resolver esto, excepto haciendo esta división clara y definitiva.

Tal vez esta sea la semántica intencionada de la lib/ contra components/ convención de uso común, pero no pude encontrar una cita clara.

Estoy más tentado a simplemente llamarlos back/ y front/

ESLint pages/, components/y lib/ por defecto

Este es el único efecto claro en el código ascendente de components/ y lib/ que pude encontrar como se menciona en: https://nextjs.org/docs/basic-features/eslint#linting-custom-directories-and-files (pages/ por supuesto es mágico y contiene los puntos de entrada de URL, y obviamente no deberías poner nada más ahí):

De forma predeterminada, Next.js ejecutará ESLint para todos los archivos en los directorios pages/, components/ y lib/.

No importa mucho en ese caso, ya que la lista de directorios se puede configurar fácilmente como se documenta allí.

  • /server y /client son el estándar para /back y /front

    – metro

    10 de mayo a las 15:24

  • @mtro gracias, ¿tienes alguna referencia?

    – Ciro Santilli OurBigBook.com

    10 de mayo a las 16:24

¿Ha sido útil esta solución?