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 -- -pAdding 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 -- --watchESM & 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 pluginsBasic plugin example - Plugin is an ES5 'class' which implements an apply function. The compiler uses it to emit events
functionSamplePlugin(){}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 filemodules.exports={//...plugins:[newSamplePlugin()]//..}- 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&progressPluginAdding
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 prodUsing 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