File loader webpack не работает

Изображения не отображаются в производственной сборке, только в dev (webpack / sass-loader)

При запуске моего приложения на сервере webpack, все мои файлы изображений работают как в виде тегов img в моем index.html, так и background-image: url () ..

Запустив мой проект в рабочей сборке, я получаю ошибки ссылок на файлы, которые не могут быть найдены.

Я добавил плагин copy webpack, так как думал, что он переместит все изображения из папки src / img в папку img внутри dist.

Должен ли я использовать опцию contentBase для webpack-dev-server? Или copy-webpack-plugin не получает правильную ссылку? Супер запутался

Внутри приземления. Я использовал

То же самое в других файлах, таких как бренды .scss

Все это работало нормально, и я думаю, что я перепутал себя с тем, как на изображения ссылаются с помощью webpack / sass loader, и не могу понять, как заставить пути к изображениям работать как для dev / production, я могу только кажется, получить по одному за раз.

3 ответа

Я думаю, что вы используете другую структуру папок на производственной, чем на локальной, то есть на локальной, это просто http : // localhost: PORT / app , но в prod он должен быть похож на http: // produrl / Some_Folder / app

Теперь перейдем к актуальной проблеме — это ваш CSS загрузчик.

По умолчанию css-loader имеет url = true , в результате чего все URL-адреса сопоставляются относительно корня. Следовательно, это работает для вас —

Просто установите url = false , и вы сможете указать относительный URL-адрес, и он будет корректно загружаться для всех объектов.

Хотя принятый ответ может работать в вашем конкретном сценарии, я думаю, что есть лучшее решение, которое не включает отключение css-loader url() обработки и будет работать лучше в большинстве ситуаций.

Тильда

Когда вы используете

для импорта чего-либо в css, css-loader будет искать этот файл внутри node_modules . Ваши изображения находятся в папке src / img , поэтому вам не требуется тильда

для импорта изображений.

url() проблема

В вашем конкретном примере вы импортируете некоторые URL-адреса внутри src / scss / layout / landing.scss и src / scss / layout / brands.scss , но я предполагаю, что ваша основная точка входа scss находится в папке src / scss .

Примечание: для «основная точка входа scss» я имею в виду файл scss, который вы импортируете внутри своей точки входа javascript src / js / index.js

Итак, в вашем примере каждое изображение, импортированное в файл scss, который находится не в папке src / scss , выдаст ошибку.

Чтобы решить эту проблему, используйте resol-url-loader, который разрешает относительные пути в url () заявления на основе исходного исходного файла.

CopyWebpackPlugin не является обязательным

В зависимости от вашей конфигурации вам не нужно CopyWebpackPlugin , потому что ваши изображения уже обработаны url-loader .

Примечание. url-loader не выводит ваши изображения, а встроенные в них, изображения выводятся загрузчик файлов, когда размер файла превышает ограничение (в байтах).

Читайте также:  Кайрон не работает парктроник

file-loader выведет ваши изображения в папку dist / img , потому что вы установили name: ‘img/[name].[ext]’ и output.path: path.resolve(__dirname, ‘dist’) .

Эй, я думаю, что ваша проблема только в том, как вы ссылаетесь на изображение в вашем scss.

В зависимости от структуры вашей папки это должно быть:

Источник

Настройка Webpack 5 с нуля

Узнайте, как использовать вебпак для сборки JavaScript, изображений, шрифтов и стилей, а также как запускать сервер для разработки

Если вы раньше использовали вебпак 4, вот некоторые отличия от 5 версии:

  • команда «webpack-dev-server» теперь выглядит как «webpack-serve»
  • отдельная установка file-loader, raw-loader и url-loader больше не требуется, вы можете использовать встроенные загрузчики ресурсов (asset modules)
  • полифилы для Node.js больше не поддерживаются, поэтому если, например, вы получили ошибку для stream, необходимо добавить пакет «stream-browserify» в качестве зависимости и < stream: «stream-browserify» >в качестве алиаса в настройки вебпака

Что такое вебпак?

По большей части, сайты больше не пишутся на чистом HTML с небольшим количеством JavaScript — часто они создаются только с помощью JavaScript. Поэтому возникает необходимость в сборке, минификации и транспиляции кода. Вот где вебпак приходит на помощь.

Вебпак — это сборщик модулей. Он служит для упаковки кода для использования браузером. Он позволяет использовать последние возможности JavaScript с помощью Babel или использовать TypeScript и компилировать его в кроссбраузерный минифицированный код. Он также позволяет импортировать статические ресурсы в JavaScript.

