webpack 6 - garevna/js-course GitHub Wiki

💼 Упражнение 6

✅ file-loader
✅ url-loader

📂 images

Создадим папку 📂 images в корневой папке нашего проекта
и поместим туда несколько файлов изображений:

📂 js

Добавим в файл 📝 script.js
код, который будет добавлять на страницу два элемента span
с классами git-bush и git

Далее внесем соответствующие изменения в файл
📝 main.css ( :open_file_folder css )

( добавим соответствующие классы )

📝 script.js

import promise from './promise.js'
import css from '../css/main.css'

promise.then ( response =>
    document.querySelector ( '.sampleClass' )
        .innerText += response )

document.body.appendChild (
    document.createElement ( 'span' )
).className = 'git-bush'

document.body.appendChild (
    document.createElement ( 'span' )
).className = 'git'

📝 main.css

body {
    position: fixed;
    top: 0;
    left:0;
    bottom:0;
    right:0;
    background-image: url(../images/columns.gif);
    background-repeat: no-repeat;
    background-size: cover;
    background-position: top center;
    font-family: monospace, Arial;
    font-size: 16px;
    color: #abc;
}
.sampleClass {
    font-size: 25px;
    font-weight: bold;
}
.git-bush, .git {
    display: inline-block;
    width: 50px;
    height: 50px;
    background-repeat: no-repeat;
    background-size: contain;
    background-position: center center;
}

.git-bush {
    background-image: url(../images/git-bush.png);
}
.git {
    background-image: url(../images/git.png);
}

🔧 file-loader

Установим загрузчик file-loader

npm install --save-dev file-loader

и внесем необходимые изменения в файл конфигурации

📝 webpack.config.js
const path = require ( 'path' )

module.exports = {
    entry: { main: './js/script.js' },
    output: {
        path: path.resolve ( __dirname, 'build' ),
        filename: 'index.js'
    },
    module: {
        rules: [
            {
                test: /\.(png|svg|jp?g|gif)$/,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            name: 'images/[name].[ext]'
                        }
                    }
                  ]
            },
            {
                test: /\.css$/,
                exclude: /node_modules/,
                use: [
                    'style-loader',
                    'css-loader'
                ]
            },

        ]
    }
}

🔨 Сборка

Обратите внимание, что после сборки приложения
все файлы изображений, ссылки на которые были в файле 📝 main.css,
оказались в папке 📂 images,
которая была создана в папке 📂 build


🎓 url-loader

webpack резолвит любые выражения url(), которые встретит в css-файлах, а также ссылки на изображения из скрипта

webpack может встраивать ресурсы с помощью загрузчика url-loader

url-loader преобразует изображение в код base64 URI

и встраивает в код JavaScript

Это позволяет сократить количество запросов к серверу, однако приводит к увеличению размеров результирующего файла сборки

url-loader имеет опциею limit, которая позволяет управлять процессом встраивания файлов изображений в зависимости от их размеров

Свойство limit url-loader - это максимально допустимый для встраивания размер файла (в байтах)

Таким образом, небольшие по размеру файлы изображений можно встроить в файл сборки, а для больших создавать копии

⚠️ При использовании опции limit необходимо установить как url-loader, так и file-loader

В случае использования опции limit url-loader передает возможные дополнительные параметры для file-loader

☕ встраивание файлов .jpg и .png размером менее 25 КБ
{
    test: /\.(jpg|png)$/,
    use: {
        loader: "url-loader",
        options: {
            limit: 25000,
        },
    },
},

⚠️ При передаче параметров загрузчику его не добавляют в свойство use в виде строки

потому что теперь это будет объект с двумя свойствами: имя загрузчика и параметры

Если файл изображения большой, вместо url-loader будет использоваться file-loader, который просто создаст копию файла

Итак, установим url-loader в папке проекта и внесем изменения в файл конфигурации webpack:

☕ webpack.config.js
const path = require ( 'path' )

module.exports = {
    entry: { main: './js/script.js' },
    output: {
        path: path.resolve ( __dirname, 'build' ),
        filename: 'index.js'
    },
    module: {
        rules: [
            {
                test: /\.(png|svg|jp?g|gif)$/,
                use: {
                    loader: "url-loader",
                    options: {
                        limit: 25000,
                        name: 'images/[name].[ext]'
                    },
                }
            },
            {
                test: /\.css$/,
                exclude: /node_modules/,
                use: [
                    'style-loader',
                    'css-loader'
                ]
            }
        ]
    }
}

Прежде, чем запускать сборку, очистим папку build/images, чтобы убедиться, что теперь в нее попадут только большие файлы, а маленькие будут встроены в файл сборки

После сборки посмотрим в консоли, как подключены маленькие файлы изображений:

Файлы были конвертированы в строку base64 и встроены в сборку


⚠️ **GitHub.com Fallback** ⚠️