Improve build process and remove WebP support

This commit is contained in:
Andras Schmelczer 2022-09-21 23:18:03 +02:00
parent 3649a033b0
commit 4f47bb639a
No known key found for this signature in database
GPG key ID: 0EA1BC97D0AB076E
21 changed files with 31 additions and 102 deletions

24
custom.d.ts vendored
View file

@ -3,24 +3,12 @@ declare module '*.svg' {
export default content; export default content;
} }
declare module '*.jpg' {
import { ResponsiveImage } from 'src/types/responsive-image';
const content: ResponsiveImage;
export default content;
}
declare module '*.jpg?format=webp' { declare module '*.jpg?format=webp' {
import { ResponsiveImage } from 'src/types/responsive-image'; import { ResponsiveImage } from 'src/types/responsive-image';
const content: ResponsiveImage; const content: ResponsiveImage;
export default content; export default content;
} }
declare module '*.jpg?format=jpg' {
import { ResponsiveImage } from 'src/types/responsive-image';
const content: ResponsiveImage;
export default content;
}
declare module '*.png' { declare module '*.png' {
import { ResponsiveImage } from 'src/types/responsive-image'; import { ResponsiveImage } from 'src/types/responsive-image';
const content: ResponsiveImage; const content: ResponsiveImage;
@ -33,18 +21,6 @@ declare module '*.png?format=webp' {
export default content; export default content;
} }
declare module '*.png?format=jpg' {
import { ResponsiveImage } from 'src/types/responsive-image';
const content: ResponsiveImage;
export default content;
}
declare module '*.jpeg' {
import { ResponsiveImage } from 'src/types/responsive-image';
const content: ResponsiveImage;
export default content;
}
declare module '*.mp4' { declare module '*.mp4' {
import { url } from 'src/types/url'; import { url } from 'src/types/url';
const content: url; const content: url;

View file

@ -7,7 +7,6 @@ import { Main } from '../page/main/main';
import { PageElement } from '../page/page-element'; import { PageElement } from '../page/page-element';
import { PageTimeline } from '../page/timeline/timeline'; import { PageTimeline } from '../page/timeline/timeline';
import cvEnglish from './media/cv-andras-schmelczer.pdf'; import cvEnglish from './media/cv-andras-schmelczer.pdf';
import meJpeg from './media/me.jpg?format=jpg';
import meWebP from './media/me.jpg?format=webp'; import meWebP from './media/me.jpg?format=webp';
import { adAstraTimelineElement } from './projects/ad-astra'; import { adAstraTimelineElement } from './projects/ad-astra';
import { citySimulationTimelineElement } from './projects/city-simulation'; import { citySimulationTimelineElement } from './projects/city-simulation';
@ -30,7 +29,6 @@ export const create = (): Array<PageElement> => [
name: `András Schmelczer`, name: `András Schmelczer`,
photo: Image({ photo: Image({
imageWebP: meWebP, imageWebP: meWebP,
imageJpeg: meJpeg,
alt: `a picture of me`, alt: `a picture of me`,
}), }),
about: [ about: [

View file

@ -1,6 +1,5 @@
import { Video } from '../../page/basics/video/video'; import { Video } from '../../page/basics/video/video';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import adAstraJpeg from '../media/ad_astra.jpg?format=jpg';
import adAstraWebP from '../media/ad_astra.jpg?format=webp'; import adAstraWebP from '../media/ad_astra.jpg?format=webp';
import adAstraMp4 from '../media/mp4/ad_astra.mp4'; import adAstraMp4 from '../media/mp4/ad_astra.mp4';
import adAstraWebM from '../media/webm/ad_astra.webm'; import adAstraWebM from '../media/webm/ad_astra.webm';
@ -11,7 +10,6 @@ export const adAstraTimelineElement: TimelineElementParameters = {
date: `2020 spring`, date: `2020 spring`,
figure: new Video({ figure: new Video({
posterWebP: adAstraWebP, posterWebP: adAstraWebP,
posterJpeg: adAstraJpeg,
mp4: adAstraMp4, mp4: adAstraMp4,
webm: adAstraWebM, webm: adAstraWebM,
}), }),

View file

@ -1,7 +1,6 @@
import { Video } from '../../page/basics/video/video'; import { Video } from '../../page/basics/video/video';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import citySimulationMp4 from '../media/mp4/simulation.mp4'; import citySimulationMp4 from '../media/mp4/simulation.mp4';
import citySimulationPosterJpeg from '../media/simulation.jpg?format=jpg';
import citySimulationPosterWebP from '../media/simulation.jpg?format=webp'; import citySimulationPosterWebP from '../media/simulation.jpg?format=webp';
import citySimulationWebM from '../media/webm/simulation.webm'; import citySimulationWebM from '../media/webm/simulation.webm';
@ -10,7 +9,6 @@ export const citySimulationTimelineElement: TimelineElementParameters = {
date: `2018 July - August`, date: `2018 July - August`,
figure: new Video({ figure: new Video({
posterWebP: citySimulationPosterWebP, posterWebP: citySimulationPosterWebP,
posterJpeg: citySimulationPosterJpeg,
mp4: citySimulationMp4, mp4: citySimulationMp4,
webm: citySimulationWebM, webm: citySimulationWebM,
}), }),

View file

@ -1,6 +1,5 @@
import { Image } from '../../page/basics/image/image.html'; import { Image } from '../../page/basics/image/image.html';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import colourJpeg from '../media/color.jpg?format=jpg';
import colourWebP from '../media/color.jpg?format=webp'; import colourWebP from '../media/color.jpg?format=webp';
export const colorsTimelineElement: TimelineElementParameters = { export const colorsTimelineElement: TimelineElementParameters = {
@ -8,7 +7,6 @@ export const colorsTimelineElement: TimelineElementParameters = {
date: `2018 June`, date: `2018 June`,
figure: Image({ figure: Image({
imageWebP: colourWebP, imageWebP: colourWebP,
imageJpeg: colourJpeg,
alt: `a picture of the app`, alt: `a picture of the app`,
container: true, container: true,
}), }),

View file

@ -1,6 +1,5 @@
import { Preview } from '../../page/basics/preview/preview'; import { Preview } from '../../page/basics/preview/preview';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import declaredJpeg from '../media/decla-red.png?format=jpg';
import declaredWebP from '../media/decla-red.png?format=webp'; import declaredWebP from '../media/decla-red.png?format=webp';
import bscThesis from '../media/sdf2d-andras-schmelczer.pdf'; import bscThesis from '../media/sdf2d-andras-schmelczer.pdf';
import { GitHub, Open, Thesis } from '../shared'; import { GitHub, Open, Thesis } from '../shared';
@ -8,12 +7,7 @@ import { GitHub, Open, Thesis } from '../shared';
export const declaredTimelineElement: TimelineElementParameters = { export const declaredTimelineElement: TimelineElementParameters = {
title: `Multiplayer game`, title: `Multiplayer game`,
date: `2020 autumn`, date: `2020 autumn`,
figure: new Preview( figure: new Preview(declaredWebP, 'https://decla.red', 'The website of the video game'),
declaredWebP,
declaredJpeg,
'https://decla.red',
'The website of the video game'
),
description: ` description: `
Using SDF-2D (my ray tracing graphics library), I created a conquest-style multiplayer browser game. Using SDF-2D (my ray tracing graphics library), I created a conquest-style multiplayer browser game.
It even runs on mobiles. It even runs on mobiles.

View file

@ -1,6 +1,5 @@
import { Video } from '../../page/basics/video/video'; import { Video } from '../../page/basics/video/video';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import forexPosterJpeg from '../media/forex.jpg?format=jpg';
import forexPosterWebP from '../media/forex.jpg?format=webp'; import forexPosterWebP from '../media/forex.jpg?format=webp';
import forexMp4 from '../media/mp4/forex.mp4'; import forexMp4 from '../media/mp4/forex.mp4';
import forexWebM from '../media/webm/forex.webm'; import forexWebM from '../media/webm/forex.webm';
@ -10,7 +9,6 @@ export const forexTimelineElement: TimelineElementParameters = {
date: `2019 autumn`, date: `2019 autumn`,
figure: new Video({ figure: new Video({
posterWebP: forexPosterWebP, posterWebP: forexPosterWebP,
posterJpeg: forexPosterJpeg,
mp4: forexMp4, mp4: forexMp4,
webm: forexWebM, webm: forexWebM,
invertButton: true, invertButton: true,

View file

@ -1,7 +1,6 @@
import { Image } from '../../page/basics/image/image.html'; import { Image } from '../../page/basics/image/image.html';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import mscThesis from '../media/great-ai-andras-schmelczer.pdf'; import mscThesis from '../media/great-ai-andras-schmelczer.pdf';
import greatAiJpeg from '../media/great-ai.png?format=jpg';
import greatAiWebP from '../media/great-ai.png?format=webp'; import greatAiWebP from '../media/great-ai.png?format=webp';
import { Open, PyPi, Thesis } from '../shared'; import { Open, PyPi, Thesis } from '../shared';
@ -10,7 +9,6 @@ export const greatAiTimelineElement: TimelineElementParameters = {
date: `2022`, date: `2022`,
figure: Image({ figure: Image({
imageWebP: greatAiWebP, imageWebP: greatAiWebP,
imageJpeg: greatAiJpeg,
alt: `some example code using GreatAI`, alt: `some example code using GreatAI`,
container: true, container: true,
}), }),

View file

@ -1,6 +1,5 @@
import { Video } from '../../page/basics/video/video'; import { Video } from '../../page/basics/video/video';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import ledPosterJpeg from '../media/led.jpg?format=jpg';
import ledPosterWebP from '../media/led.jpg?format=webp'; import ledPosterWebP from '../media/led.jpg?format=webp';
import ledMp4 from '../media/mp4/led.mp4'; import ledMp4 from '../media/mp4/led.mp4';
import ledWebM from '../media/webm/led.webm'; import ledWebM from '../media/webm/led.webm';
@ -10,7 +9,6 @@ export const ledsTimelineElement: TimelineElementParameters = {
date: `2016 spring`, date: `2016 spring`,
figure: new Video({ figure: new Video({
posterWebP: ledPosterWebP, posterWebP: ledPosterWebP,
posterJpeg: ledPosterJpeg,
mp4: ledMp4, mp4: ledMp4,
webm: ledWebM, webm: ledWebM,
}), }),

View file

@ -1,6 +1,5 @@
import { Image } from '../../page/basics/image/image.html'; import { Image } from '../../page/basics/image/image.html';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import myNotesJpeg from '../media/my-notes.png?format=jpg';
import myNotesWebP from '../media/my-notes.png?format=webp'; import myNotesWebP from '../media/my-notes.png?format=webp';
import { GitHub } from '../shared'; import { GitHub } from '../shared';
@ -9,7 +8,6 @@ export const myNotesTimelineElement: TimelineElementParameters = {
date: `2019 November`, date: `2019 November`,
figure: Image({ figure: Image({
imageWebP: myNotesWebP, imageWebP: myNotesWebP,
imageJpeg: myNotesJpeg,
alt: `two screenshots of the application`, alt: `two screenshots of the application`,
container: true, container: true,
}), }),

View file

@ -1,6 +1,5 @@
import { Image } from '../../page/basics/image/image.html'; import { Image } from '../../page/basics/image/image.html';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import processSimulatorInputJpeg from '../media/process-simulator-input.jpg?format=jpg';
import processSimulatorInputWebP from '../media/process-simulator-input.jpg?format=webp'; import processSimulatorInputWebP from '../media/process-simulator-input.jpg?format=webp';
export const nuclearEditorTimelineElement: TimelineElementParameters = { export const nuclearEditorTimelineElement: TimelineElementParameters = {
@ -8,7 +7,6 @@ export const nuclearEditorTimelineElement: TimelineElementParameters = {
date: `2018 October - November`, date: `2018 October - November`,
figure: Image({ figure: Image({
imageWebP: processSimulatorInputWebP, imageWebP: processSimulatorInputWebP,
imageJpeg: processSimulatorInputJpeg,
alt: `a picture of the simulator's UI`, alt: `a picture of the simulator's UI`,
container: true, container: true,
}), }),

View file

@ -1,6 +1,5 @@
import { Image } from '../../page/basics/image/image.html'; import { Image } from '../../page/basics/image/image.html';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import processSimulatorJpeg from '../media/process-simulator.jpg?format=jpg';
import processSimulatorWebP from '../media/process-simulator.jpg?format=webp'; import processSimulatorWebP from '../media/process-simulator.jpg?format=webp';
export const nuclearTimelineElement: TimelineElementParameters = { export const nuclearTimelineElement: TimelineElementParameters = {
@ -8,7 +7,6 @@ export const nuclearTimelineElement: TimelineElementParameters = {
date: `2018 October - November`, date: `2018 October - November`,
figure: Image({ figure: Image({
imageWebP: processSimulatorWebP, imageWebP: processSimulatorWebP,
imageJpeg: processSimulatorJpeg,
alt: `a screenshot of the simulator`, alt: `a screenshot of the simulator`,
container: true, container: true,
}), }),

View file

@ -1,6 +1,5 @@
import { Image } from '../../page/basics/image/image.html'; import { Image } from '../../page/basics/image/image.html';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import photosJpeg from '../media/photos.jpg?format=jpg';
import photosWebP from '../media/photos.jpg?format=webp'; import photosWebP from '../media/photos.jpg?format=webp';
import { Open } from '../shared'; import { Open } from '../shared';
@ -9,7 +8,6 @@ export const photosTimelineElement: TimelineElementParameters = {
date: `2016 summer`, date: `2016 summer`,
figure: Image({ figure: Image({
imageWebP: photosWebP, imageWebP: photosWebP,
imageJpeg: photosJpeg,
alt: `a picture of the website`, alt: `a picture of the website`,
container: true, container: true,
}), }),

View file

@ -1,7 +1,6 @@
import { Video } from '../../page/basics/video/video'; import { Video } from '../../page/basics/video/video';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import platformMp4 from '../media/mp4/platform.mp4'; import platformMp4 from '../media/mp4/platform.mp4';
import platformPosterJpeg from '../media/platform.png?format=jpg';
import platformPosterWebP from '../media/platform.png?format=webp'; import platformPosterWebP from '../media/platform.png?format=webp';
import platformWebM from '../media/webm/platform.webm'; import platformWebM from '../media/webm/platform.webm';
@ -10,7 +9,6 @@ export const platformGameTimelineElement: TimelineElementParameters = {
date: `2017 autumn`, date: `2017 autumn`,
figure: new Video({ figure: new Video({
posterWebP: platformPosterWebP, posterWebP: platformPosterWebP,
posterJpeg: platformPosterJpeg,
mp4: platformMp4, mp4: platformMp4,
webm: platformWebM, webm: platformWebM,
}), }),

View file

@ -1,6 +1,5 @@
import { Preview } from '../../page/basics/preview/preview'; import { Preview } from '../../page/basics/preview/preview';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import sdf2dJpeg from '../media/sdf2d.png?format=jpg';
import sdf2dWebP from '../media/sdf2d.png?format=webp'; import sdf2dWebP from '../media/sdf2d.png?format=webp';
import { NPM, Open, Youtube } from '../shared'; import { NPM, Open, Youtube } from '../shared';
@ -9,7 +8,6 @@ export const sdf2dTimelineElement: TimelineElementParameters = {
date: `2020 autumn`, date: `2020 autumn`,
figure: new Preview( figure: new Preview(
sdf2dWebP, sdf2dWebP,
sdf2dJpeg,
'https://sdf2d.schmelczer.dev', 'https://sdf2d.schmelczer.dev',
'A webpage showcasing the SDF-2D project.' 'A webpage showcasing the SDF-2D project.'
), ),

View file

@ -1,6 +1,5 @@
import { Image } from '../../page/basics/image/image.html'; import { Image } from '../../page/basics/image/image.html';
import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters'; import { TimelineElementParameters } from '../../page/timeline/timeline-element/timeline-element-parameters';
import towersJpeg from '../media/towers.png?format=jpg';
import towersWebP from '../media/towers.png?format=webp'; import towersWebP from '../media/towers.png?format=webp';
import { GitHub, Open } from '../shared'; import { GitHub, Open } from '../shared';
@ -9,7 +8,6 @@ export const towersTimelineElement: TimelineElementParameters = {
date: `2019 August - September`, date: `2019 August - September`,
figure: Image({ figure: Image({
imageWebP: towersWebP, imageWebP: towersWebP,
imageJpeg: towersJpeg,
alt: `a picture of the website`, alt: `a picture of the website`,
container: true, container: true,
}), }),

View file

@ -8,16 +8,13 @@ import './preview.scss';
export const generate = ({ export const generate = ({
alt, alt,
posterWebP, posterWebP,
posterJpeg,
}: { }: {
alt: string; alt: string;
posterWebP: ResponsiveImage; posterWebP: ResponsiveImage;
posterJpeg: ResponsiveImage;
}): html => ` }): html => `
<div class="preview"> <div class="preview">
${Image({ ${Image({
imageWebP: posterWebP, imageWebP: posterWebP,
imageJpeg: posterJpeg,
alt, alt,
container: true, container: true,
isIgnoredByImageViewer: true, isIgnoredByImageViewer: true,

View file

@ -6,11 +6,10 @@ import { generate } from './preview.html';
export class Preview extends PageElement { export class Preview extends PageElement {
public constructor( public constructor(
posterWebP: ResponsiveImage, posterWebP: ResponsiveImage,
posterJpeg: ResponsiveImage,
private readonly url: string, private readonly url: string,
alt: string alt: string
) { ) {
super(createElement(generate({ posterWebP, posterJpeg, alt }))); super(createElement(generate({ posterWebP, alt })));
this.url += '?portfolioView'; this.url += '?portfolioView';
this.query('.start-button').addEventListener('click', this.loadContent.bind(this)); this.query('.start-button').addEventListener('click', this.loadContent.bind(this));
} }

View file

@ -5,6 +5,5 @@ export interface VideoParameters {
mp4: url; mp4: url;
webm: url; webm: url;
posterWebP: ResponsiveImage; posterWebP: ResponsiveImage;
posterJpeg: ResponsiveImage;
invertButton?: boolean; invertButton?: boolean;
} }

View file

@ -9,15 +9,13 @@ export const generate = ({
webm, webm,
mp4, mp4,
posterWebP, posterWebP,
posterJpeg,
invertButton, invertButton,
}: VideoParameters): html => ` }: VideoParameters): html => `
<div class="figure-container video-container" style="padding-top:${ <div class="figure-container video-container" style="padding-top:${
(posterJpeg.height / posterJpeg.width) * 100 (posterWebP.height / posterWebP.width) * 100
}%"> }%">
${Image({ ${Image({
imageWebP: posterWebP, imageWebP: posterWebP,
imageJpeg: posterJpeg,
alt: `thumbnail for the video`, alt: `thumbnail for the video`,
isIgnoredByImageViewer: true, isIgnoredByImageViewer: true,
})} })}

View file

@ -1,6 +1,6 @@
const path = require('path'); const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin');
const Sharp = require('responsive-loader/sharp'); const TerserPlugin = require('terser-webpack-plugin');
const InlineSourceWebpackPlugin = require('inline-source-webpack-plugin'); const InlineSourceWebpackPlugin = require('inline-source-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const webpack = require('webpack'); const webpack = require('webpack');
@ -10,8 +10,15 @@ module.exports = (env, argv) => ({
entry: { entry: {
index: './src/index.ts', index: './src/index.ts',
}, },
devServer: { optimization: {
hot: false, minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
module: true,
},
}),
],
}, },
plugins: [ plugins: [
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
@ -31,37 +38,24 @@ module.exports = (env, argv) => ({
rules: [ rules: [
{ {
test: /\.(jpe?g|png)$/i, test: /\.(jpe?g|png)$/i,
exclude: /no-change/i,
loader: 'responsive-loader', loader: 'responsive-loader',
options: { options: {
adapter: Sharp, adapter: require('responsive-loader/sharp'),
name: '[contenthash].[ext]', sizes: [200, 400, 800, 1200, 1920],
outputPath: 'static/', placeholder: true,
sizes: [200, 400, 800, 1200, 1600, 2000], placeholderSize: 64,
quality: 0.9, quality: 90,
format: 'webp', format: 'webp',
progressive: true, progressive: true,
name: '[hash:8].[ext]',
}, },
}, },
{ {
test: /\.(webm|mp4)$/i, test: /\.(webm|mp4)$/i,
use: [ type: 'asset/resource',
{ generator: {
loader: 'file-loader', filename: '[hash:8][ext]',
options: {
outputPath: 'static/',
name: '[contenthash].[ext]',
},
},
],
},
{
test: /\.pdf$/i,
use: {
loader: 'file-loader',
options: {
outputPath: 'static/',
name: '[name].[ext]',
},
}, },
}, },
{ {
@ -69,13 +63,10 @@ module.exports = (env, argv) => ({
use: 'svg-inline-loader', use: 'svg-inline-loader',
}, },
{ {
test: /no-change/i, test: /(\/no-change\/|.pdf$)/i,
use: { type: 'asset/resource',
loader: 'file-loader', generator: {
options: { filename: '[name][ext]',
outputPath: '/',
name: '[name].[ext]',
},
}, },
}, },
{ {
@ -109,7 +100,10 @@ module.exports = (env, argv) => ({
], ],
}, },
resolve: { resolve: {
extensions: ['.ts'], extensions: [
'.ts',
'.js', // required for development
],
}, },
output: { output: {
clean: true, clean: true,