Back to the work

(or what did I miss)

Agenda

UA jobs market overview

Ability to work under preassure

~3800

Satisfaction rate

Usage rate

Should I become a "fullstack" ???

JavaScript world updates

NodeJS 18

new features

Vue 3

 Release: June 2022 / composition API

React 18

concurrent mode!

HTTP/3

specification & QUIC over UDP

 ECMAScript 2022

was published in June 2022

Typescript

a new standard

Vite

Next Generation Frontend Tooling

Low Code & No code (Teleport HQ)

BFF

Edge coputing

Nest serverless

Next

Nuxt

Remix

ES

2022

class MyClass {
  instancePublicField = 1;
  static staticPublicField = 2;

  #instancePrivateField = 3;
  static #staticPrivateField = 4;

  #nonStaticPrivateMethod() {}
  get #nonStaticPrivateAccessor() {}
  set #nonStaticPrivateAccessor(value) {}

  static #staticPrivateMethod() {}
  static get #staticPrivateAccessor() {}
  static set #staticPrivateAccessor(value) {}

  static {
    // Static initialization block
  }
}

New members of classes  

// Error and its subclasses now let us specify
//  which error caused the current one:

try {
  // Do something
} catch (otherError) {
  throw new Error('Something went wrong', {cause: otherError});
}

error.cause 

// my-module.mjs

//We can now use await at the top levels of modules 
//and don’t have to enter async functions or methods anymore:
//
const response = await fetch('https://example.com');

const text = await response.text();

console.log(text);

Top-level await in modules

// Method .at() of indexable values lets us read an element at 
// a given index (like the bracket operator []) and supports 
// negative indices (unlike the bracket operator):

> ['a', 'b', 'c'].at(0)
'a'
> ['a', 'b', 'c'].at(-1)
'c'

//The following “indexable” types have method .at():
// - string
// - Array
// - All Typed Array classes: Uint8Array etc

Method .at() of indexable values

18

// Before
import { render } from 'react-dom';
const container = document.getElementById('app');
render(<App tab="home" />, container);

// After
import { createRoot } from 'react-dom/client';
const container = document.getElementById('app');
const root = createRoot(container);
root.render(<App tab="home" />);

ReactDOM.render is no longer supported in React 18

React 18 with concurrent rendering, React can interrupt, pause, resume, or abandon a render.

Transitions

import { startTransition } from 'react';

// Urgent: Show what was typed
setInputValue(input);

// Mark any non-urgent state updates inside as transitions
startTransition(() => {
  // Transition: Show the results
  setSearchQuery(input);
});

Non-urgent updates are called transitions. By marking non-urgent UI updates as "transitions", React will know which updates to prioritize. This makes it easier to optimize rendering and get rid of stale rendering.

// Before: only React events were batched.
setTimeout(() => {
  setCount(c => c + 1);
  setFlag(f => !f);
  // React will render twice, once for 
  // each state update (no batching)
}, 1000);

// After: updates inside of timeouts, promises,
// native event handlers or any other event are batched.
setTimeout(() => {
  setCount(c => c + 1);
  setFlag(f => !f);
  // React will only re-render once at the end (that's batching!)
}, 1000);

Automatic Batching

Suspense on the server

Wrap a slow part of your app within the Suspense component, telling React to delay the loading of the slow component.

<Suspense fallback={<Spinner />}>
  <Comments />
</Suspense>

18

HTTP Timeouts

Fetch API

Web streams API

Test runner

Node.js 18 new features

const getData = async () => {
  const response = await fetch('https://catfact.ninja/fact');
  if (response.ok) {
    const data = await response.json();
    console.log(data);
  } else {
    console.error(`${response.status} ${response.statusText}`);
  }
};

Fetch API

import {
  ReadableStream
} from 'node:stream/web';

import {
  setInterval as every
} from 'node:timers/promises';

import {
  performance
} from 'node:perf_hooks';

const SECOND = 1000;

const stream = new ReadableStream({
  async start(controller) {
    for await (const _ of every(SECOND))
      controller.enqueue(performance.now());
  }
});

for await (const value of stream)
  console.log(value);

Example ReadableStream

They are a way to handle reading/writing files, network communications, or any kind of end-to-end information exchange in an efficient way.

Using streams you read a file piece by piece

An example of a stream

const http = require('http')
const fs = require('fs')

const server = http.createServer(function(req, res) {
  fs.readFile(__dirname + '/data.txt', (err, data) => {
    res.end(data)
  })
})
server.listen(3000)

If the file is big, the operation will take quite a bit of time. Here is the same thing written using streams

An example of a stream

const http = require('http')
const fs = require('fs')

const server = http.createServer((req, res) => {
  const stream = fs.createReadStream(__dirname + '/data.txt')
  stream.pipe(res)
})
server.listen(3000)

Instead of waiting until the file is fully read, we start streaming it to the HTTP client as soon as we have a chunk of data ready to be sent.

const getData = () => {
  fetch('https://catfact.ninja/fact')
    .then((response) => {
      console.log('response.body =', response.body);
      // response.body = ReadableStream { locked: false, state: 'readable', supportsBYOB: false }
      return response.body;
    })
    .then((responseBody) => {
      const reader = responseBody.getReader();
      return new ReadableStream({
        start(controller) {
          /**
           * Push handles each data chunk
           */
          function push() {
            /**
             * @param {boolean} done - Whether the stream is done
             * @param {Uint8Array} done - The stream state
             */
            reader.read().then(({ done, value }) => {
              // when there is no more data to read
              if (done) {
                console.log('done =', done); 
                // done = true
                controller.close();
                return;
              }

              // get the data and put it on queue
              controller.enqueue(value);

              // show the done state and the chunks value
              console.log(done, value);
              // false Uint8Array(124) [
              //   123,  34, 102,  97,  99, 116,  34,  58,  34,  84,  97,  98,
              //    98, 121,  32,  99,  97, 116, 115,  32,  97, 114, 101,  32...

              // continue getting data
              push();
            });
          }

          // start getting data
          push();
        },
      });
    })
    .then((stream) => {
      // create a Response with the stream content
      return new Response(stream, {
        headers: { 'Content-Type': 'text/html' },
      }).text();
    })
    .then((result) => {
      console.log('result =', result);
      // result = {"fact":"Tabby cats are thought to get their name from Attab, 
      // a district in Baghdad, now the capital of Iraq.","length":100}
    });
};

getData();

Fetch API + Web Streams

import test from 'node:test';
import assert from 'assert';

test('asynchronous tests', async (t) => {
  await t.test('passing test', (t) => {
    assert.strictEqual(1, 1);
  });

  await t.test('failing test', (t) => {
    assert.strictEqual(1, 2);
  });
});

Experimental Test Runner

Productivity

Deadlines

Priprity

Importancy

More guilty

Success?

Goals

Body

Contacts

Activity

Libet's experiment: (0) repose, until (1) the Bereitschaftspotential is detected, (2-Libet's W) the volunteer memorizes a dot position upon feeling their intention, and then (3) acts.

Sleep well

7-9 hours

Hobbies

and interests

Communication

Nature

Sport

and movement

Less news

less scrolling

Quiz time

Thank you

Back to work

By vovy

Back to work

  • 147