¿Dónde está la conexión entre index.html e index.js en una aplicación Create-React-App?

82

Estoy empezando a jugar con la aplicación Create React, pero no puedo entender cómo index.jsse carga en el interior index.html. Este es el código html:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
    <!--
      Notice the use of %PUBLIC_URL% in the tag above.
      It will be replaced with the URL of the `public` folder during the build.
      Only files inside the `public` folder can be referenced from the HTML.

      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
      work correctly both with client-side routing and a non-root public URL.
      Learn how to configure a non-root public URL by running `npm run build`.
    -->
    <title>React App</title>
  </head>
  <body>
    <div id="root"></div>
    <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled scripts into the <body> tag.

      To begin the development, run `npm start`.
      To create a production bundle, use `npm run build`.
    -->
  </body>
</html>

Pero no puedo ver en ninguna parte la importancia del index.js. ¿Dónde está la conexión? ¿Qué me estoy perdiendo?

Piero
fuente
¿Cómo sirves tu contenido?
Nicklas Pouey-Winger
No he cambiado nada por defecto, solo hago esto: create-react-app my-appy abro el proyecto usando webstorm, luego hago npm start, pero mi pregunta es ¿cómo sabe index.html que tiene que cargar index.js? donde esta escribir
Piero
6
webpack.github.io/docs/webpack-dev-server.html Webpack-dev-server maneja esto por usted en el desarrollo.
Nicklas Pouey-Winger
@NicklasWinger ¿Dónde puedo encontrar el archivo de configuración para comprender el mecanismo?
Piero
4
Puede ejecutar npm run ejectpara controlar manualmente las configuraciones. Recomiendo hacer una configuración más básica desde cero para comprender completamente lo que está sucediendo :)
Nicklas Pouey-Winger

Respuestas:

113

Bajo el capó, Create React App usa Webpack con html-webpack-plugin .

Nuestra configuración especifica que Webpack utiliza src/index.jscomo un "punto de entrada" . Así que ese es el primer módulo que lee, y lo sigue a otros módulos para compilarlos en un solo paquete.

Cuando webpack compila los activos, produce un solo paquete (o varios si usa la división de código). Hace que sus rutas finales estén disponibles para todos los complementos. Estamos usando uno de esos complementos para inyectar scripts en HTML.

Hemos habilitado html-webpack-plugin para generar el archivo HTML. En nuestra configuración, especificamos que debería leerse public/index.htmlcomo una plantilla. También hemos configurado la inject opción a true. Con esa opción, html-webpack-pluginagrega un <script>con la ruta proporcionada por Webpack directamente en la página HTML final. Esta página final es la que ingresa build/index.htmldespués de ejecutar npm run buildy la que se sirve /cuando ejecuta npm start.

¡Espero que esto ayude! La belleza de la aplicación Create React es que en realidad no necesitas pensar en ella.

Dan Abramov
fuente
Una pregunta más, ¿qué IDE usas para react o js en general? He luchado en la elección entre Atom y Webstorm, ¿qué opinas?
Piero
1
Estoy usando Webstorm y hasta ahora estoy muy contento con él.
Lancelot
2
¿Cómo resuelve múltiples rutas para cargar diferentes páginas HTML?
quantumpotato
3
En realidad, @Dan Abramov es un genio: D pero no estoy de acuerdo con él cuando dijo "en realidad no necesitas pensar en eso" porque todos deberían entender las cosas desde abajo hacia arriba.
Seif Eddine Slimene
Con suerte, esto está documentado en otro lugar además de aquí. ¿En la documentación de la CRA? No necesitamos conocer la implementación, pero sí necesitamos saber que las cosas comienzan con index.js y cómo destruye public / index.html ¡Gracias a todos!
Ashley Aitken