The hero’s journey
in JavaScript frameworks
@ddprrt • fettblog.eu
Hero’s journey
Hero’s journey
Not the tour of heroes!
!
!
call to adventure
!
call to adventure
crossing the threshold
!
call to adventure
crossing the thresholdknown
unknown
!
call to adventure
crossing the threshold
abyss
known
unknown
!
call to adventure
crossing the threshold
abyss
the road of trials
known
unknown
!
call to adventure
crossing the threshold
metamorphosis
abyss
the road of trials
known
unknown
!
call to adventure
crossing the threshold
metamorphosis
the ultimate boon
abyss
the road of trials
known
unknown
!
call to adventure
crossing the threshold
metamorphosis
the ultimate boon
returning the boon
abyss
the road of trials
known
unknown
!
call to adventure
crossing the threshold
metamorphosis
the ultimate boon
returning the boon
abyss
the road of trials
known
unknown
It’s like learning a JavaScript framework!
!
call to adventure
crossing the threshold
metamorphosis
the ultimate boon
returning the boon
abyss
the road of trials
!
crossing the threshold
metamorphosis
the ultimate boon
returning the boon
abyss
the road of trials
starting a new project
!
metamorphosis
the ultimate boon
returning the boon
abyss
the road of trials
starting a new project
hello world
!
metamorphosis
the ultimate boon
returning the boon
abyss
starting a new project
hello world
googling the error message
!
metamorphosis
the ultimate boon
returning the boon
starting a new project
hello world
googling the error message
going
into
production
!
the ultimate boon
returning the boon
starting a new project
hello world
googling the error message
going
into
production
understanding the
technology
!
returning the boon
starting a new project
hello world
googling the error message
going
into
production
understanding the
technology
adding
framework to CV
!
starting a new project
hello world
googling the error message
going
into
production
understanding the
technology
adding
framework to CV
answering questions on
stack overflow
It’s a bumpy road ahead!
Three act structure
Three act structure
Act One Act Two Act Three
Three act structure
Beginning
Inciting
incident
Second
thoughts
Act One Act Two Act Three
Three act structure
Beginning
Inciting
incident
Second
thoughts
Act One Act Two Act Three
Obstacles
Obstacles
Three act structure
Beginning
Inciting
incident
Second
thoughts
Act One Act Two Act Three
Obstacles
Obstacles
Three act structure
Plot Twist!
Beginning
Inciting
incident
Second
thoughts
Act One Act Two Act Three
Obstacles
Obstacles
Three act structure
Climax
Plot Twist!
Beginning
Inciting
incident
Second
thoughts
Act One Act Two Act Three
Obstacles
Obstacles
Three act structure
Climax
Denouement
End
Plot Twist!
Beginning
Inciting
incident
Second
thoughts
Act One Act Two Act Three
Obstacles
Obstacles
Three act structure
Climax
Denouement
End
Plot Twist!
Beginning
Inciting
incident
Second
thoughts
Act One Act Two Act Three
Obstacles
Obstacles
Three act structure
Climax
Denouement
End
Plot Twist!
Beginning
Inciting
incident
Second
thoughts
Act One Act Two Act Three
Obstacles
Obstacles
Three act structure
Climax
Denouement
End
Plot Twist!
learning curve
Beginning
Inciting
incident
Second
thoughts
Act One Act Two Act Three
Obstacles
Obstacles
Three act structure
Climax
Denouement
End
Plot Twist!
learning curve
Beginning
Inciting
incident
Second
thoughts
Act One Act Two Act Three
Obstacles
Obstacles
Three act structure
Climax
Denouement
End
Plot Twist!
learning curve
Beginning
Inciting
incident
Second
thoughts
Act One Act Two Act Three
Obstacles
Obstacles
Three act structure
Climax
Denouement
End
Plot Twist!
learning curve
Beginning
Inciting
incident
Second
thoughts
Act One Act Two Act Three
Obstacles
Obstacles
Three act structure
Climax
Denouement
End
Plot Twist!
learning curve
Beginning
Inciting
incident
Second
thoughts
Act One Act Two Act Three
Obstacles
Obstacles
Three act structure
Climax
Denouement
End
Plot Twist!
learning curve
next.js
Act One: Setup
The Beginning
Inciting incident
Second thoughts
call to adventure
crossing the threshold
Act One: Setup
pages/index.js export default () => <h1>Hello World</h1>
package.json {
"name": "hello-world",
"scripts": {
"dev": "next",
},
"dependencies": {
"next": "latest",
"react": "^16.0.0",
"react-dom": "^16.0.0"
}
}
Act One: Setup
pages/index.js import Link from ‘next/link’
export default () =>
<>
<h1>Hello World</h1>
<Link href=‘/about’><a>About</a></Link>
</>
pages/about.js export default () =>
<>
<h1>Hello About</h1>
</>
Act One: Setup
Second thoughts? import Head from ‘next/head’
export default () =>
<>
<Head>
<title>A podcast about JavaScript</title>
</Head>
<h1>Hello World</h1>
</>
Act Two: Confrontation
Obstacles
Obstacles
Plot Twist
the road of trials
the abyss
Act Two: Confrontation
next.config.js const withTypescript =
require('@zeit/next-typescript')
const withCSS = require('@zeit/next-css')
const withMDX = require('@zeit/next-mdx')()
module.exports =
withTypescript()
Act Two: Confrontation
next.config.js const withTypescript =
require('@zeit/next-typescript')
const withCSS = require('@zeit/next-css')
const withMDX = require('@zeit/next-mdx')()
module.exports =
withCSS(withTypescript())
Act Two: Confrontation
next.config.js const withTypescript =
require('@zeit/next-typescript')
const withCSS = require('@zeit/next-css')
const withMDX = require('@zeit/next-mdx')()
module.exports =
withMDX(withCSS(withTypescript()))
Act Two: Confrontation
about.js import ArticleLayout
from '../components/ArticleLayout';
import About from '../articles/about.mdx';
import Head from 'next/head';
export default () => <ArticleLayout>
<Head>
<title>About ScriptCast</title>
</Head>
<About />
</ArticleLayout>;
Act Two: Confrontation The Abyss!
Act Two: Confrontation
server.js const express = require('express');
const next = require(‘next');
const app = next();
const handle = app.getRequestHandler();
The Abyss!
Act Two: Confrontation
server.js const express = require('express');
const next = require(‘next');
const app = next();
const handle = app.getRequestHandler();
app.prepare()
.then(() => {
const server = express();
server.get('/api', fetchRSS());
server.get('*', (req, res) => handle(req, res));
});
The Abyss!
Act Three: Resolution
Climax
Denouement
End
metamorphosis
the ultimate boon
returning the boon
Act Three: Resolution
import App, { Container } from 'next/app'
import React from ‘react';
export default class MyApp extends App {
render () {
const { Component, pageProps } = this.props;
return
<Container>
<Component {...pageProps} />
</Container>
}
}
_app.js
Act Three: Resolution
import App, { Container } from 'next/app'
import React from ‘react';
import Player from ‘../components/Player’
export default class MyApp extends App {
render () {
const { Component, pageProps } = this.props;
return
<Container>
<Component {...pageProps} />
<Player />
</Container>
}
}
_app.js
the ultimate boon!
returning the boon … to you!
incremental adoption
fin.

A hero's journey in JavaScript frameworks