No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Vite.js

Curso de Vite.js

Diana Martínez

Diana Martínez

Sitios multi-página

15/19
Recursos

Con Vite podremos ser capaces de generar proyectos con múltiples páginas de inicio, esto quiere decir que además del index.html (por lo general entrada de un proyecto en Vite), podremos tener más archivos que se comporten como una página separada a este, con sus propias dependencias, sus propios elementos y completamente individuales.

Configurando Vite

Para poder lograr esto vamos a hacer uso de la configuración de Vite, pero también vamos a hacer uso de la configuración de rollup, con el cual podremos hacer múltiples archivos de entrada.

Creando otra página inicial

Antes de empezar con la configuración vamos a crear una carpeta con el nombre de help y dentro de este un archivo html con el nombre de help.html, con un código bastante básico.

```

Help

Help!

```

Ahora vamos a generar una configuración que nos permita retornar diferentes cosas dependiendo del modo. Es así que si estamos en modo desarrollo retornaremos el puerto donde queremos que se ejecute la aplicación.

``` import { defineConfig, loadEnv } from "vite";

export default defineConfig(({ command, mode }) => { const port = 8080; const env = loadEnv(mode, process.cwd());

console.log(comando: ${command} y modo: ${mode}); console.log("Variables de entorno:", env);

if (command === "development") { console.log("Modo desarrollo"); return { server: { port }, }; } else { console.log("Modo produccion"); } }); ```

Configurando rollup

En modo producción retornaremos una configuración para el proceso de build, dentro de este acceder a la configuración de rollup e indicarle cuáles son los diferentes archivos de entrada con la opción input.

``` import { defineConfig, loadEnv } from "vite"; import { resolve } from "path";

export default defineConfig(({ command, mode }) => { const port = 8080; const env = loadEnv(mode, process.cwd());

console.log(comando: ${command} y modo: ${mode}); console.log("Variables de entorno:", env);

if (command === "development") { console.log("Modo desarrollo"); return { server: { port }, }; } else { console.log("Modo produccion"); return { build: { rollupOptions: { input: {}, }, }, }; } }); ```

Opción input

La opción input recibe las diferentes entradas que queremos para nuestro proyecto, que consisten en un nombre para el archivo y al frente su ubicación. Para la ubicación estamos usando resolve, una función de nodejs que se importa desde path.

resolve recibe como primer parámetro el nombre del directorio donde se ejecuta nuestro proyecto, el cual puede ser obtenido a través de la variable __dirname y después tendríamos que escribir la dirección del archivo a referenciar.

Ejemplo

Ahora debemos de definir las diferentes entradas para nuestro proyecto.

  1. El index.html, que se encuentra en la raíz del proyecto. Esta la podemos nombrar main y a continuación utilizar la función resolve con los parámetros que ya conocemos. main: resolve(__dirname, "index.html")
  2. Crearemos una entrada para el archivo help.html, que se encuentra en la carpeta help. help: resolve(__dirname, "help/help.html"),

``` import { defineConfig, loadEnv } from "vite"; import { resolve } from "path";

export default defineConfig(({ command, mode }) => { const port = 8080; const env = loadEnv(mode, process.cwd());

console.log(comando: ${command} y modo: ${mode}); console.log("Variables de entorno:", env);

if (command === "development") { console.log("Modo desarrollo"); return { server: { port }, }; } else { console.log("Modo produccion"); return { build: { rollupOptions: { input: { main: resolve(__dirname, "index.html"), help: resolve(__dirname, "help/help.html"), }, }, }, }; } }); ```

Una vez tenemos esta configuración a la hora de hacer el build rollup va a partir desde ambos proyectos y tratarlos por separado. Si ejecutamos el proyecto con el comando dev y vamos al navegador podremos ver que ahora en la ruta /help/help.html se encuentra nuestro otro proyecto.

Por el contrario, si ejecutamos el comando build podremos ver en la consola un mensaje parecido al siguiente:

vite-multipage.png

El cual nos dice que se generó un trozo para help y que en la carpeta dist encontraremos la carpeta help con el archivo help.html.

Micro Frontends

Lo que vimos anteriormente es una característica en específico de Vite que puede llegar a ser muy útil para la tendencia de Mircro Frontends, una forma de pensar el frontend de manera que tengas múltiples frameworks coexistiendo en el mismo proyecto.

Contribución creada por: Jofay Zhan Segura

Aportes 5

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Sitios Multi páginas

Se pueden generar sitios de multi páginas de inicio, normalmente en un proyecto el archivo principal es el index sin embargo hay proyectos donde se puede llegar a usar otro punto de entrada o un segundo sitio, que no se comporte como una página aparte principal si no como una página independiente.

Para esto debemos hacer uso de la configuración de Rollup y Vite.
Recordemos que el archivo de Config de Vite es para poder tomar el control del mismo

import { defineConfig, loadEnv } from 'vite'
import { resolve } from 'path' // Use NodeJS

export default defineConfig(({command, mode}) => {
	
	const env = loadEnv(mode, process.cwd())

	if(mode === 'development') {
			return {
                server: {
                port: env.VITE_PORT
                }
	    }
    }
  else {
			console.log("Mode production")
			return {
					build: {
						// Configuration de Rollup
						rollupOptions: {
								// Configuration rollup, not vite
								input: {
										main: resolve(__dirname, 'index.html'),
                                        hel: resolve(__dirname, 'help', 'help.html'),
									}
								}
						}
				}
			}
  })

Vite esta pensando en una tendencia que esta creciendo a día de hoy que es MicroFrameworks, es decir que todos los Frameworks se puedan integrar

