В этом руководстве мы создадим с нуля мощный начальный шаблон Webpack с добавленной поддержкой SCSS и интегрируем популярные CSS-фреймворки, Bootstrap и Tailwind CSS. Шаблон послужит прочной основой для проектов веб-разработки, объединения JavaScript, обработки SCSS и использования возможностей Bootstrap и Tailwind CSS для красивых пользовательских интерфейсов. К концу этого руководства у вас будет полнофункциональный начальный шаблон Webpack с поддержкой SCSS, Bootstrap и Tailwind CSS, готовый с легкостью запустить ваши веб-проекты.

Предпосылки

Прежде чем мы начнем, убедитесь, что на вашем компьютере установлено следующее:

  • Node.js и npm (или Yarn): Вы можете скачать Node.js здесь.

Шаг 1: Настройка проекта

Давайте создадим новый каталог проекта и инициализируем новый проект Node.js.

mkdir webpack-starter-template
cd webpack-starter-template
npm init -y

Команда npm init -y инициализирует новый проект Node.js с настройками по умолчанию.

Шаг 2. Установите Webpack и необходимые зависимости

Далее давайте установим Webpack и другие необходимые для разработки зависимости для нашего проекта.

npm install webpack webpack-cli webpack-dev-server html-webpack-plugin @babel/core @babel/preset-env babel-loader css-loader postcss-loader autoprefixer mini-css-extract-plugin sass-loader sass bootstrap tailwindcss normalize.css --save-dev

Эта команда устанавливает последние версии Webpack, интерфейс командной строки Webpack, сервер разработки, основные загрузчики (CSS, SCSS и Babel), плагины и необходимые фреймворки CSS — Bootstrap и Tailwind CSS, а также normalize.css.

Шаг 3: Создайте конфигурацию Webpack

Теперь давайте создадим файл конфигурации Webpack для управления процессом сборки нашего проекта. В корне вашего проекта создайте файл с именем webpack.config.js и добавьте следующую конфигурацию:

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
  mode: "development", // Set the mode to "development" for faster builds and source maps. Change to "production" for optimized builds.
  entry: {
    bundle: path.resolve(__dirname, "src/index.js"), // The entry point for our application.
  },
  output: {
    path: path.resolve(__dirname, "dist"), // Output directory for the bundled files.
    filename: "js/[name][contenthash].js", // Name of the bundled JavaScript file.
    clean: true, // Clean the "dist" directory before each build.
    assetModuleFilename: "assets/[name][ext]", // Asset filenames for images and other files.
  },
  devtool: "source-map", // Generate source maps for easier debugging.
  devServer: {
    static: {
      directory: path.join(__dirname, "dist"), // Serve static files from the "dist" directory.
    },
    compress: true, // Compress assets to speed up server responses.
    port: 3000, // Port number for the development server.
  },
  module: {
    rules: [
      {
        test: /\.scss$/, // Process .scss files with "sass-loader", "css-loader", "postcss-loader", and "MiniCssExtractPlugin".
        use: [
          MiniCssExtractPlugin.loader, // Extract CSS into separate files for production build.
          "css-loader", // Translates CSS into CommonJS.
          "postcss-loader", // PostCSS is used for autoprefixing CSS for better cross-browser support.
          "sass-loader", // Compiles SCSS to CSS.
        ],
      },
      {
        test: /\.js$/, // Process .js files with "babel-loader" excluding "node_modules".
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
          options: {
            presets: ["@babel/preset-env"], // Use @babel/preset-env to transpile modern JavaScript to older versions for wider browser compatibility.
          },
        },
      },
      {
        test: /\.(png|svg|jpg|jpeg|gif)$/i, // Process image files with "asset/resource" type.
        type: "asset/resource",
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: "Webpack Starter Template", // The title of the generated HTML file.
      filename: "index.html", // The name of the generated HTML file.
      template: "src/template.html", // Use the "template.html" file as the base for the generated HTML.
    }),
    new MiniCssExtractPlugin({
      filename: "css/[name][contenthash].css", // CSS files will be saved in the "css" folder with hashed filenames for better caching.
    }),
    new CleanWebpackPlugin(), // Clean the "dist" directory before each build to remove old files.
  ],
};

Эта конфигурация настраивает Webpack для связывания JavaScript и обработки файлов SCSS, создания папки dist для вывода и использования HtmlWebpackPlugin для создания HTML-файла для нашего проекта. Он также включает MiniCssExtractPlugin для извлечения SCSS в отдельный файл CSS и CleanWebpackPlugin для очистки папки dist перед каждой сборкой.

Шаг 4: Создайте HTML-файл шаблона

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

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Webpack Starter Template</title>
</head>

<body>
  <div id="app"></div>
</body>

</html>

Этот файл HTML обеспечивает базовую структуру для нашего проекта с элементом div, имеющим идентификатор app, куда можно внедрить наш код JavaScript.

Шаг 5: Создайте входной файл JavaScript

Далее давайте создадим входной файл JavaScript, в котором будет запускаться код нашего приложения. В папке src создайте файл с именем index.js и добавьте следующее содержимое:

import 'bootstrap';
import 'normalize.css';
import './assets/scss/main.scss'

console.log('Webpack Starter Template');

Мы импортировали styles.scss, который будет нашим основным файлом SCSS, содержащим все глобальные стили для нашего проекта.

Шаг 6: Создайте стили SCSS и CSS

Теперь давайте создадим наши стили SCSS и CSS. В корне вашего проекта создайте папку с именем src и внутри нее создайте папку с именем assets/scss. В папке scss создайте файл с именем main.scss и добавьте следующее содержимое:

@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';

/* Add your styles here */

body {
  @apply bg-gradient-to-b from-blue-400 to-indigo-600 min-h-screen flex items-center justify-center;
}

h1 {
  @apply text-3xl font-semibold mb-6;
}

p {
  @apply text-gray-600 mb-6;
}

a {
  @apply bg-indigo-600 hover:bg-indigo-700 text-white px-4 py-2 rounded-full;
}

Шаг 7: Добавьте скрипты npm

Чтобы упростить рабочий процесс разработки, давайте добавим несколько сценариев npm для запуска нашего проекта. Откройте файл package.json и добавьте следующие скрипты:

"scripts": {
  "dev": "webpack serve --open --hot --mode development",
  "build": "webpack --mode production"
}

Мы добавили два скрипта: dev и build. Скрипт dev запустит сервер разработки с горячей заменой модулей для более быстрой разработки. Скрипт build создаст производственную сборку нашего проекта.

Шаг 8. Проверьте установку

Все готово! Давайте протестируем наш стартовый шаблон Webpack. В терминале выполните следующую команду, чтобы запустить сервер разработки:

npm run dev

Это запустит сервер разработки. Откройте браузер и перейдите на http://localhost:3000/.

Полный проект вы можете найти на github.

Удачного кодирования! 🎉