Итак, я добавил 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
.