Параметры передачи для импорта модулей ES6

Возможно ли передать параметры импорта ES6?

Как вы переводите это:

var x = require('module')(someoptions);

в ES6?

Ответ 1

Нет никакого способа сделать это с помощью одного оператора import, он не позволяет делать вызовы.

Таким образом, вы не будете называть его напрямую, но в принципе вы можете сделать то же самое, что обычно делает с экспортом по умолчанию:

// module.js
export default function(options) {
    return {
        // actual module
    }
}

// main.js
import m from 'module';
var x = m(someoptions);

В качестве альтернативы, если вы используете загрузчик модуля, который поддерживает monadic promises, вы можете сделать что-то вроде

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

С помощью нового import оператора он может стать

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

или

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

однако вам, вероятно, не нужен динамический импорт, а статический.

Ответ 2

Концепция

Здесь мое решение с использованием ES6

Очень важно встроить ответ @Bergi, это "шаблон", который я использую при создании импорта, которому нужны параметры, переданные для объявлений class. Это используется в изоморфной структуре, которую я пишу, поэтому будет работать с транспилером в браузере и в node.js(я использую Babel с 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();

Вышеуказанное выведет foo в консоли

ИЗМЕНИТЬ

Пример реального мира

Для примера в реальном мире я использую это для передачи в пространстве имен для доступа к другим классам и экземплярам в рамках. Поскольку мы просто создаем функцию и передаем объект в качестве аргумента, мы можем использовать его с нашим объявлением класса:

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

Импорт немного сложнее и automagical в моем случае, учитывая, что это целая структура, но по существу это то, что происходит:

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

Надеюсь, это поможет!

Ответ 3

Ответ на использование @Bergi для использования модуля отладки с использованием es6 будет следующим

// original
var debug = require('debug')('http');

// ES6
import * as Debug from 'debug';
const debug = Debug('http');

// Use in your code as normal
debug('Hello World!');

Ответ 4

Я считаю, вы можете использовать загрузчики модулей es6. http://babeljs.io/docs/learn-es6/

System.import("lib/math").then(function(m) {
  m(youroptionshere);
});

Ответ 5

Вам просто нужно добавить эти 2 строки.

import xModule from 'module';
const x = xModule('someOptions');

Ответ 6

Я попал в эту ветку в поисках чего-то похожего и хотел бы предложить лучшее, ИМХО, по крайней мере, в некоторых случаях, решение (или услышать, почему это не так).

Случай использования

У меня есть модуль, который запускает некоторую логику реализации сразу после загрузки. Я не люблю вызывать эту логику инициализации вне модуля (которая аналогична вызову new SomeClass(p1, p2) или new ((p1, p2) => class SomeClass {... p1... p2... }) и тому подобное).

Мне нравится, что эта логика инициализации будет запускаться один раз, в некотором роде единственного потока реализации, но один раз для некоторого конкретного параметризованного контекста.

пример

service.js имеет в своей основе:

let context = null;                  // meanwhile i'm just leaving this as is
console.log('initialized in context ' + (context ? context : 'root'));

Модуль А выполняет:

import * as S from 'service.js';     // console has now "initialized in context root"

Модуль B делает:

import * as S from 'service.js';     // console stays unchanged! module script runs only once

Пока все хорошо: сервис доступен для обоих модулей, но инициализирован только один раз.

проблема

Как заставить его работать как другой экземпляр и снова инициировать себя в другом контексте, скажем, в модуле C?

Решение?

Вот о чем я думаю: - в сервис добавим следующее:

let context = new URL(import.meta.url).searchParams.get('context');

Теперь модуль C будет делать:

import * as S from 'service.js?context=special';

модуль будет повторно импортирован, будет запущена базовая логика инициализации, и мы увидим в консоли:

initialized in context special

Ответ 7

Вот мой взгляд на этот вопрос на примере модуля отладки;

На этой странице модуля npm у вас есть это:

var debug = require ('debug') ('http')

В строке выше строка передается в импортируемый модуль для создания. Вот как бы вы сделали то же самое в ES6


import {debug as Debug} из 'debug' const debug = Debug ('http');


Надеюсь, это поможет кому-то там.