Копирование и ссылание на изображения

Дата обновления перевода 2022-01-17

Копирование и ссылание на изображения

Вам нунжо сослаться на статичный файл - вроде пути к изображения для тега img? Это может быть сложно, если вы храните свои ресурсы вне корня публичных документов. К счастью, в зависимости от вашей ситуации, есть решение!

Ссылание на изображения из файла JavaScript Webpack

Чтобы сослаться на тег изображения из файла JavaScript file, затребуйте файл:

1
2
3
4
5
6
7
// assets/app.js

// возвращает финальный публичный путь к этому файлу
// путь относителен этого файла - к примеру, assets/images/logo.png
import logoPath from '../images/logo.png';

let html = `<img src="${logoPath}" alt="ACME logo">`;

Когда вы require (или import) файл изображения, Webpack копирует его в ваш каталог вывода и возвращат финальный, публичный путь к этому файлу.

Ссылание на изображения из шаблона

Чтобы сослаться на файл вне файла JavaScript, обрабатываемого Webpack - вроде шаблона - вы можете использовать метод copyFiles(), чтобы скопировать эти файлы в ваш финальный каталог вывода. Для начала, включите его в webpack.config.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// webpack.config.js

  Encore
      // ...
      .setOutputPath('public/build/')

+     .copyFiles({
+         from: './assets/images',
+
+         // необязательный целевой путь, относительно dir вывода
+         to: 'images/[path][name].[ext]',
+
+         // если подключено версионирование, добавьте также хеш файла
+         //to: 'images/[path][name].[hash:8].[ext]',
+
+         // копируйте только файлы, совпадающие с данным паттерном
+         //pattern: /\.(png|jpg|jpeg)$/
+     })

Затем перезапустите Encore. Когда вы это сделаете, он даст вам команду, которую вы можете выполнить для установки недостающих зависимостей. После выполнения этой команды и перезапуска Encore, вы закончили!

Это скопирует все файлы из assets/images в public/build/images. Если у вас подключено версионирование, скопированные файлы будут включать в себя хеш, основанный на их содержании.

Чтобы отобразить внутри Twig, используйте функцию asset():

1
2
3
4
5
{# assets/images/logo.png был скопирован в public/build/images/logo.png #}
<img src="{{ asset('build/images/logo.png') }}" alt="ACME logo">

{# assets/images/subdir/logo.png был скопирован в public/build/images/subdir/logo.png #}
<img src="{{ asset('build/images/subdir/logo.png') }}" alt="ACME logo">

Убедитесь в том, что вы включили опцию json_manifest_path, которая указывает функции asset() считывать финальные пути из файла manifest.json. Если вы не уверены, какой путь аргумента передать функции asset(), найдите файл в manifest.json и используйте ключ в качестве аргумента.