Passer des options à ES6 module importations
Est-il possible de passer des options à ES6 importations?
Comment traduire ceci:
var x = require('module')(someoptions);
à ES6?
- Pas sûr que vous pouvez, il y a un module loader API, ou au moins il y avait à une certaine époque, c'était quelque chose comme
System.import(module)
, pas sûr si cela permet d'arguments ou pas, quelqu'un qui en sait plus sur l'ES6 ne doute ? - Il y a une solution proposée pour cette, pour lesquels il existe déjà mises en œuvre dans les node.js (via un plugin) et webpack: 2ality.com/2017/01/import-operator.html
Vous devez vous connecter pour publier un commentaire.
Il n'y a aucun moyen de le faire avec un seul
import
déclaration, il ne permet pas pour les invocations.De sorte que vous n'appelez pas directement, mais vous pouvez faire exactement la même chose que commonjs ne avec par défaut exportations:
Alternativement, si vous utilisez un chargeur de module qui prend en charge monadique promesses, vous pourriez être en mesure de faire quelque chose comme
Avec la nouvelle
import
de l'opérateur il pourrait devenirou
cependant, vous ne voulez probablement pas à une dynamique de l'importation, mais statique.
import x from 'module' use someoptions;
un peu de syntaxeimport {x, y} from 'module'
). Alors quelle devrait être la syntaxe être si je veux passer plusieurs arguments? Ou la propagation d'un tableau d'arguments? C'est une étroite cas d'utilisation et, fondamentalement, vous essayez d'ajouter une syntaxe différente pour un appel de fonction, mais nous avons déjà des appels de fonction, ce qui nous permet de traiter tous les autres cas.var session = require('express-session'); var RedisStore = require('connect-redis')(session);
je me demandais juste si il y avait une solution en ligne. Je peux tout à fait survivre avec split le RedisStore affectation en 2 lignes 🙂import {default(someoptions) as x} from 'module'
dans l'ES7, si il est vraiment nécessaire pour cela.session
/connect-redis
exemple, j'ai été en imaginant la syntaxe ressemble à ceci:import session from 'express-session'); import RedisStore(session) from 'connect-redis'
.import
🙁const x = (await import(…))(options)
dans un module de portée. (Pas encore?)export default function (GreetingIntroTxt:string) { class Student { name: string; constructor(name: string) { this.name = name; } greet() { return
"${GreetingIntroTxt}, " + this.salut; } } return { Student,} }
Cela renvoie une erreur: TS4060: le type de Retour de la fonction exportée, ou a l'aide d'privé nom de "classe"Concept
Voici ma solution à l'aide ES6
Très bien en ligne avec @Bergi la réponse, c'est le "modèle" - je utiliser lors de la création d'importations qui ont besoin de paramètres passés pour
class
déclarations. Il est utilisé sur une isomorphe cadre que je suis en train d'écrire, il en sera de travailler avec un transpiler dans le navigateur et dans node.js (j'utiliseBabel
avecWebpack
):./MyClass.js
./main.js
Ci-dessus seront de sortie
foo
dans une consoleMODIFIER
L'Exemple Du Monde Réel
Pour un exemple concret, je suis en utilisant ce passer dans un espace de noms pour accéder à d'autres classes et les instances à l'intérieur d'un cadre. Parce que nous sommes tout simplement la création d'une fonction et de passer l'objet en tant qu'argument, nous pouvons l'utiliser avec notre déclaration de classe likeso:
L'importation est un peu plus compliqué et
automagical
dans mon cas, étant donné que c'est un framework, mais essentiellement, c'est ce qui se passe:J'espère que cela aide!
MyView
s'étend de certains éléments disponibles dans le cadre de l'espace de noms. Alors qu'il est tout à fait possible de simplement passer comme paramètre de la classe, elle dépend aussi de quand et où la classe est instanciée, la portabilité est affecté. Dans la pratique, ces classes peuvent être transmis à d'autres cadres de qui peut instancier différemment (par exemple, la coutume de Réagir composants). Lorsque la classe se trouve à l'extérieur du cadre de la portée, il peut encore maintenir l'accès au cadre lorsqu'il est instancié à cause de cette méthodologie.Bâtiment sur @Bergi de réponse d'utiliser le debug module à l'aide de es6 serait le suivant
Je crois que vous pouvez utiliser es6 module de chargeurs.
http://babeljs.io/docs/learn-es6/
m(youroptionshere)
fin? Je suppose que vous pourriez écrireSystem.import('lib/math').then(m => m(options)).then(module => { /* code using module here */})
... mais c'est pas très clair.Vous avez juste besoin d'ajouter ces 2 lignes.
J'ai atterri sur ce fil à la recherche pour un peu similaire et souhaitez proposer un mieux, à mon humble avis, au moins dans certains cas, la solution (ou de comprendre pourquoi il n'est pas si).
Cas d'utilisation
J'ai un module, c'est l'exécution de certains instanciation logique immédiatement après le chargement. Je ne pas appelle init logique à l'extérieur du module (qui est le même que l'appel de
new SomeClass(p1, p2)
ounew ((p1, p2) => class SomeClass { ... p1 ... p2 ... })
, et autres).Je n'aime que ce init logique sera exécuté une fois, une sorte de singulier instanciation de flux, mais une fois par certains paramétrées contexte.
Exemple
service.js
a à sa base très étendue:Module n':
Module B n':
So far So good: le service est disponible pour les deux modules, mais a été initialisé qu'une seule fois.
Problème
Comment le faire fonctionner comme une autre instance et l'initialisation de nouveau dans un autre contexte, par exemple dans le Module C?
Solution?
C'est ce que je suis en train de réfléchir: utiliser les paramètres de requête. Dans le service que nous aimerions ajouter les éléments suivants:
let context = new URL(import.meta.url).searchParams.get('context');
Module C ferait:
le module sera ré-importé, c'est init de base de la logique, et nous allons voir dans la console:
initialized in context special
Voici mon point de vue sur cette question en utilisant le module de débogage comme un exemple;
Sur ce module npm page, vous avez ceci:
Dans la ligne ci-dessus, une chaîne est transmise au module qui est importé, à construire. Voici comment vous pourriez faire de même dans l'ES6
Espère que cela aide quelqu'un là-bas.