{Web Tooling} 101
Storybook, ESLint, Babel and Webpack
Work
Omio
Berlin
Developer tooling
Community
OSS & Mentor
Blogs, YT Videos and Tutorials
International Speaker
Inconsistent Indie hacker
Hobbies
Travel
Music and Party
Hiking, Cycling & Nature
Past: Paint & Write
About Me
What is Developer Tooling?
Developer tooling refers to the various software tools and applications that developers use to aid in the software development process. This can include text editors, integrated development environments (IDEs), version control systems, debugging tools, and more. These tools help developers to write, test, and deploy code more efficiently and effectively.
Agenda
- Storybook Addon
- ESLint plugin
- Babel Plugin
- Webpack Plugin
{Storybook}
What is Storybook?
- Develop and Test in Isolation
- Create and Visualize different states
- Create Reusable components
- Document and showcase
How does storybook beneficial?
- Independence for teams
- Easy maintenance of edge cases
- UI testing, Visual testing etc
- Automated & updated Documentation
Testing & Storybook
Visual testing
UI testing
Accessibility testing
UX testing
Other features
Customize Webpack & Babel configs
Customize Branding
Custom Integration
Setting up Storybook & Stories
Story
Different Variants
Parameters and Decorators
Storybook Architecture
Storybook and Addons
Addon Architecture
{code time}
- Initialize a project: npx create-react-app project-name
- Initialize storybook: npx storybook init
- Steps to create an Addon:
- register the addon
- add it with a title
- Integrate it in Panel/Toolbar
- render the React component
as per you requirements
Your Turn
{ESLint}
What is ESLint
- Identifying and reporting on patterns
- Code quality, enforce coding conventions, and prevent errors
ESLint Architecture
ESLint Plugins
Collection of Rules
Parser - Espree
Formatter
ESLint Source Code
{AST}
https://astexplorer.net/
{code time}
npm init @eslint/config - Initializing eslint in project
npm i -g generator-eslint - Installing global dependency
npx yo eslint:plugin - Scaffold ESLint plugin boilerplate
{Webpack}
What is Webpack
- JavaScript module bundler
- Bundles JS but also other assets like Styles, images, etc
- Output bundle is minimized, optimized, etc
- Integrates with linters, transpilers etc
Why Webpack?
Long Long ago...
// index.html
<html>
<head></head>
<body>
<script type="text/javascript">
console.log("Inline Javascript")
</script>
<script type="text/javascript" src="pathToJSFile.js" />
<body />
</html>
// pathToJSFile.js
console.log("test");
Problems
Not Scalable
Many Scripts -> Performance bottleneck
One large Script -> Not Maintainable
Scope Issues
IIFE
IIFE - Immediately Invoked Function Expression
Avoids Scope collisions
Tools: Gulp, Grunt
(function add(a, b) {
return a + b
}) (3,5);
Problems
Dead/ Unused Code
Rebuilds
No Lazy Loading
Common JS
Evolution of NodeJS creates Common JS modules
Node + modules(common js) + NPM = Awesome
// Named import/export
// add.js
exports.add = () => { /* do add */ }
//index.js
const {add} = require('./add.js');
// Default import/export
// add.js
module.exports = () => { /* do add */ }
//index.js
const anyName = require('./add.js');
Problems
No Browser Support
Early Bundlers/Loaders
Loaders load and transpile at runtime
Bundlers transpile and bundle before hitting the browser
Code in Common JS => Bundle it together
Supports Browser directly
RequireJS
Problems
Debugging such code is a big issue
Code can be AMD as well, which is a problem
No Lazy load / Async bundling
ES Modules
Reusable & Scalable
Better Syntax than CommonJS
// Named import/export
// add.js
export const add = () => { /* do add */ };
//index.js
import {add} from './add.js'
// Default import/export
// add.js
export default () => { /* do add */ };
//index.js
import anyName from './add.js'
Problems
Node has no support (In older versions)
Slow in Browsers (when not transpiled)
We NEED a HERO
Webpack
Write in any Format -> Convert for Browser
Async Bundling and Lazy loading
Bigger EcoSystem
Bundle more than JS & JSON
Get equipped with Plugins and Loaders
ARCHITECTURE
Config Webpack
Entry & Output
{
entry: "./src/index.js",
output: {
path: path.join(__dirname, "/dist");
filename: 'bundle.js'
}
}
Loaders
Its a function that gets source code of the file as arguement
Transforms Source code to JS
Chaining of loaders executes in reverse order
module: {
rules: [
{
test: \.css$/,
use: [style-loader, css-loader]
}
]
}
Plugins
Its a class/object with `apply` method
Access entire Compiler lifecycle
plugins: [
new PluginName( { ...optionsIfAny } )
]
{code time}
A simple app and simple loader
Compiler
Tapable
Webpack itself is built by many plugins
Tapable is basic utility for such plugins to access hooks of various events
Custom Plugin
{Babel}
What is Babel?
- Converts code written in modern to older JavaScript
- Use the latest features while still supporting older browsers
- Babel with Webpack, React, etc.
Babel Architecture
Babel Plugins
Traverse
Manipulation
Visitor Pattern
Babel Tools
babel-parser
babel-traverse
babel-types
babel-generator
babel-template
AST
Custom Plugin
Benefits & What's Next?
Please share your feedback
Thank you!
Time for Casual Hangouts. People can choose to stay or leave 😊
Code
By Vilva Athiban
Code
- 246