initialize N project with standard defaults
npm init -y
initialize N project step by step
npm init
install W for a N server
npm i -D webpack webpack-cli _webpack-dev-server
run W in specific mode
webpack –mode=«mode»
» mode: none, developmen, production
name of standard W config file
webpack.config.js
minimum W config
» webpack.config.js:
module.exports = {
entry: '«entry filename/path»',
mode: '«mode»',
output: {
filename: «output filename»,
_path: «absolute output path»,
_publicPath: «relative public path»
}
}» !module.exports
» mode: development, production, none
» path: path.resolve(__dirname, ‘«folder»’)
» dev server: needs both output AND public path
use current work directory path in N
import path from ‘path’
path.resolve(__dirname, ‘«relative path»’)
set path for public/asset and output bundle folder in W config
» output: {
publicPath: «path»
}
» path: relative to server root: ‘/«folder»/’
» path: relative to index.html: ‘«folder»/’, ‘../«folder»/’
» from index.html to output script
set serving root of development server in W config
» devServer: {
contentBase: «server root»
}
run W development server
webpack-dev-server
setup loader in W
» npm i -D «_package» «package loader»
» module > rules: [{
test: «test regex»,
use: ['«loader2»', '«loader1»']
}]» right loader is first
show W dev server error in browser window
» devServer: {
overlay: true
}
setup CSS in W
» npm i -D css-loader style-loader
» module > rules: [{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}]setup HTML in W
» npm i -D html-loader extract-loader file-loader
» module > rules: [{
test: /\.html$/,
use: [
{
loader: 'file-loader',
options: {
name: '[name].html'
}
}, // resolves import/require
'extract-loader', // resolves urls
'html-loader' // loads raw html
]
}]setup image load in W
» module > rules: [{
test: /\.(jpg|jpeg|png|gif)$/,
use: {
loader: 'file-loader',
options: {
name: '«images folder»/[name].[ext]'
}
}
}]» configured html-loader required
name of Babel configuration file
.babelrc
» is JSON file
setup Babel in W
» npm i -D @babel/core @babel/preset-env babel-loader
» module > rules: [{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
},
exclude: /node_modules/
}]setup minimal Express server in N
import express from ‘express’
const app = express()
app.listen(«port», () => {
console.log(Server is listening on port {«port»})
})
setup SASS in W
» npm i -D sass(/node-sass) sass-loader
» module > rules: [{
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader']
}]setup TypeScript in W
» npm i -D typescript ts-loader
» entry: './src/index.ts'
» resolve > extensions: [ _'.tsx', '.ts', '.js' ]
» module > rules: [{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/
}]setup plugin in W
» npm i -D «plugin»
» const «plugin» = require('«plugin»');
» plugins: [
new «plugin»()
]setup code splitting in W
» optimization > splitChunks: {
chunks: ‘all’,
_minSize: 0
}
» reduces duplicate code and libraries
setup webpack-dev-server with hot reloading in W
» npm i -D webpack-dev-server
» const webpack = require('webpack')
» devServer: {
hot: true
}
» plugins: [
new webpack.HotModuleReplacementPlugin()
]setup source mapping to original code for webpack-dev-server
» devtool: ‘(inline-)source-map’
» inline-: works in production