A Journey into
Front-end Wonderland
Rob Bosman






2008
<mx:VBox horizontalAlign="right" verticalAlign="top" height="100%">
<mx:Label text="Profielschets"
height="{profielGUI.height}" />
<mx:Label text="Persoonlijke eigenschappen"
height="{pers_eig_GUI.height}" />
<mx:Label text="Profielschets (aanvullend)"
height="{vaardighedenGUI.height}" />
<mx:Label text="Interesses"
height="{interessesGUI.height}" />
</mx:VBox>
<mx:VBox width="100%" height="100%">
<gui:XmlTextArea restClient="{restClient}"
objectXml="{getProfielXml(cvXml, CVtool.selectedLocaleInfo)}"
propertyName="profiel"
width="100%" height="40%" id="profielGUI" />
<gui:XmlTextArea restClient="{restClient}"
objectXml="{getProfielXml(cvXml, CVtool.selectedLocaleInfo)}"
propertyName="persoonlijke_eigenschappen"
width="100%" height="30%" id="pers_eig_GUI" />
<gui:XmlTextArea restClient="{restClient}"
objectXml="{getProfielXml(cvXml, CVtool.selectedLocaleInfo)}"
propertyName="vaardigheden"
width="100%" height="20%" id="vaardighedenGUI" />
<gui:XmlTextArea restClient="{restClient}"
objectXml="{getProfielXml(cvXml, CVtool.selectedLocaleInfo)}"
propertyName="interesses"
width="100%" height="10%" id="interessesGUI" />
</mx:VBox>Adobe Flex (2008)
<Stack>
<Text variant="xxLarge">Welkom bij de <Title height="24em"/></Text>
<Pivot linkSize={PivotLinkSize.large}>
<PivotItem itemIcon="Emoji" headerText="Personalia" itemCount={42}>
<Personalia/>
</PivotItem>
<PivotItem itemIcon="Emoji2" headerText="Profiel">
<TextField label="Profielschets"
multiline
autoAdjustHeight
value={props.profielschets}
onChange={props.onChangeProfielschets}/>
<TextField label="Persoonlijke eigenschappen"
multiline
autoAdjustHeight
value={props.persoonlijkeEigenschappen}
onChange={props.onChangePersoonlijkeEigenschappen}/>
<TextField label="Interesses"
multiline
autoAdjustHeight
value={props.interesses}
onChange={props.onChangeInteresses}/>
</PivotItem>
</Pivot>
<Stack.Item align="center">
<PrimaryButton text="Afmelden" onClick={props.requestLogout}/>
</Stack.Item>
</Stack>React (2020)

Back-end
Front-end
- Java
-
compiled bytecode, JVM
- jar, war
- Maven, Gradle
- Jenkins, TeamCity
- web/appserver, Docker, cloud
- Oracle or OpenJDK
- OO + synchronous programming
- IntelliJ IDEA, Eclipse, NetBeans
- HTML + CSS + Javascript (ES5/6/7)
- plain text, interpreted
- files, HTTP
- Browserify, Gulp, Parcel, Webpack
-
Buddy
-
your browser!
-
Chrome, Firefox, Edge, Safari, IE*, nodejs
-
functions + asynchronous programming
- IntelliJ WebStorm, NetBeans,
Atom, Notepad++, Visual Studio Code
EcmaScript ES5 / 6 / 7
Babel transpiler
CSS / Sass (SCSS)
Package manager
Gulp
Webpak
Javascript
var _0x10d9=['#msg','html','log','Hello\x20world!'];(function(_0x5c4d6e,_0x1aa57b){var _0xe6bb66=function(_0x36c08b){while(--_0x36c08b){_0x5c4d6e['push'](_0x5c4d6e['shift']());}};_0xe6bb66(++_0x1aa57b);}(_0x10d9,0x83));var _0x42a6=function(_0x2deb60,_0x33e65c){_0x2deb60=_0x2deb60-0x0;var _0x4fd15f=_0x10d9[_0x2deb60];return _0x4fd15f;};const m={'t':_0x42a6('0x0')};$(_0x42a6('0x1'))[_0x42a6('0x2')](m['t']);console[_0x42a6('0x3')](m);
// My message:
const message = {
text: 'Hello world!',
}
$('#msg').html(message.text);
console.log(message);Javascript
Minified
Obfuscated
const message={text:"Hello world!"};$("#msg").html(message.text),console.log(message);Minify / Obfuscate
Angular
React
Vue
lit-html
Ember
Meteor
Polymer
Backbone
KnockoutJS
Aurelia
Mithril
Ant Design
Material-UI
Shards
Bootstrap
UI Fabric
Argon Design System
Semantic UI
React Desktop
KendoReact
Web frameworks
React

Architecture
architecturE
Back-end
3 layers (backend)
microservices
Front-end
UI, State, Logic, HTTP
chaos?
Redux!
Redux

var obj = {
anArray: [10, 11, 12],
aString: "dertien"
};
function storeText(text) {
return {
type: "STORE_TEXT",
payload: text
};
}
// EC6: classes in Javascript!
class MyComponent extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<TextField value={this.props.myValue}, onChange={this.props.onChange}/>
);
}
}
function mapStateToProps(state) {
return {
myValue: state.someValue
};
}
function mapDispatchToProps(dispatch) {
return {
onChange: function(event) { dispatch(storeText(event.target.value)); }
};
}
export default connect(mapStateToProps, mapDispatchToProps)(MyComponent)const storeText = (text) => ({
type: "STORE_TEXT",
payload: text
});
const MyComponent = (props) => ({
<TextField value={props.myValue}, onChange={props.onChange}/>
});
const select = (state) => ({
myValue: state.someValue
});
const mapDispatchToProps = (dispatch) => ({
onChange: (event) => dispatch(storeText(event.target.value))
});
export default connect(select, mapDispatchToProps)(MyComponent)
Journey to Frontend Wonderland
By Rob Bosman
Journey to Frontend Wonderland
- 94