Respuestas a tus posibles dudas:
1. ¿Por qué añadimos este recurso (HtmlWebpackPlugin) como un constal inicio?
Porque un plugin en sí es un objeto de JavaScript. Dicho objeto tiene un método llamado apply. El método apply es llamado por el compilador de webpack para hacer su trabajo.
El plugin, al ser un objeto, debemos instanciarlo. Pero ¿Dónde vive el código para instanciar dicho objeto? Exacto, en el módulo que estamos "requiriendo" mediante require y que instalamos en esta clase.. Para comodidad, guardamos todo ese módulo en la constante HtmlWebpackPlugin. Piensa que este es el nombre de la clase a partir de la cual podremos instanciar un objeto.
.
2. ¿Por qué añadimos pluginsdespués de module?
Así lo indica la documentación de webpack. De la misma manera, indica que todos los elementos del índice/atributo pluginsdeben estar contenidos dentro de un arreglo.
.
3. ¿Por qué usamos new HtmlWebpackPlugin({objeto})?
Porque, como puse en la primera pregunta de este aporte, el plugin es un objeto. Por lo tanto con este new lo estamos instanciando. Si te lo estás preguntando, sí, el hecho de instanciarlo como un objeto nos permite utilizar el plugin, mediante diferentes objetos, para diferentes propósitos (o con diferentes configuraciones). Esto se hace instanciando diferentes objetos de la misma clase.
.
4. En el objeto que le pasamos a la instancia de HtmlWebpackPlugin, ¿De dónde salen el inject y todas las otras vainas?
Son parámetros de configuración que se le pasan al plugin. Aquí solo se usan inject, template y filename aunque hay más. Puedes encontrar todos y cada uno de ellos, así como sus posibles valores y lo que hacen en el siguiente vínculo: .
.
5. ¿Por qué eliminamos la etiqueta <script> en public/index.html y webpack lo agrega posteriormente?
En la lección 5 de este curso hablé sobre el gráfico de dependencias. Webpack lo genera para construir el bundle o empaquetamiento.
Si revisas nuestro archivo de entrada entry, que es index.js, verás que lo único que hace es colocar el html de Template.jsen el html. Para eso se guía con el "id" llamado "main" que está dentro del index.html
.
Webpack insertará dentro del html de salida el archivo JS que hayamos configurado de salida. En este caso, recuerda que configuramos que la salida fuera main.js. Por eso, cuando genera el nuevo index.html, ya viene con este insertado.
.
De hecho puedes hacer la prueba cambiando el nombre de la salida principal (archivo JS) y verás que siempre lo va a insertar, aun cuando hagas que la salida se llame patitos.js.
.
Es por esto que se elimina la etiqueta de <script> en el html original, ya que podría traernos problemas después. De hecho, si no la eliminas manualmente como lo hicimos en esta lección, es muy probable que tengas inconvenientes o errores, ya que seguirá apareciendo en el html de salida. De hecho, si no eliminas la etiqueta, mira cómo se "duplica" la importación en el siguiente código que me dio de salida:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../src/styles/main.css">
<title>JS Portfolio</title>
<script defer src="main.js"></script></head> // En el archivo de configuraciones de webpack puedes cambiar a que la salida sea "patito.js", si es que quieres probar
<body>
<div id="main"></div>
<script type="module" src="../src//index.js"></script>
</body>
</html>