Pass options to ES6 module imports Pass options to ES6 module imports javascript javascript

Pass options to ES6 module imports


There is no way to do this with a single import statement, it does not allow for invocations.

So you wouldn't call it directly, but you can basically do just the same what commonjs does with default exports:

// module.jsexport default function(options) {    return {        // actual module    }}// main.jsimport m from 'module';var x = m(someoptions);

Alternatively, if you use a module loader that supports monadic promises, you might be able to do something like

System.import('module').ap(someoptions).then(function(x) {    …});

With the new import operator it might become

const promise = import('module').then(m => m(someoptions));

or

const x = (await import('module'))(someoptions)

however you probably don't want a dynamic import but a static one.


Concept

Here's my solution using ES6

Very much inline with @Bergi's response, this is the "template" I use when creating imports that need parameters passed for class declarations. This is used on an isomorphic framework I'm writing, so will work with a transpiler in the browser and in node.js (I use Babel with Webpack):

./MyClass.js

export default (Param1, Param2) => class MyClass {    constructor(){        console.log( Param1 );    }}

./main.js

import MyClassFactory from './MyClass.js';let MyClass = MyClassFactory('foo', 'bar');let myInstance = new MyClass();

The above will output foo in a console

EDIT

Real World Example

For a real world example, I'm using this to pass in a namespace for accessing other classes and instances within a framework. Because we're simply creating a function and passing the object in as an argument, we can use it with our class declaration likeso:

export default (UIFramework) => class MyView extends UIFramework.Type.View {    getModels() {        // ...        UIFramework.Models.getModelsForView( this._models );        // ...    }}

The importation is a bit more complicated and automagical in my case given that it's an entire framework, but essentially this is what is happening:

// ...getView( viewName ){    //...    const ViewFactory = require(viewFileLoc);    const View = ViewFactory(this);    return new View();}// ...

I hope this helps!


Building on @Bergi's answer to use the debug module using es6 would be the following

// originalvar debug = require('debug')('http');// ES6import * as Debug from 'debug';const debug = Debug('http');// Use in your code as normaldebug('Hello World!');