Какова хорошая практика для инкапсуляции нескольких файлов JavaScript в одном модуле ES6? - PullRequest
0 голосов
/ 22 июня 2019

Имея в виду структуру упаковки C # / C ++, как мне добиться, чтобы JS-классы в отдельных файлах импортировались как единое пространство имен?

Мое в настоящее время работающее решение состоит в том, чтобы использовать дополнительный скрипт-файл «package», который затем инкапсулирует все классы.См. Приведенный ниже код.

Кажется, что это включает в себя много накладных расходов (обновление пакета-скрипта-экспорта с каждым новым классом, импорт этого скрипта в каждый новый класс).

ClassA.js:

import * as MyPackage from "../MyPackage.js";

export default class ClassA {/* some Class Code */}

export {
    ClassA
};

MyPackage.js:

import ClassA from "./module/ClassA.js";
import ClassB from "./module/ClassB.js";

export {
   ClassA,ClassB
}

script.js:

import * as MyPackage from "./MyPackage.js"

let a = new MyPackage.ClassA();

Что было бы лучше для этого?

1 Ответ

0 голосов
/ 22 июня 2019

Мое в настоящее время работающее решение состоит в том, чтобы использовать дополнительный файл сценария "package", который затем инкапсулирует все классы.

Да, это лучшая практика.Файл сценария «package» обычно называется index.js и помещается в каталог пакета, так как именно к этому разрешается путь к папке при импорте.

импорт этого сценария в каждый новый класс

Нет, вы не должны этого делать.Это вводит круговую зависимость.Пока ваш модуль не зависит от других классов, он не должен ничего импортировать.Здесь нет «объявления пакета», модуль представляет собой автономный файл со своими собственными зависимостями.

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

// mypackage/classA.js:

export default class ClassA {
    /* some Class Code */
}

// mypackage/index.js:

export { default as ClassA } from "./classA.js";
export { default as ClassB } from "./classB.js";
// your solution of importing, then exporting works as well.

// script.js:

import * as MyPackage from "./mypackage";
const a = new MyPackage.ClassA();

// or

import { ClassA } from "./mypackage";
const a = new ClassA();
...