Правила преобразования URL (Asset URL Transform Rules) — это механизм обработки путей к статическим ресурсам (изображениям, шрифтам, файлам стилей) в Vue-приложениях. Рассмотрим их детально.
В современных сборщиках есть три подхода:
В шаблонах и стилях .vue
файлов:
<!-- В template -->
<img src="@/assets/logo.png">
<!-- В style -->
<style>
.bg {
background-image: url(```@/assets/bg.jpg);
}
</style>
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 8 * 1024 // 8kb - файлы меньше встраиваются как data-URL
}
},
generator: {
filename: 'img/[name].[hash:8][ext]'
}
}
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
type: 'asset/resource',
generator: {
filename: 'fonts/[name].[hash:8][ext]'
}
}
В проектах на Vue CLI 4+ правила уже предустановлены:
src/assets
обрабатываются webpackpublic/
копируются как естьvue.config.js
:module.exports = {
chainWebpack: config => {
config.module
.rule('images')
.set('parser', {
dataUrlCondition: {
maxSize: 4 * 1024 // Уменьшаем лимит для data-URL
}
})
}
}
Рекомендуемые практики:
@
для src/
директории// vue.config.js
const path = require('path')
module.exports = {
configureWebpack: {
resolve: {
alias: {
'@images': path.resolve(__dirname, 'src/assets/images')
}
}
}
}
Проблема: Некорректные пути после сборки
Решение: Использовать require для динамических путей:
computed: {
imageUrl() {
return require(`@/assets/${this.imageName}`)
}
}
Проблема: Отсутствие хешей в именах файлов
Решение: Проверить конфигурацию генератора:
generator: {
filename: '[name].[contenthash][ext]'
}
В Vite обработка ресурсов встроена:
// vite.config.js
export default {
assetsInclude: ['**/*.glb'],
build: {
assetsInlineLimit: 4096 // 4kb лимит для встраивания
}
}
правила преобразования URL-адресов ресурсов определяют, как сборщик обрабатывает ссылки на статические файлы — копирует их, встраивает или преобразует в модули. Правильная настройка этих правил критически важна для работы с ресурсами в production-сборках.