javascript - modules - nodejs import alias




Opções de passagem para importações do módulo ES6 (4)

É possível passar opções para importações ES6?

Como você traduz isso:

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

para ES6?


Conceito

Aqui está a minha solução usando o ES6

Muito em linha com a resposta do @Bergi, este é o "modelo" que eu uso ao criar importações que precisam de parâmetros passados ​​para declarações de class . Isso é usado em uma estrutura isomórfica que estou escrevendo, portanto, funcionará com um transpilador no navegador e no node.js (eu uso o Babel com o 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();

O acima será gerado foo em um console

EDITAR

Exemplo do mundo real

Para um exemplo do mundo real, estou usando isso para passar em um namespace para acessar outras classes e instâncias dentro de uma estrutura. Como estamos simplesmente criando uma função e passando o objeto como um argumento, podemos usá-lo com nossa declaração de classe likeso:

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

A importação é um pouco mais complicada e automagical no meu caso, dado que é um framework inteiro, mas essencialmente é isso que está acontecendo:

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

Eu espero que isso ajude!


Aqui está minha opinião sobre esta questão usando o módulo de depuração como um exemplo;

Na página npm deste módulo, você tem isto:

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

Na linha acima, uma string é passada para o módulo que é importado para construir. Veja como você faria o mesmo no ES6

import {debug como Debug} from 'debug' const debug = Depurar ('http');

Espero que isto seja útil a alguém.


Eu acredito que você pode usar os carregadores de módulos es6. http://babeljs.io/docs/learn-es6/

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

Não há como fazer isso com uma única declaração de import , ela não permite invocações.

Então você não chamaria isso diretamente, mas basicamente você pode fazer exatamente o mesmo que o commonjs faz com as exportações padrão:

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

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

Como alternativa, se você usar um carregador de módulo que suporte promessas monadic , poderá fazer algo como

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

Com o novo 2ality.com/2017/01/import-operator.html ele pode se tornar

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

ou

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

no entanto, você provavelmente não deseja uma importação dinâmica, mas uma estática.





es6-modules