Webpack Integration
Tags: webpack, javascript, tutorial, programming
Published: 2023-03-13 12:27:51




## Introduction

This guide will walk you through steps necessary to include and bundle MDB package in your project using Webpack.

---

## Webpack starter

**If you want to use the starter prepared by us, use [MDB CLI](https://mdbgo.com/docs/getting-started/installation/) to create a new project.**


**Note:** If you don't have MDB CLI installed yet, you can do it with NPM: `npm install -g mdb-cli`. Now log in with your MDB account, type: `mdb login`. If you don't have account yet you can create one using `mdb register` command.

```
mdb frontend init mdb5-free-standard-webpack
```

Or download the repository - [https://github.com/mdbootstrap/mdb-starter-webpack](https://github.com/mdbootstrap/mdb-starter-webpack)

**Note:** Webpack starter on Github repo uses MDB Standard free installed via NPM. If you want to use a Pro version or a different installation method go to the [import MDB](https://mdbootstrap.com/docs/standard/getting-started/webpack-integration/#section-import-mdb) section and check if it requires configuration changes. For example, changing the import paths of MDB files.

**Basic features**

- Bundling via [Webpack](https://github.com/webpack/webpack) v5.74.0
- ES6+ Support via [babel-cli](https://github.com/babel/babel) v7.18.10
- SASS Support via [sass-loader](https://github.com/jtangelder/sass-loader) v13.0.2
- Linting via[ eslint-webpack-plugin](https://github.com/webpack-contrib/eslint-webpack-plugin) v3.2.0
- Unit Testing via [Jest](https://github.com/facebook/jest) v29.0.1
- Code Formatting via [Prettier](https://github.com/prettier/prettier) v2.7.1
- Unused CSS removed via [PurgeCSS](https://github.com/FullHuman/purgecss) v5.0.0
- Deploy via [MDB CLI](https://mdbgo.com/) latest version

**Dev Server**

```
npm install
```

If you decided to use a prepared starter, you can skip this tutorial. The starter is fully configured and ready to use.

---

## Setup

Before you start make sure you have Node.js installed.

`Create a project folder and setup npm`

We’ll create the `my-project` folder and initialize npm with the `-y` argument to avoid it asking us all the interactive questions.

```
mkdir my-project && cd my-project
npm init -y
```

**Install Webpack**

Next we need to install our Webpack development dependencies: `webpack` for the core of Webpack, `webpack-cli` so we can run Webpack commands from the terminal, and` webpack-dev-server` so we can run a local development server. We use `--save-dev` to signal that these dependencies are only for development use and not for production.

```
npm i --save-dev webpack webpack-cli webpack-dev-server
```
Install additional dependencies

In addition to Webpack and Bootstrap, we need a few more dependencies to properly import and bundle MDB's CSS and JS with Webpack. These include Sass, some loaders, and Autoprefixer.

```
npm i --save-dev autoprefixer css-loader postcss-loader sass sass-loader style-loader
```

Now that we have all the necessary dependencies installed, we can get to work creating the project files and importing MDB.

---

## Project Structure

We’ve already created the `my-project` folder and initialized npm. Now we’ll also create our `src` and `dist` folders to round out the project structure. Run the following from `my-project`, or manually create the folder and file structure shown below.

```
mkdir {dist,src,src/js,src/scss,src/assets,src/assets/mdb}
touch dist/index.html src/js/main.js src/scss/styles.scss webpack.config.js
```

When you’re done, your complete project should look like this:

```
my-project/
├── dist/
│   └── index.html
├── src/
│   ├── assets/
│   │   └── mdb/
│   ├── js/
│   │   └── main.js
│   └── scss/
│       └── styles.scss
├── package-lock.json
├── package.json
└── webpack.config.js
```

At this point, everything is in the right place, but Webpack won’t work because we haven’t filled in our `webpack.config.js` yet.

## Configure Webpack

With dependencies installed and our project folder ready for us to start coding, we can now configure Webpack and run our project locally.

**Open `webpack.config.js`in your editor**

Since it’s blank, we’ll need to add some boilerplate config to it so we can start our server. This part of the config tells Webpack were to look for our project’s JavaScript, where to output the compiled code to (`dist`), and how the development server should behave (pulling from the dist folder with hot reload).

```
const path = require('path')
module.exports = {
  entry: './src/js/main.js',
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist')
  },
  devServer: {
    static: path.resolve(__dirname, 'dist'),
    port: 8080,
    hot: true
  }
}
```

**Next we fill in our** `dist/index.html`
This is the HTML page Webpack will load in the browser to utilize the bundled CSS and JS we’ll add to it in later steps. Before we can do that, we have to give it something to render and include the output JS from the previous step.

```
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>MDB w/ Webpack</title>
  </head>
  <body>
    <div class="container py-4 px-3 mx-auto">
      <h1>Hello, MDB and Webpack!</h1>
      <button class="btn btn-primary">Primary button</button>
    </div>
    <script src="./main.js"></script>
  </body>
</html>
```

We’re including a little bit of styling here with the `div class="container"` and `<button>` so that we see when CSS from MDB package is loaded by Webpack.

**Now we need an npm script to run Webpack**

Open `package.json` and add the `start` script shown below (you should already have the test script). We’ll use this script to start our local Webpack dev server.

```
{
  // ...
  "scripts": {
    "start": "webpack serve --mode development",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  // ...
}
```

Importing MDB into Webpack requires the loaders we installed in the first section. We’ve installed them with npm, but now Webpack needs to be configured to use them.

**Set up the loaders in** `webpack.config.js`

Your configuration file is now complete and should match the snippet below. The only new part here is the module section.

```
const path = require('path')

module.exports = {
  entry: './src/js/main.js',
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist')
  },
  devServer: {
    static: path.resolve(__dirname, 'dist'),
    port: 8080,
    hot: true
  },
  module: {
    rules: [
      {
        test: /\.(scss)$/,
        use: [
          {
            loader: 'style-loader'
          },
          {
            loader: 'css-loader'
          },
          {
            loader: 'postcss-loader',
            options: {
              postcssOptions: {
                plugins: () => [
                  require('autoprefixer')
                ]
              }
            }
          },
          {
            loader: 'sass-loader'
          }
        ]
      }
    ]
  }
}
```

Here’s a recap of why we need all these loaders. `style-loader` injects the CSS into a `<style>` element in the `<head>` of the HTML page, `css-loader` helps with using `@import` and `url()`, `postcss-loader` is required for Autoprefixer, and `sass-loader` allows us to use Sass.

**And finally, we can start Webpack**

From the `my-project` folder in your terminal, run that newly added npm script:

`npm start`

In the next section to this guide, we’ll import all of MDB's CSS and JavaScript.

## Import MDB

Here you need to decide which method of import you want to choose
CDN import is available only for free version of MDB.

To install the MDB UI KIT in your project easily type the following command in the terminal. If you have PRO package remember to swap the access token before starting the installation.

**Token generation**
If you don't have access token yet please follow the [tutorial](https://youtu.be/d6JZQTgOe_k?t=68).

**Install MDB via NPM**

```
npm i mdb-ui-kit
```

**Importing JS modules**

```
import '../scss/styles.scss';
import * as mdb from 'mdb-ui-kit';
window.mdb = mdb;
```

**Importing SCSS file**

```
@import 'mdb-ui-kit/mdb-ui-kit/src/scss/mdb.free.scss';
```

**Now you're done**

With MDB's source Sass and JS fully loaded, your local development server should work and you should see MDB styles applied to button in the example.

---

## Create build

The starter that we have prepared for you is fully configured and we have added the build command to it. Just run the `npm run build` command. You will find the bundled files in the `dist` folder.

If you have decided to configure the project yourself, you must add the build command in the `package.json` file.

```
"scripts": {
  ...
  "build": "webpack build --mode production",
  ...
},
```

After that you can use `npm run build` command. You will find the bundled files in the folder you set as the output directory. By default, this is the `dist` folder.