Для разработчиков вебпак также предоставляет сервер для разработки, который умеет обновлять модули и стили на лету при сохранении файла. Инструменты командной строки, такие как «vue create» и «react-create-app» используют вебпак за сценой, но вы легко можете создать собственную настройку вебпака для указанных фреймворков.

Вебпак также умеет делать много других вещей, но данная статья посвящена основам его настройки и использования.

Установка

Создаем директорию проекта и инициализируем его:

Устанавливаем webpack и webpack-cli в качестве зависимостей для разработки:

  • webpack — сборщик модулей и ресурсов
  • webpack-cli — интерфейс командной строки для вебпака

Создаем директорию «src» для хранения файлов приложения. Я начну с создания простого файла «index.js»:

Отлично, у нас имеется Node.js-проект с установленными основными пакетами и файл «index.js». Займемся настройкой вебпака.

Базовая настройка

Приступим к настройке сборщика. Создаем файл «webpack.config.js» в корневой директории проекта.

Точка входа

Прежде всего, необходимо определить точку входа приложения, т.е. то, какие файлы вебпак будет компилировать. В приведенном примере мы определяем точку входа как «src/index.js»:

Точка выхода

Точка выхода — это директория, в которую помещаются скомпилированные вебпаком файлы. Установим точку выхода как «dist». Префикс «[name]» соответствует названию файла в src:

Минимальная настройка для сборки проекта готова. Добавляем скрипт «build» в файл «package.json», запускающий команду «webpack»:

В директории «dist» создается файл «index.bundle.js». Файл не изменился, но мы успешно осуществили сборку проекта.

Плагины

Интерфейс плагинов делает вебпак очень гибким. Плагины используются как самим вебпаком, так и сторонними расширениями. Некоторые плагины используются почти в каждом проекте.

Плагин создания HTML на основе шаблона

У нас есть готовая сборка, но она бесполезна без разметки, которая загрузит сборку в качестве скрипта. Поскольку мы хотим, чтобы такой HTML-файл генерировался автоматически, используем html-webpack-plugin.

  • html-webpack-plugin — создает HTML-файл на основе шаблона
Читайте также:  Как настроить wifi mikrotik rb951ui 2hnd

Устанавливаем плагин:

Создаем файл «template.html» в директории «src». Мы можем добавить в шаблон переменные и другую информацию. Добавим переменную «title», в остальном шаблон будет выглядеть как обычный HTML-файл с контейнером с идентификатором «root»:

Добавляем в настройки вебпака свойство «plugins», где определяем плагин, название выходного файла (index.html) и шаблон:

Запускаем сборку. Директория «dist» теперь содержит файл «index.html» с подключенным в нем скриптом. Круто! Если вы откроете этот файл в браузере, то увидите сообщение «Как интересно!» в консоли.

Добавим немного контента в DOM. Изменим содержимое файла «index.js» и перезапустим сборку.

Перейдите в директорию «dist» и запустите сервер (для этого необходимо глобально установить http-server: yarn global add http-server или npm i -g http-server).

В открывшейся вкладке браузера вы должны увидеть заголовок, гласящий «Как интересно!». Также обратите внимание на уменьшение размера файла.

Очистка

Установим clean-webpack-plugin, очищающий директорию «dist» при каждой сборке проекта. Это позволяет автоматически удалять старые файлы, ставшие ненужными.

Модули и загрузчики

Вебпак использует загрузчики для разбора файлов, загружаемых с помощью модулей. Это могут быть JavaScript-файлы, статические ресурсы, такие как изображения или стили и компиляторы, такие как TypeScript и Babel. Вебпак 5 имеет несколько встроенных загрузчиков ресурсов.

В нашем проекте имеется HTML-файл, который загружает некоторый скрипт, но больше он ничего не делает. Давайте подумаем, чего мы хотим от сборщика?

  • Компиляция новейших возможностей JavaScript в код, совместимый со всеми или большинством браузеров
  • Импорт стилей и преобразование SCSS в CSS
  • Импорт изображений и шрифтов
  • Настройка React или Vue (опционально)

Для начала настроим Babel для компиляции JavaScript.

Babel (JavaScript)

Babel — это инструмент, позволящий использовать будущий JavaScript сегодня.

Мы собираемся определить правило, согласно которому все файлы с расширением «js» в проекте (кроме файлов, содержащихся в директории «node_modules») будут транспилироваться с помощью babel-loader. Для работы Babel требуется несколько зависимостей:

  • babel-loader — транспиляция файлов с помощью Babel и вебпака
  • @babel/core — транспиляция ES2015+ в обратно совместимый JavaScript
  • @babel/preset-env — полезные стандартные настройки Babel
  • @babel/plugin-proposal-class-properties — пример кастомной конфигурации Babel (установка свойств экземпляров в теле класса, а не в его конструкторе)

