Dynamically required provider module with webpack

Usually, if static requirements or import (CommonJS / ES import), webpack can require any module from / node_modules /, for example:

var vendorModule = require('vendor-module');

But I want to dynamically load the module from / node_modules / like:

var vendorModuleId = 'vendor-module';

...

var vendorModule = require(vendorModuleId);

This does not work because webpack cannot determine the dependency at compile time and is obviously insane to include all / node_modules / in the kit if we want to dynamically load some provider module.

I am looking for a way to trick webpack into dynamically solving these modules. Preferably, telling webpack which modules in / node_modules / should be included through the webpack configuration file.

Some people say that ContextReplacementPlugin may be useful for these situations, but I cannot figure out how to do this.

- , ? !

+4
2

.

  • "./vendors.js";
  • npm install exports-loader imports-loader --save-dev
  • webpack.config.js:

    // config needed vendor modules
    var vendorModules = [
        'one', 'two', 'three', 'vendor-module'
    ];
    
    ...
    
    module.exports = {
    ...
        loaders: [{ // Add loader
            include: require.resolve('./vendors.js'),
            loader: 'imports-loader?' + vendorsModules.map(function(module, index) {
                return 'dep' + index + '=' + module;
            }).join(',') + '!exports-loader?' + vendorsModules.map(function(module, index) {
                return module + '=dep' + index;
            }).join(',')
        },...]
        ...
    }
    
  • , :

    // import * as vendorsModules from './vendors';
    var vendorsModules = require('./vendors');
    
    var vendorModuleId = 'vendor-module';
    ...
    var vendorModule = vendorsModules[vendorModuleId];
    console.log('module', vendorModule);
    

. , factory require.resolve .

+3

, :

// module.js
export default {
  init: () => console.log('module.init'),
};

// index.js
const id = 'module';
import(`./${id}.js`).then(obj => obj.default.init());
0

Source: https://habr.com/ru/post/1626265/


All Articles