Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

333
Views
Importación de un directorio completo de archivos estáticos en Rollup.js

Estoy desarrollando una biblioteca de TypeScript y quiero migrar el proceso de compilación del paquete web al resumen.

En mi proyecto, tengo un directorio de iconos SVG, ordenados en varios subdirectorios. Mi biblioteca debería exportar un objeto JavaScript que contenga el código SVG de todos estos íconos.

Con webpack, estaba usando require.context para requerir recursivamente los archivos SVG (que se configuraron como asset/source ):

 const context = require.context("../../assets/icons"); export const icons: Record<string, Record<string, string>> = {}; for (const key of context.keys() as string[]) { const [set, fname] = key.split("/").slice(-2); if (!icons[set]) icons[set] = {}; icons[set][fname.replace(/\.svg$/, "")] = context(key); }

¿Cómo puedo lograr esto con rollup?

He tenido varias ideas hasta ahora:

  • se supone que rollup-plugin-require-context trae require.context al resumen. Sin embargo, parece tener errores y falta de mantenimiento, y en mis pruebas no transformó la llamada require.context en absoluto.
  • rollup-plugin-glob-import parece ser adecuado para importar un directorio de forma recursiva. Estaba tratando de usarlo junto con rollup-plugin-string para importar los archivos SVG como texto sin formato. Sin embargo, parece que los dos complementos no se comunican entre sí, sin importar en qué orden los defina. El complemento de importación global se queja de que mis archivos SVG no tienen ninguna exportación.
about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Solución 1: rollup-plugin-glob-import

El uso de rollup-plugin-glob-import en combinación con rollup-plugin-string funciona cuando se configura de la manera correcta.

rollup-plugin-string genera módulos con una cadena como su exportación predeterminada, por lo que se debe usar format: 'default' para rollup-plugin-glob-import para importarlos correctamente. Si las rutas de los subdirectorios deben conservarse en las exportaciones con nombre del paquete resultante, se puede usar una función de cambio de rename personalizado (tenga en cuenta que el nombre de la exportación debe ser un nombre de variable de JavaScript válido, de ahí el uso de camelCase aquí):

 import { defineConfig } from 'rollup'; import globImport, { camelCase } from 'rollup-plugin-glob-import'; import { string } from 'rollup-plugin-string'; export default defineConfig({ ... plugins: [ string({ include: "assets/icons/**/*.svg" }) as any, globImport({ format: 'default', rename: (name, id) => name || `${camelCase(basename(dirname(id)))}_${camelCase(basename(id, extname(id)))}` }) ] });

rollup-plugin-glob-import genera exportaciones con nombre pero no una exportación predeterminada, por lo que los archivos exportados se pueden importar de esta manera:

 import * as icons from '../../assets/icons/**/*.svg';

Solución 2: Complemento personalizado

Escribir un complemento de resumen personalizado no es difícil y permite una mayor flexibilidad. En particular, se puede usar para exportar un solo objeto JSON en lugar de una exportación con nombre por archivo (cuyo nombre está restringido por los caracteres permitidos para los nombres de variables de JavaScript).

En este ejemplo, proporciono un módulo llamado custom:icons , que tiene una exportación predeterminada que contiene todos los archivos:

 import { defineConfig } from "rollup"; import glob from 'fast-glob'; import { readFile } from 'fs/promises'; export default defineConfig({ ... plugins: [ { name: 'custom:icons', resolveId: (id) => { if (id === 'custom:icons') { return id; } }, load: async (id) => { if (id === 'custom:icons') { const icons: Record<string, Record<string, string>> = {}; for (const path of await glob('./assets/icons/*/*.svg')) { const [set, fname] = path.split("/").slice(-2); if (!icons[set]) icons[set] = {}; icons[set][fname.replace(/\.svg$/, "")] = (await readFile(path)).toString(); } return `export default ${JSON.stringify(icons, undefined, '\t')}`; } } } ] });

El módulo personalizado se puede importar así:

 import icons from 'custom:icons';
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!