Me aparecía un error al momento de ejecutar el comando “npm run build” que decía “ReferenceError: __dirname is not defined”.
Lo pude arreglar declarando la variable __dirname de esta forma.

import {resolve,dirname } from 'path';
const __dirname = resolve(dirname(''));

y con eso ya pude construir a producción.

Yo estoy creando la configuración inicial para trabajar con React + TS (tomando como base la que ya fué creada por la comunidad), pero igual alguno de estos tips les puede servir, trabajando con react solo, o incluso con vanila JS.

  • Función para crear alias
  • Crear un objeto con las configuraciones iniciales, y dependiendo del modo ir agregando diferentes propiedades, como en el código siguiente:
import * as path from 'path'
import { defineConfig, loadEnv } from 'vite'
import react from '@vitejs/plugin-react'

// Add the paths you need as alias
const paths = [
  "assets",
  "components",
  "hooks",
  "pages",
  "styles",
  "utils",
]

/**
 * Function to create the aliases
 * @returns An array with the aliases
 */
const getAliases = () => paths.map(p => ({ find: `@${p}`, replacement: path.resolve(__dirname, `src/${p}`) }))

interface config {
  resolve: object;
  plugins: any[]
  [key: string]: any;
}

/**
 * Initial configuration for Vite
 */
export default defineConfig(({ command, mode }) => {
  console.log({ command, mode })

  const config: config = {
    plugins: [react()],
    resolve: {
      alias: getAliases(),
    }
  }

  if (mode === 'development') {
    const env = loadEnv(mode, process.cwd())
    
    config.server = {
      port: env.VITE_PORT,
    }
  }

  return config
})
  • Para aquellos que el __dirname les de un error la razon se encuentra en el archivo package.json.

  • Cuando configura type: module en package.json Node tratará todos los archivos JS como módulo ES y __dirname no está disponible en el módulo ES. Necesitas escribir tu propia __dirname variable o borrar dicha propiedad de la configuracion.

En caso contrario pueden usar las soluciones de los otro compañeros.
O esta:

import { dirname } from 'path'
import { fileURLToPath } from 'url'

const _dirname = typeof __dirname !== 'undefined'
  ? __dirname
  : dirname(fileURLToPath(import.meta.url))
Este código configura un proyecto Vite.js, especificando opciones de configuración diferentes para los modos de desarrollo y producción. Veamos cada línea de código: `// Importa las funciones defineConfig y loadEnv de Vite` `import { defineConfig, loadEnv } from 'vite';` `// Importa la función resolve de NodeJS para trabajar con rutas` `import { resolve } from 'path';` `// Exporta la configuración del proyecto` `export default defineConfig(({ command, mode }) => {` ` // Carga las variables de entorno según el modo de ejecución (development o production)` ` const env = loadEnv(mode, process.cwd());` ` // Configuración específica para el modo de desarrollo` ` if (mode === 'development') {` ` return {` ` server: {` ` // Configura el puerto del servidor de desarrollo usando la variable de entorno VITE_PORT` ` port: env.VITE_PORT` ` }` ` };` ` }` ` // Configuración específica para el modo de producción` ` else {` ` console.log("Mode production");` ` return {` ` build: {` ` // Configuración de Rollup para la construcción del proyecto` ` rollupOptions: {` ` // Configuración específica de Rollup (no Vite) para las entradas de la aplicación` ` input: {` ` main: resolve(__dirname, 'index.html'),` ` hel: resolve(__dirname, 'help', 'help.html'),` ` }` ` }` ` }` ` };` ` }` `});` Ahora, una explicación detallada de cada línea: 1. `import { defineConfig, loadEnv } from 'vite';` * Importa las funciones `defineConfig` y `loadEnv` de la biblioteca Vite. 2. `import { resolve } from 'path';` * Importa la función `resolve` de NodeJS para trabajar con rutas de archivos. 3. `export default defineConfig(({ command, mode }) => {` * Exporta la configuración del proyecto utilizando `defineConfig`. Recibe un objeto con propiedades de configuración como argumento, incluyendo `command` (el comando de Vite ejecutado) y `mode` (el modo de ejecución: 'development' o 'production'). 4. `const env = loadEnv(mode, process.cwd());` * Carga las variables de entorno utilizando `loadEnv`, proporcionando el modo y el directorio de trabajo actual (`process.cwd()`). 5. `if (mode === 'development') {` * Inicia una condición que verifica si el modo de ejecución es 'development'. 6. `server: { port: env.VITE_PORT }` * Configura el objeto `server` con la opción `port`, utilizando el valor de la variable de entorno `VITE_PORT` para especificar el puerto del servidor de desarrollo. 7. `} else {` * Inicia la rama `else`, que se ejecuta si el modo de ejecución no es 'development'. 8. `console.log("Mode production");` * Imprime en la consola un mensaje indicando que se está ejecutando en modo de producción. 9. `return { build: { rollupOptions: { input: { main: resolve(__dirname, 'index.html'), hel: resolve(__dirname, 'help', 'help.html'), } } } };` * Retorna un objeto de configuración para el modo de producción. Configura las opciones de construcción de Rollup, específicamente las entradas de la aplicación (`input`). En este caso, se proporcionan rutas a los archivos HTML principales (`index.html` y `help/help.html`). 10. `});` * Cierra la llamada a `defineConfig`. En resumen, este archivo de configuración de Vite.js establece diferentes configuraciones dependiendo del modo de ejecución. En el modo de desarrollo, configura el puerto del servidor, mientras que en el modo de producción, configura las opciones de construcción de Rollup para las entradas de la aplicación.