Как я могу вставить изображение в веб-компонент?

Я пытаюсь вставить изображение в веб-компонент, который создаю с помощью Stencil.

Я получаю 2 ошибки:

AppLogo is declared but its value is never read.

а также

Cannot find module ../assets/logo.svg.

Справочники:

- src
-- components
--- app-header
---- assets
----- logo.svg
---- app-header.tsx
---- app-header.scss
---- app-header.spec.ts

Код:

import { Component } from "@stencil/core";
import AppLogo from "../assets/logo.svg";

@Component({
  tag: "app-header",
  styleUrl: "app-header.scss"
})

export class AppHeader {
  render() {
    return (
      <header class="app-header">
        <a href="#" class="app-logo">
          <img src="{AppLogo}" alt="App Name" />
        </a>
      </header>
    );
  }
}

Там нет тонны документации вокруг этого (что я могу найти). Итак, любая помощь приветствуется.

1 ответ

Довольно много вещей, которые пошли не так здесь.

import AppLogo from "../assets/logo.svg";

Вы не можете просто импортировать файл.svg в Javascript. Что вы ожидаете AppLogo содержать, когда вы импортируете это так? Обычно, когда вы импортируете файл.js,.jsx или.tsx таким образом, где-то в этих файлах есть export указано. Итак, вы знаете, когда вы import из этого файла вы получите все, что экспортировали. Здесь нет export хотя в.svg.

Ваше использование также неправильно:

<header class="app-header">
  <a href="#" class="app-logo">
    <img src="{AppLogo}" alt="App Name" />
  </a>
</header>

Прежде всего избавиться от " вокруг {AppLogo}, Вы хотите использовать значение {AppLogo}- не использовать строку, содержащую {AppLogo}.

Теперь есть два способа достичь того, что вы хотите:

Путь активов

Где-то в корне вашего проекта, есть stencil.config.ts файл. Там вы можете указать задачи копирования. Вы можете прочитать здесь, как это сделать: https://stenciljs.com/docs/config

После того, как вы настроите это правильно и ваш ../assets/ папка копируется в ваш build папку, вы можете просто использовать изображение, указав путь в качестве src:

<header class="app-header">
  <a href="#" class="app-logo">
    <img src="./assets/logo.svg" alt="App Name" />
  </a>
</header>

Свернуть путь

Вы также можете использовать Rollup для импорта. Трафарет использует Rollup в качестве модуля связывания. stencil.config.ts в основном это файл rollup.config. Вы можете найти много документации о накопительном пакете здесь: https://rollupjs.org/guide/en

Есть несколько накопительных плагинов, которые поддерживают импорт файлов.svg:

  • Накопительный-плагин-SVG
  • Накопительный-плагин-svgo
  • Накопительный-плагин-SVG-к-JSX

Если вы используете какой-либо из них, вы сможете import ваши файлы.svg. В зависимости от того, какой плагин вы используете AppLogo будет содержать что-то другое.

Например, rollup-plugin-svg-to-jsx даст вам готовый к использованию JSX-тег при импорте. Итак, после того, как вы

import AppLogo from "../assets/logo.svg";

Вы сможете использовать его как:

<header class="app-header">
  <a href="#" class="app-logo">
    <AppLogo />
  </a>
</header>

Вы можете просто экспортировать константу со значением пути applogo, если она статическая, как показано ниже:

import { Component } from "@stencil/core";
import appLogo from ".";

@Component({
  tag: "app-header",
  styleUrl: "app-header.scss"
})

export class AppHeader {
  render() {
    return (
      <header class="app-header">
        <a href="#" class="app-logo">
          <img src={appLogo} alt="App Name" />
        </a>
      </header>
    );
  }
}

export const appLogo = "../assets/logo.svg";

Также я предлагаю создать отдельный файл для ваших статических констант типа constants.ts и импортировать оттуда логотип файла.

Другие вопросы по тегам