class ProvideGlobalsPlugin {
constructor(definitions) {
this.definitions = definitions;
}
apply(compiler) {
compiler.hooks.compilation.tap(
'ProvideGlobalsPlugin',
(compilation, { normalModuleFactory }) => {
const handler = (parser) => {
for (const [name, modulePath] of Object.entries(this.definitions)) {
// Hook into identifier expressions
parser.hooks.expression.for(name).tap(
'ProvideGlobalsPlugin',
(expr) => {
const dep = new ProvidedDependency(
modulePath,
name,
[],
expr.range
);
dep.loc = expr.loc;
parser.state.module.addDependency(dep);
return true;
}
);
}
};
normalModuleFactory.hooks.parser
.for('javascript/auto')
.tap('ProvideGlobalsPlugin', handler);
normalModuleFactory.hooks.parser
.for('javascript/dynamic')
.tap('ProvideGlobalsPlugin', handler);
normalModuleFactory.hooks.parser
.for('javascript/esm')
.tap('ProvideGlobalsPlugin', handler);
}
);
}
}
// Usage
new ProvideGlobalsPlugin({
$: 'jquery',
_: 'lodash'
});