Webpack ≥ v4 — The Complete Guide

November 08, 2018
front-end-developmentbundlerweb-developmentwebpackjavascript

Part 2: Getting Started


Step 1: Installation

Prerequisite: Make sure that you have a recent stable version of Node.js. It would be better to use The LTS (Long Term Support) version of Node.js as a starting point.
At this writing time, my current installed Node.js version is (v8.12.0).
Please, run this command to check yours: node -v

Oh, wait! We want to practice webpack not Node.js, Right?! So why do we even need to talk about Node.js?
In fact webpack is simply a Node.js application. So we need Node.js to run it.

Now that you have Node.js well installed, let’s create a directory named webpack4-demo and enter it:

mkdir webpack4-demo
cd webpack4-demo

Then set up a new npm package:

npm init -y

Note: The -y will create a webpack4-demo/package.json with default values without asking you to override them.

webpack4-demo folder structure
webpack4-demo folder structure

package.json
package.json

Create .gitignore file:

webpack4-demo folder structure
webpack4-demo folder structure

Ignore node_modules:

.gitignore file content
.gitignore file content

Now, we are going to install webpack@4.22.0 locally to the dev dependencies.
As webpack@4.22.0 is the current version in this writing time, I am going to install it without specifying the version as below:

npx yarn add webpack -D

Otherwise, you can specify the version this way:

npx yarn add webpack@4.22.0 -D

Note: Please take this package version specification while installations through this whole part.

webpack added as a dev dependency
webpack added as a dev dependency

As the webpack documentation says; if you are using webpack v4 or later you need to install webpack-cli.
webpack-cli is the tool used to run webpack on the command line.
So we are going to install webpack-cli@3.1.2 locally:

npx yarn add webpack-cli -D

webpack-cli added as a dev dependency
webpack-cli added as a dev dependency

Notes:

  • You can use any package manager that responds your needs.
  • npx is an npm package runner that comes with Node@8.2 and npm@5.2.0 or higher versions. npx here will install Yarn if it is not already installed in the machine, then will install packages using Yarn and end removing Yarn from machine (if it was installed by npx).

Step 2: Basic Setup

In this step we are going to write the source code.

Let’s create:
A directory named: webpack4-demo/src
A file named: webpack4-demo/src/index.js

webpack4-demo folder structure
webpack4-demo folder structure

This webpack4-demo/src directory will contain all source code that we are going to write and will be bundled using webpack.
Our example will use lodash library, so let’s install it locally as a dependency:

npx yarn add lodash

lodash added as dependency
lodash added as dependency

Now let’s write this code into webpack4-demo/src/index.js file:

src/index.js
src/index.js


Step 3: Bundle Generation

In this step, we are going to generate the bundle.

Let’s first create:
A directory named: webpack4-demo/dist

This webpack4-demo/dist directory will contain the bundle that will be generated by webpack, let’s denote it webpack4-demo/dist/main.js.

In order to consume the generated bundle webpack4-demo/dist/main.js and load it to the browser, I am going to create manually (later, it’s webpack who will do that automatically by configuring a pluging — Just be patient please! — ) an HTML file named webpack4-demo/dist/index.html and call webpack4-demo/dist/main.js in a script tag in it as below:

dist/index.html
dist/index.html

Do not forget please to git ignore webpack4-demo/dist/main.js, but do not do for webpack4-demo/dist/index.html as it is not automatically generated by webpack yet.

addition of dist/main.js to .gitignore
addition of dist/main.js to .gitignore

You are now good to go and generate your first bundle using webpack. To do that, you should execute this command:

npx webpack

generated bundle
generated bundle

Congratulations 😀!!

Note: Here, npx uses the binary of the webpack package that we’ve already installed in step 1.

I suppose that all goes right for you and you get the bundle named webpack4-demo/dist/main.js.
Note: The webpack4-demo/dist/main.js is a minimized and optimized output JavaScript file generated by webpack using its internal dependency graph as explained in the part 1 of this series.

Keywords worth to have their own explication:

  • Minimized in the meaning that all white-spaces will be removed and all variables,functions,classes names will be minified.
  • Optimized in many many meanings, as an example, when a script does not need to be loaded at all cases to the browser, webpack lets you configure something called Lazy loading so that it bundles that script into its own bundle and loaded it under need ending by reducing network bottleneck problem already mentioned in the part 1 of this series.