Если вы настраиваете TypeScript-проект, то вместо babel-loader следует использовать typescript-loader для всех JavaScript-файлов, нуждающихся в транспиляции. Вы проверяете файлы с расширением «ts» и используете ts-loader.

Итак, Babel настроен, но плагин еще нет. Вы можете убедиться в этом, добавив следующий код в начало index.js:

Для того, чтобы это исправить, создаем файл «.babelrc» в корне проекта:

Запускаем сборку с помощью yarn build. Теперь все работает.

Изображения

Мы хотим импортировать изображения в JavaScript-файл, но JavaScript не умеет этого делать. Чтобы убедиться в этом, создаем директорию «src/images», помещаем туда изображение и пытаемся импортировать его в файле «index.js»:

При запуске сборки будет выброшено исключение:

Как отмечалось ранее, вебпак обладает некоторыми встроенными загрузчиками для работы со статическими файлами. Для изображений следует использовать тип «asset/resource». Обратите внимание, что речь идет именно о типе (type), а не о загрузчике (loader):

Читайте также:  Как починить пятку кроссовок изнутри

В директории «dist» появляется новый файл.

Шрифты и другие встраиваемые данные

Вебпак также имеет встроенный модуль для обработки некоторых встраеваемых данных, таких как шрифты и SVG. Для этого достаточно указать тип «asset/inline»:

Стили

Использование загрузчиков стилей является необходимым условием использования строк наподобие «import ‘file.css’» в скрипте.

Многие люди используют CSS-in-JS, стилизованные компоненты (styled components) и другие инструменты, позволяющие использовать стили в JavaScript.

Порой мы можем ограничиться загрузкой одного CSS-файла. Но, возможно, вы хотите использовать PostCSS, позволяющий использовать последние возможности CSS в браузере. Или вы хотите использовать препроцессор Sass.

Я хочу использовать все три — писать код на Sass, обрабатывать его с помощью PostCSS и компилировать в CSS.

  • sass-loader — загружает SCSS и компилирует его в CSS
  • node-sass — Node Sass
  • postcss-loader — обработка CSS с помощью PostCSS
  • postcss-preset-env — полезные настройки PostCSS
  • css-loader — загрузка стилей
  • style-loader — применение стилей к элементам DOM

Как и для Babel, для PostCSS требуется отдельный файл настроек:

Для проверки работоспособности названных инструментов создадим файл «src/styles/main.scss», содержащий переменные Sass и пример использования PostCSS (lch):

Импортируем этот файл в index.js и добавляем 4 загрузчика. Загрузчики используются вебпаком справа налево, так что последним должен быть sass-loader, затем PostCSS, затем CSS и, наконец, style-loader, который применяет скомпилированные стили к элементам DOM:

После сборки вы заметите, что Sass и PostCSS применились к DOM.

Обратите внимание, что мы установили настройки для режима разработки. Для продакшна следует использовать MiniCssExtractPlugin вместо style-loader, который экспортирует минифицированный CSS.

Разработка

Каждый раз набирать команду yarn build (npm run build) при необходимости повторной сборки проекта может быть утомительным. Чем больше проект, тем дольше он будет собираться. Поэтому необходимо иметь два файла настроек вебпака:

  • Настройки для продакшна, включающие минификацию, оптимизацию и удаление всех карт ресурсов (source maps)
  • Настройки для разработки, включая запуск сервера, обновление при каждом изменении и карты ресурсов

Вместо создания директории «dist», режим разработки может предполагать хранение нужной информации в памяти.

Для этого необходимо установить webpack-dev-server.

В целях демонстрации принципов использования сервера для разработки мы можем определить соответствующие настройки в файле «webpack.config.js». На практике лучше иметь два файла настроек: один с mode: production и другой с mode: development. В специально подготовленной для вас webpack 5 boilerplate я использую webpack-merge для получения базовых настроек в виде одного файла, а специальные требования содержатся в файлах «webpack.prod.js» и «webpack.dev.js».

Мы добавили mode: development и свойство «devServer». В данном свойстве содержится несколько стандартных настроек — номер порта (8080), автоматическое открытие браузера, использование hot-module-replacement, для которого нужен webpack.HotModuleReplacement(). Это позволит модулям обновляться без полной перезагрузки страницы, т.е. если изменятся отдельные стили, только они будут обновлены, вам не потребуется перезагружать JavaScript, что очень сильно ускоряет разработку.

Для запуска сервера используется команда «webpack serve»:

После запуска этой команды браузер откроется по адресу localhost:8080. Теперь вы можете изменять Sass и JavaScript и они будут обновляться на лету.

Источник

Оцените статью