esbuild-plugin-import-pattern
esbuild plugin that imports modules based on wildcard patterns.
Attempts to improve upon the ergonomics of esbuild-plugin-import-glob.
Installation
Install the dependency:
npm install esbuild-plugin-import-pattern --save-dev
Configure esbuild:
const esbuild = require('esbuild')
const { importPatternPlugin } = require('esbuild-plugin-import-pattern')
esbuild.build({
...
bundle: true,
plugins: [importPatternPlugin()]
})
Usage
Import something using a wildcard pattern:
import { entries } from './files/*.js'
console.log(entries)
This will produce an array of tuples, each containing the path to an imported file and its exports:
[
['./files/one.js', { // Source:
default: 'one' // export default 'one'
}],
['./files/two.js', { // Source:
default: 2, // export default 2
noun: 'two' // export const noun = 'two'
}],
...
]
If you're only interested in the exports, import modules
instead of entries
.
Similarly, you can choose to import paths
.
Tips
If you want to look modules up by their path, you can feed entries
directly
into Object.fromEntries(entries)
or new Map(entries)
.
To use multiple imports in the same module, be sure to rename them using the
as
keyword:
import { entries as cats } from './cats/*.js'
import { entries as dogs } from './dogs/*.js'
Other than *
, you can also use any pattern supported by
fast-glob. However, the pattern needs
to contain at least one *
character.
Selecting Named Imports
By default, each matching import will expose all of its exports. Currently, this makes esbuild produce some unnecessary code. If bundle size is a concern, you will want to avoid this.
As long as all imports export the same name(s), you can tell the plugin to only import those. You do this by appending a hash symbol to the pattern, followed by the names, separated by commas.
For example, to only get the default exports from files/*.js
, you would write:
import { modules } from './files/*.js#default'
console.log('Default exports:', modules.map((module) => module.default))
Note that omitting #default
will not change the behavior of this script.
However, the generated bundle will be bigger.
Author
License
MIT