We will see lazy loading and more later in this series.

Notes:

  • Dependencies, like lodash for our case, will be bundled by webpack in addition to webpack4-demo/src/index.js.
  • DevDependencies, like webpack and webpack-cli for our case, will not be bundled by webpack, as their (DevDependencies) usage is limited to the development environment.

As you recognized, we did not configure anything to let import syntax works in webpack4-demo/src/index.js through import _ from 'lodash' and that’s because webpack support out of the box JavaScript and JSON modules importations and exportations. I take this opportunity to mention that by using webpack importation syntax we come to overcome scope collisions problem (no global scope pollution).

But wait, how does webpack know how it should bundle our project without setting neither the input file from where it should start bundling nor the output location where it should emit the generated bundle?

Well, by default, when we run webpack in a project root folder without giving it any CLI (Command Line Interface) arguments, it will generate the bundle by taking webpack4-demo/src/index.js as the entry point and webpack4-demo/dist/main.js as the output one.

Finally, open webpack4-demo/dist/index.html in your browser and you should see a button when you click on it, it alerts Hello webpack4.

demo screenshot
demo screenshot

Notes:

  • Besides import and export syntaxes, webpack support other various ones like require.
  • Old browsers are not ES2015 (EcmaScript2015) features up to date. As you probably recognized, we used in webpack4-demo/src/index.js an ES2015 feature which is the arrow function syntax (args)=>{body function code}. Our bundle will fail to execute in these old browsers. To support them, we must transpile ES2015 code or higher ES (ECMAScript) versions to ES5 (ECMAScript 2009) as it is the version the most supported by large amount of browsers including these old ones. In order to do that we should configure a transpiler such as Babel via webpack loaders (we will see that too later in this series).

Step 4: Using A Configuration File

As we saw, webpack4 does not require any configuration to bundle your project and uses default configuration in doing that. But in most cases we need to override this default configuration while projects webpack configurations are more complex than just keeping the default one. We can override this default configuration by using the webpack CLI or by creating a webpack configuration file. Using one or the other depends on the context and the complexity of the project. In most cases using a configuration file is more efficient as it is easy to maintain, to extend and to read.

So, let’s create our webpack configuration file named webpack4-demo/webpack.config.js that does the same bundling configuration as the default one does:

creation of webpack.config.js file
creation of webpack.config.js file

content of webpack.config.js file
content of webpack.config.js file

Now, let’s generate our bundle using our new configuration file as below:

npx webpack --config webpack.config.js

And if you set all things in the right place as I did, you should see your bundle file named webpack4-demo/dist/main.js successfully get generated and you can test it by opening the webpack4-demo/dist/index.html file in the browser.

Notes:

  • If your webpack configuration file is named as webpack.config.js then it will be picked by default by webpack even if you do not mention it through --config command argument.
  • You can name your webpack configuration file with any name you like, but you have to mention it through --config argument to be considered by webpack.
  • You can have more than one webpack configuration file (e.g. one for development environment, other one for production environment and so on).

Step 5: Using npm Script

As said above (when I gave a note about npx in step 1), the npx webpack --config webpack.config.js command uses the webpack dev dependency installed in our project. We can use this binary (webpack) directly using an npm script without passing through npx. By this manner, you will not have to manually write --config (if necessary) all the time but write it once instead.

So, let’s modify our package.json as below:

generate the bundle using npm script
generate the bundle using npm script

Note: Referencing installed packages using npm scripts is a best practice, because it lets all project’s contributors use the same version of packages.

Now, run the command below:

npx yarn run build

Then, you should see your bundle webpack4-demo/dist/main.js get generated and when you open webpack4-demo/dist/index.html in the browser, your application should works as before.


Step 6: Conclusion & Perspectives

In this part 2 of this series, we learned how to setup, configure and build a basic project using webpack4. We also saw, how to use default configuration(using CLI) and to use a configuration file. We ended packaging the whole command in an npm script to be easily run.

In the next part, we will see how to manage, load and bundle assets like CSS, images, fonts and more in our project.


So stay tuned, I can’t wait to see you again with me in this webpack4 stroll. It is really an amazing human & technological feeling.

Thank you for your time.
If you have any feedback, suggestions or questions please let me know!

I made it with and from scratch 2018-2021