Building Static Sites with Webpack
August 29, 2016
Webpack is module bundler which takes modules with dependencies and generates static assets representing those modules. Webpack replaces gulp/grunt as a task runner. It also enables the ability to use npm packages instead of managing separate js/css files.
Getting Started
In the following folder structure the source code of the site will be placed in the app folder.
.
├── LICENSE
├── README.md
├── app
│ ├── favicon.ico
│ ├── img
│ │
│ ├── index.html
│ ├── js
│ │ ├── imports.js
│ │ └── index.js
│ ├── manifest.json
│ ├── manifest.webapp
│ ├── robots.txt
│ └── scss
│ └── style.scss
├── package.json
└── webpack.config.js
The webpack.config.js file looks like following.
module.exports = {
context: path.resolve("./app"),
entry: "./js/index.js",
output: {
path: path.resolve("./dist/"),
filename: "js/bundle.js",
publicPath: "/",
},
module: {
devtool: "source-map",
loaders: [
{
test: /\\.js$/,
loader: "babel",
exclude: /node\_modules/,
query: {
presets: ["es2015"],
},
},
{
test: /\\.html$/,
loader: "html",
},
{
test: /\\.scss$/,
loaders: ["style", "css", "sass"],
},
{
test: /\\.css$/,
loaders: ["style", "css"],
},
{
test: /\\.woff(2)?(\\?v=\[0-9\]\\.\[0-9\]\\.\[0-9\])?$/,
loader: "url-loader?limit=10000&mimetype=application/font-woff&name=fonts/[name].[ext]",
},
{
test: /\\.(ttf|eot|svg)(\\?v=\[0-9\]\\.\[0-9\]\\.\[0-9\])?$/,
loader: "file?name=fonts/[name].[ext]",
},
{
test: /\\.(jpe?g|png|gif)$/,
loader: "file?name=img/[name].[ext]",
},
],
},
plugins: [
new CleanWebpackPlugin(["dist"]),
new HtmlWebpackPlugin({
template: "./index.html",
}),
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
}),
new BrowserSyncPlugin({
server: {
baseDir: ["dist"],
},
port: 3000,
host: "localhost",
}),
new CopyWebpackPlugin([
{
from: "./manifest.json",
},
{
from: "./manifest.webapp",
},
{
from: "./robots.txt",
},
{
from: "./favicon.ico",
},
{
from: "./img/**/*",
to: "./",
},
]),
],
};
entry — the top level file which is the entry point for the application
output
- path - is the location and name of the directory where the final build folder will be places
- filename - the name file. You can also specify a folder to place the file in.
- publicPath — Route to expose for web server to display public paths
module
- devtool - Define type of sourcemaps
- loaders - All your loaders will be defined here. We are using babel-loader html-loader, style-loader, css-loader, sass-loader, url-loader and file-loader
plugins
- clean-webpack-plugin — remove dist directory before each build
- html-webpack-plugin — create html file for dist with scripts injected based on a template provided
- provide-plugin — automatically load modules based on the key and value
- browser-sync-webpack-plugin — Live reloading using browsersync
- copy-webpack-plugin — copy files and directories to dist folder
After having the webpack file setup you can require dependencies. For example
import "bootstrap/dist/js/bootstrap.js";
import "bootstrap/dist/css/bootstrap.css";
import "../scss/style.scss";
import "font-awesome/css/font-awesome.css";
To start browsersync server run
webpack --watch
which will open the site in default browser which live reloading enabled. It also provides the IP of the machine which can also be using to .
To finally package everything and get it ready to deploy run
webpack -p
which will create a dist folder which can be used to place on web server.
I have created a boilerplate which uses webpack, ES6, bootstrap, fontawesome and browsersync. It can be found on Github. Please check it out and leave your feedback.