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