Working around webpack 4, trying available features. Steps to build projects
- 
Added an
index.jsin src directory. And try commandyarn run webpack. Output file should be created indistdirectory. Build as per default configurations.yarn run webpack -pornpm run webpack -- -p - 
Adding npm scripts for environment builds using
--operator. - 
Setting up debugging for node process & webpack
npm run debugthisandnpm run debug."debug":"node --inspect --inspect-brk ./node_modules/webpack/bin/webpack.js" - 
Webpack watch mode configured
npm run dev -- --watch - 
ESM & Commonjs syntax used in different files i.e
export&exports. Webpack still was able to bundle your files. - 
Treeshaking / dead code elimination by statically analyzing the code
 - 
Creating a
webpack.config.jsand setting a mode asnone 
module.exports = {
	mode: 'none'
}- 
Webpack bundle walkthrough using command
npm run webpack. Go through the build file(main.js) to undestand how webpack runtime works. - 
Webpack input, output & loaders configurations
 
Loaders
module: {
	rules: [
		{test: /\.ts$/, use: 'ts-loader'},
		{test: /\.js$/, use: 'babel-loader'},
		{test: /\.css$/, use: 'css-loader'}
	]
}module: {
	rules: [
		{
			test: regex,
			use: (Array|String|Function),
			include: RegExp[],
			exclude: RegExp[],
			issuer: (RegExp|String)[],
			enforce: 'pre'|'post'
		}
	]
}- 
Chaining loaders - Tells webpack how to interpret and translate files. Transformed on a per-file basis before adding to the dependency graph.
 - 
Webpack plugins a. objects (with and
applyproperty) b. Allow to hook into the entire compilation lifecyle c. lots / varities of available plugins - 
Basic plugin example - Plugin is an ES5 'class' which implements an apply function. The compiler uses it to emit events
 
function SamplePlugin(){}
SamplePlugin.prototype.apple = function(compiler){
	if(typeof(process) !== 'undefined'){
		compiler.plugin('done', function(stats){
			if(stats.hasErrors()){
				process.stderr.write('\x07')
			}
		});
		compiler.plugin('failed', function(err){
			process.stderr.write('\x07')
		})
	}
}
module.exports = SamplePlugin
//Usage
//require() from node_modules or webpack or local file
modules.exports = {
	//...
	plugins:[
		new SamplePlugin()
	]
	//..
}- Webpack config - 
npm run prod 
module.exports = ({mode}) => {
	console.log(mode)
	return {
		mode,
		output: {
			filename: 'bundle.js'
		}	
	}
}- 
Adding webpack plugins - Starting with
html-webpack-plugin&progressPlugin - 
Adding
webpack-dev-serverfor development environment. Try commandnpm run dev. You can see a button added to the browser & changes are reflecting instantly. - 
Splitting environment config files, using webpack-merge & modeConfigs
const modeConfig = env => require(./build-utils/webpack.${env})(env) - 
Setting default preset configurations
({ mode, presets } = { mode: 'production', presets: [] }) - 
You can add a production config to override the ouput file and run
npm run prod - 
Using css with webpack development flow. Every change reloads the browser to inject the change.
 
"webpack-dev-server":"webpack-dev-server",
"dev":"npm run webpack-dev-server -- --env.mode development",- Hot module replacement with css using 
--hotflag 
"webpack-dev-server":"webpack-dev-server",
"dev":"npm run webpack-dev-server -- --env.mode development --hot"- 
File loader & Url loader -
url-loaderusesfile-loaderunder the hood so we are installing both at the same time. And in webpack.config.js we can only see url-loader but not file-loader as of now. - 
Implementing a managable way of configuring presets. Found this to be one of the elegant way i have came across yet. Run command
npm run prodeverything working. Now we can start adding different preset / experimentation configurations those can be composed together. - 
Implementing
webpack-bundle-analyzerpreset. You can try prod analyze the build by runningnpm run prod:analyze