Импорт старого javascript с пространством имен из ES6 - PullRequest
0 голосов
/ 28 декабря 2018

Я конвертирую старый javascript в ES6, используя babel и webpack.В нескольких файлах у меня есть что-то вроде

var BLOG = BLOG || {};
BLOG.myClass1 = ...

, а в другом файле

var BLOG = BLOG || {};
BLOG.myClass2 = ...

Итак, я добавил export {BLOG} к этим файлам, но как я могу импортировать BLOG несколько раз?Кажется, это не разрешено, хотя я хотел бы сделать что-то вроде

import {BLOG} from 'file1.js'
import {BLOG} from 'file2.js'

и добавить myClass1 и myClass2 в BLOG.

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Вам необходимо использовать импорт следующим образом

{BLOG as variable name} from file

0 голосов
/ 28 декабря 2018

Итак, я добавил export {BLOG} к этим файлам, но как я могу импортировать BLOG несколько раз?

Вам придется использовать разные привязки импорта для них:

import {BLOG as BLOG1} from 'file1.js';
import {BLOG as BLOG2} from 'file2.js';

... затем используйте BLOG1 и BLOG2.Или, если вас это беспокоит, добавьте

const BLOG = Object.assign({}, BLOG1, BLOG2);

после импорта и продолжайте использовать BLOG.

Если у вас есть циклические зависимости, возможно, что BLOG1и BLOG2 не может быть сразу же заполнен полностью.При значении true import / export в этой ситуации получаемые вами объекты будут иметь свои свойства, но эти свойства еще не будут инициализированы .Таким образом, с истинным import / export или хорошим моделированием вы можете использовать свойства аксессора для его обработки:

// In a true ES2015+ module environment, or a simulated one that
// creates the properties up-front like the real one does
const BLOG = (() => {
    const b = {};
    for (const blog of [BLOG1, BLOG2]) {
        for (const key of Object.keys(blog)) {
            Object.defineProperty(b, key, {
                get(name) {
                    return blog[name];
                }
            });
        }
    }
    return b;
})();

(Очевидно, вы обернули бы это в функцию и использовали бы ее повторно.)

В смоделированной модульной среде, которая не создает свойства заранее, как это было бы с реальным, вы можете использовать прокси (хотя, конечно, если вы собираетесь запустить этов среде, предшествующей ES2015, он не будет иметь Proxy):

const BLOGS = [BLOG1, BLOG2];
const BLOG = new Proxy({}, {
  get(target, propName, receiver) {
    const b = BLOGS.find(b => propName in b) || target;
    return Reflect.get(b, propName, receiver);
  }
});

Затем свойства, добавленные к BLOG1 и BLOG2 после этого, по-прежнему будут правильно разрешены.

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


Но: Вместо экспорта BLOG, , как SLaks говорит , экспортируйте классы и импортируйте их.Нет необходимости в «объекте пространства имен», когда вы используете правильные модули.

export { myClass1 };

и

export { myClass2 };

, а затем

import { myClass1 } from "file1.js";
import { myClass2 } from "file2.js";

Вы можете дажеэкспортируйте класс в том виде, как вы его определили, либо:

export function myClass1() { /* ... */ }

, либо при использовании записи class:

export class myClass1 { /* ... */ }

Изменение new BLOG.myClass1 на new MyClass1 в нескольких файлах действительнопростой поиск и замена.В * nix вы можете добавить в него sed и создать целое дерево каталогов ...


. Примечание: * * * * * * * * * * * * * * * * * * * * * * * 10 * * * * Соглашение о функциях конструктораслабо называемые «классы», например, функции, которые вы используете с new), пишутся с начальным символом верхнего регистра.Например, MyClass1 и MyClass2.

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