ES Модули Динамический импорт () различия - PullRequest
0 голосов
/ 11 июля 2019

Поэтому я недавно начал играть с динамическим импортом и попытался написать код в стиле, который был бы у меня в common.js, и натолкнулся на разницу и хотел получить некоторую информацию об этом.

В common.jsЯ написал бы мой экспорт следующим образом:

var x = {};

x.foo = async () => {

    //Imaginary code here.

};

x.bar = async () => {

    //Imaginary code here.

};

modules.export = x;

, и я просто импортировал бы так:

var fooBar = require("fooBar");

, и это сработало бы, я мог бы позвонить fooBar.foo();, но с import();это отличается, мой экспорт будет:

var x = {};

x.foo = async () => {

    //Imaginary code here.

};

x.bar = async () => {

    //Imaginary code here.

};

export {x};

и импорт:

var module = ( await import('./module.js') ).x;

Вот где возникает разница, мне нужно обернуть мой импорт в ().x; для module.foo(); на работу, если я не работаю, то мой объект выглядит следующим образом:

enter image description here

и вызов module.foo() приводит к undefined, который японимаю, почему это так, но попытка вызова module.x.foo() приводит к:

enter image description here

Что не имеет смысла, так как расширение module.x показывает foo() там,Также в экспорте, зачем мне инкапсулировать мой объект в {x}, когда он уже является объектом, но запись export x; приводит к синтаксической ошибке.Я пробовал разные способы получить нужную мне функциональность, и мои попытки были такими:

С оператором распространения:

var {... module} = await import('./module.js');
module.x.foo();// function is accessible.

С именным экспортом:

//module.js
export {x as module};

//app.js
var {module} = await import('./module.js');

//Object name is tied to export declaration and not ideal.

В конечном итоге я пришел к этому, чтобы приблизиться к желаемой функциональности:

index.html

<!doctype html>

    <head>

        <script src=app/js/imp.js defer></script>
        <script type=module src=app/js/app.js defer></script>

    </head>

    <body></body>

</html>

imp.js

var imp = async file => {

    try {

        var exp = await import(file);

        return exp.x;

    }catch(err) {

        return err;

    }

};

app.js

(async () => {

    try {

        var module = await imp('./module.js');

        module.foo();
        module.bar();

    }catch(err) {

        throw(err);

    };

})();

module.js

var x = {};

x.foo = async () => {

    //Imaginary code here.

};

x.bar = async () => {

    //Imaginary code here.

};

export {x};

TLDR;

Почему import() создан таким образом и существует ли лучший способ согнутьimport() вести себя более похоже на common.js (я открыт для возни с prototype, но не знаю, как и если это возможно) в отношении того, как export добавляется к object безменяя стиль письма.

PS Пожалуйста, не включайте ответы типа "использовать статический импорт или рамки".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...