A Rollup plugin which imports files as data-URIs or ES Modules
npx @tessl/cli install tessl/npm-rollup--plugin-url@8.0.0@rollup/plugin-url is a Rollup plugin that imports files as data-URIs or ES Modules. It automatically processes static assets like images, fonts, and other binary files by either inlining small files as data-URIs for performance optimization or copying larger files to the output directory with hashed filenames to prevent caching issues.
npm install @rollup/plugin-url --save-devimport url from '@rollup/plugin-url';For CommonJS:
const url = require('@rollup/plugin-url');import url from '@rollup/plugin-url';
export default {
input: 'src/index.js',
output: {
dir: 'output',
format: 'cjs'
},
plugins: [url()]
};Import assets in your source code:
// Import an image - returns either a data-URI or file path
import imageUrl from './assets/logo.png';
import iconSvg from './icons/home.svg';
console.log(`Image URL: ${imageUrl}`);Creates a Rollup plugin instance for processing file imports as data-URIs or ES modules.
/**
* Creates a Rollup plugin for importing files as data-URIs or ES Modules
* @param options - Configuration options for the plugin
* @returns Rollup plugin object
*/
function url(options?: RollupUrlOptions): Plugin;
interface RollupUrlOptions {
/**
* File patterns to include in processing
* @default ['**/*.svg', '**/*.png', '**/*.jp(e)?g', '**/*.gif', '**/*.webp']
*/
include?: FilterPattern;
/**
* File patterns to exclude from processing
* @default undefined
*/
exclude?: FilterPattern;
/**
* File size limit in bytes for inlining
* Files larger than this will be copied instead of inlined
* Set to 0 to copy all files
* @default 14336 (14kb)
*/
limit?: number;
/**
* String prefix for non-inlined file paths
* @default ''
*/
publicPath?: string;
/**
* Whether to emit files to output directory
* Set to false for server-side builds
* @default true
*/
emitFiles?: boolean;
/**
* Template for output filenames
* Supports [hash], [name], [extname], [dirname] placeholders
* @default '[hash][extname]'
*/
fileName?: string;
/**
* Source directory for [dirname] replacement
* @default ''
*/
sourceDir?: string;
/**
* Destination directory for copied assets
* @default ''
*/
destDir?: string;
}
type FilterPattern = string | RegExp | Array<string | RegExp>;
interface Plugin {
name: string;
load(id: string): Promise<string | null>;
generateBundle(outputOptions: any): Promise<void>;
}Basic Configuration:
export default {
plugins: [
url({
limit: 8192, // 8kb limit
include: ['**/*.png', '**/*.jpg', '**/*.svg'],
publicPath: '/assets/'
})
]
};Advanced Configuration:
import path from 'path';
export default {
plugins: [
url({
limit: 0, // Copy all files (no inlining)
fileName: '[dirname][name].[hash][extname]',
sourceDir: path.join(__dirname, 'src'),
destDir: 'dist/assets',
publicPath: 'https://cdn.example.com/assets/'
})
]
};Server-side Rendering:
export default {
plugins: [
url({
emitFiles: false, // Prevent file emission for SSR builds
publicPath: '/static/'
})
]
};The plugin processes files based on size and configuration:
data:image/png;base64,iVBOR...)data:image/svg+xml,<encoded-svg>)
When emitFiles is true and files exceed the size limit, the fileName template supports these placeholders:
[hash]: SHA-1 hash of file contents (first 16 characters)[name]: Original filename without extension[extname]: File extension including the leading dot[dirname]: Parent directory name or relative path from sourceDirTemplate Examples:
// Default: '[hash][extname]'
// logo.png → 'a1b2c3d4e5f6g7h8.png'
// '[name].[hash][extname]'
// logo.png → 'logo.a1b2c3d4e5f6g7h8.png'
// '[dirname][hash][extname]'
// assets/logo.png → 'assets/a1b2c3d4e5f6g7h8.png'By default, these file types are processed:
**/*.svg)**/*.png)**/*.jp(e)?g)**/*.gif)**/*.webp)Custom File Types:
export default {
plugins: [
url({
include: [
'**/*.svg', '**/*.png', '**/*.jpg', '**/*.gif', '**/*.webp',
'**/*.woff', '**/*.woff2', '**/*.eot', '**/*.ttf' // Add fonts
]
})
]
};The plugin handles common error scenarios:
load hook, letting Rollup handle the errorfs.readFile and fs.stat are propagated as build errorsmakeDir during file emission are propagatedfs.createReadStream/fs.createWriteStream) are propagated@rollup/pluginutilsWith TypeScript:
// rollup.config.ts
import url from '@rollup/plugin-url';
import type { RollupOptions } from 'rollup';
const config: RollupOptions = {
plugins: [
url({
limit: 10240,
include: ['**/*.png', '**/*.svg'],
publicPath: '/static/'
})
]
};
export default config;With Vite (Rollup-based):
// vite.config.js
import { defineConfig } from 'vite';
import url from '@rollup/plugin-url';
export default defineConfig({
build: {
rollupOptions: {
plugins: [
url({
limit: 8192,
publicPath: '/assets/'
})
]
}
}
});Multiple Build Targets:
// rollup.config.js
export default [
// Client build
{
input: 'src/client.js',
plugins: [url({ emitFiles: true, publicPath: '/assets/' })]
},
// Server build
{
input: 'src/server.js',
plugins: [url({ emitFiles: false, publicPath: '/assets/' })]
}
];