Webpack plugin: how can I modify and re-parse a module after compilation?

I figured out how to do this in a pretty painless fashion.

Things I had wrong:

  • probably hooking in too late? the earliest plugin where you can accomplish this is the compilation’s ‘seal’ plugin. Despite the name, this plugin hook executes as the very first line in the seal function, so no sealing has yet occurred. At this point all the modules have been loaded.
  • rebuildModule() isn’t a good idea, because this re-loads the module from scratch: the file’s source is loaded and passed through any applicable loaders, and the _source property of the module object is eventually reassigned when that process is finished.
    • Using rebuildModule() at this point would actually be great if there were a way to modify the module source as it was being loaded in this call (i.e. dynamically assign a loader function that’s only used on this rebuild). We’d then be able to take advantage of the sourceMap behavior that happens when a module’s source is loaded (see below)

How I got it working:

  • hook into compilation‘s ‘seal’ plugin, iterate through the compilation’s modules and find the one you want
  • modify the module’s source, e.g. module._source._value += extraCode;
  • reparse the module:

    module.parse.parse(module._source.source(), {
      current: module, 
      module.module,
      compilation: compilation,
      options: compilation.options
    });
    

The parsing is taken from NormalModule’s build method, which is called more or or less immediately after the source has been loaded during the normal module build process.

This implementation gets the modified and parsed source into my final output. Since there’s some sourceMap stuff in NormalModuleMixin’s doBuild method, and since I’m adding to the source after those functions have been called, I assume the sourceMap will be messed up now. So, next step is getting the sourceMap to reflect the code addition. Not sure whether to try and manually update the sourceMap or look into the idea above, trying to dynamically apply a loader and call rebuildModule() instead of parsing.

If you know a better way of doing any of the above, please let me know!

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)