Instrument Context Module
A utility for adding instrumentation to Webpack dynamic context modules.
Usage
Certain Webpack plugins use a set of regular expressions to filter modules, a context expression to match a directory and a module expression to filter files within the directory.
instrumentContextModule
is used to wrap a set of regular expressions used by webpack plugins to enable monitoring the matches found by the plugins.
const handleContext = console; const handleModule = console; const wrap = ; const moduleRegExp = wrap;const contextRegExp = wrap; const plugin = contextRegExp moduleRegExp;
The handleContext
function is called for the first module match within a context. It receives as arguments in order:
- The path of the context.
- The regular expression that matched the context.
- The regular expression that matched the module.
The handleModule
function is called for every module match. It receives as arguments in order:
- The require path of the module, this may be relative to the context.
- The path of the context.
- The regular expression that matched the context.
- The regular expression that matched the module.
Since the result of instrumentContextModule
is stateful, a new instance must be created for each plugin to be instrumented.
Examples
Logging dynamically included modules.
With a non-restrictive module regular expression, an instrumented ContextReplacementPlugin
can be used to simply observe and log what is included in a certain context.
Webpack config
// webpack.config.babel.js// ;;;;; const ROOT = ; const logInclude = ; const iconPath = ; // Existing webpack config. context: ROOT plugins: processenvICON_PATH: JSON logInclude logInclude ;
Component file
const icons = require;
Console output
🗃 Including /\.icon\.svg$/ in src/asset/icon
arrow-down.icon.svg
arrow-left.icon.svg
arrow-right.icon.svg
arrow-up.icon.svg
chevron-left.icon.svg
...
--
Logging dynamically ignored modules.
(Waiting on https://github.com/webpack/webpack/pull/4418)
IgnorePlugin
can be instrumented to log which modules are excluded.
Note that the arguments to
IgnorePlugin
reversed compared toContextReplacementPlugin
.
Webpack config
// webpack.config.babel.js// ;;;; const ROOT = ; const LOCALES = 'en' 'fr'; const logIngore = ; // Existing webpack config. context: ROOT plugins: webpack ;
Console output
🚫 Ignoring /^\.\/(?!en|fr).*\.js$/ in node_modules/moment/locale
af.js
ar-dz.js
ar-ly.js
ar-ma.js
ar-sa.js
ar-tn.js
ar.js
az.js
be.js
bg.js
bn.js
bo.js
br.js
...