Возможно ли передать параметры импорта ES6?
Как вы переводите это:
var x = require('module')(someoptions);
в ES6?
Возможно ли передать параметры импорта ES6?
Как вы переводите это:
var x = require('module')(someoptions);
в ES6?
Нет никакого способа сделать это с помощью одного оператора 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)
однако вам, вероятно, не нужен динамический импорт, а статический.
Здесь мое решение с использованием 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();
}
// ...
Надеюсь, это поможет!
Ответ на использование @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!');
Я считаю, вы можете использовать загрузчики модулей es6. http://babeljs.io/docs/learn-es6/
System.import("lib/math").then(function(m) {
m(youroptionshere);
});
Вам просто нужно добавить эти 2 строки.
import xModule from 'module';
const x = xModule('someOptions');
Я попал в эту ветку в поисках чего-то похожего и хотел бы предложить лучшее, ИМХО, по крайней мере, в некоторых случаях, решение (или услышать, почему это не так).
Случай использования
У меня есть модуль, который запускает некоторую логику реализации сразу после загрузки. Я не люблю вызывать эту логику инициализации вне модуля (которая аналогична вызову 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
Вот мой взгляд на этот вопрос на примере модуля отладки;
На этой странице модуля npm у вас есть это:
var debug = require ('debug') ('http')
В строке выше строка передается в импортируемый модуль для создания. Вот как бы вы сделали то же самое в ES6
import {debug as Debug} из 'debug' const debug = Debug ('http');
Надеюсь, это поможет кому-то там.