Как я могу изменить имя класса компонента svelte? - PullRequest
1 голос
/ 07 ноября 2019

У меня есть несколько файлов с одинаковыми именами, но из совершенно разных мест. Вот упрощенный пример:

AdminViews/Item.svelte
ClientViews/Item.svelte
DefaultViews/Item.svelte

Я пытаюсь импортировать их все из одного файла, например так:

import AdminItem from 'AdminViews/Item.svelte';
import ClientItem from 'ClientViews/Item.svelte';
import DefaultItem from 'DefaultViews/Item.svelte';

Даже если я импортирую их как разные имена, онивсе ссылки, в зависимости от того, какой импортируется последним. После исследования это выглядит так, потому что svelte устанавливает имя класса равным имени файла, независимо от пути, например:

class Item extends _internal.SvelteComponentDev {

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

Итак, мой вопрос: как я могу исправить это столкновение без изменения имен файлов? Конечно, есть способ изменить имя класса компонента, я просто не могу найти его в документации.

Если нет способа это исправить, то как svelte справляется с тем, чтолюди часто используют общие имена, например utils или index?

1 Ответ

1 голос
/ 07 ноября 2019

Используя компилятор Svelte напрямую, вы можете передать любое значение name:

const compiled = svelte.compile(code, {
  name: 'Potato'
});

К сожалению, большую часть времени вы взаимодействуете с компилятором косвенно, через что-то вроде rollup-plugin-svelte. или стройный погрузчик. В настоящее время эти плагины не предлагают способ управления именем каждого компонента - в идеале они позволят вам указать функцию filename => name, которая переопределяет поведение по умолчанию, если оно что-то возвращает. (Возможно, стоит открыть вопрос, если вы так склонны).

Для имен файлов, таких как src/Thingamajig/index.svelte, index уже удален в пользу Thingamajig. Другие столкновения не имеют значения, поскольку Svelte касается, потому что имена находятся в отдельных модулях - задача упаковщика - убедиться, что Item, Item и Item не соприкасаются друг с другом ввыход.

...