es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo utilizar un método múltiples veces en uno?

Objetivo:

Así que estoy utilizando Eleventy como un SSG y quiero crear múltiples carpetas y copiar algunos archivos en estas carpetas, antes de que Eleventy realice la construcción o generación del sitio.

Un archivo JSON es para el array de títulos del sitio (nombres de carpetas).

Y elegí usar el módulo fs-extra en lugar del módulo fs de Node.js.

Dentro de .eleventy.js (archivo de configuración):

const fse = require('fs-extra');
const arrayFromJSON = require('./_data/sites.json');
const arrayTitles = arrayFromJSON.titles;

eleventyConfig.on("beforeBuild", () => {
  // Crear carpetas de sitio y copiar diseño y datos de frontmatter en las carpetas
    arrayTitles.forEach(element => 
      fse.copySync(`sitesource/index.njk`, `src/_sites/${element}/${element}.njk`, { recursive: true }));
    arrayTitles.forEach(element => 
      fse.copySync(`sitesource/fm.11tydata.js`, `src/_sites/${element}/${element}.11tydata.js`, { recursive: true }));
});

He estado buscando ideas y ejemplos para combinar estas dos acciones en una, donde solo se necesite llamar a arrayTitles.forEach una vez. Pero no lo he encontrado.

¿Es esto posible y alguien tiene sugerencias para mejorar este código?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible combinar las dos acciones en una moviendo el bucle forEach dentro del método fse.copySync(). Esto eliminará la necesidad de recorrer el array arrayTitles dos veces. Aquí tienes un ejemplo de cómo lograr esto:

    eleventyConfig.on("beforeBuild", () => {
      // Crear carpetas del sitio y copiar el diseño y los datos frontmatter en las carpetas
      arrayTitles.forEach(element => {
        fse.copySync(
          `sitesource/index.njk`,
          `src/_sites/${element}/${element}.njk`,
          { recursive: true }
        );
        fse.copySync(
          `sitesource/fm.11tydata.js`,
          `src/_sites/${element}/${element}.11tydata.js`,
          { recursive: true }
        );
      });
    });
    

    En este fragmento de código, ambos métodos copySync() se ejecutan dentro del bucle forEach, por lo que se llamarán solo una vez para cada elemento del array arrayTitles.

    Para mejorar este código, podrías considerar utilizar un manejo de errores más específico en caso de que alguna de las operaciones de copia de archivos falle. También podrías agregar algún registro o feedback al usuario para indicar que las operaciones de copia de carpetas y archivos se han completado correctamente. Por ejemplo, podrías usar el método console.log() para mostrar un mensaje una vez que las operaciones se hayan completado:

    eleventyConfig.on("beforeBuild", () => {
      // Crear carpetas del sitio y copiar el diseño y los datos frontmatter en las carpetas
      arrayTitles.forEach(element => {
        try {
          fse.copySync(
            `sitesource/index.njk`,
            `src/_sites/${element}/${element}.njk`,
            { recursive: true }
          );
          fse.copySync(
            `sitesource/fm.11tydata.js`,
            `src/_sites/${element}/${element}.11tydata.js`,
            { recursive: true }
          );
          console.log(`Operaciones de copia de carpetas y archivos para ${element} completadas.`);
        } catch (err) {
          console.error(`Error al copiar archivos para ${element}:`, err);
        }
      });
    });
    

    En este código actualizado, se añade una declaración try...catch para manejar cualquier error que pueda ocurrir durante las operaciones de copiado de archivos. Si se produce un error, se mostrará un mensaje de error específico en la consola. Además, se mostrará un mensaje de éxito en la consola una vez que se completen todas las operaciones de copiado de archivos.

Comments are closed.