Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Node.js Development in 2020: trends and techniques

Node.js Development in 2020: trends and techniques

Nikita Galkin

November 08, 2019
Tweet

More Decks by Nikita Galkin

Other Decks in Programming

Transcript

  1. Node.js Development
    in 2020:
    trends and techniques
    by Nikita Galkin
    Nov 8, 2019

    View full-size slide

  2. What anniversary
    is today?

    View full-size slide

  3. Why Node.js won the market?
    1. Everybody knows JavaScript
    2. Everybody loves Open Source
    3. Google pay for V8
    4. Performance boost every release
    5. There is a release schedule

    View full-size slide

  4. nvm install 12.13.0
    nvm alias default 12.13.0
    nvm reinstall-packages 10.16.3
    Migrate your local version
    easy with nvm:

    View full-size slide

  5. Node.js v12
    Breaking changes

    View full-size slide

  6. Breaking change at
    Event Loop
    for Timers
    and Microtasks

    View full-size slide

  7. setTimeout(() => console.log('timeout1'));
    setTimeout(() => {
    console.log('timeout2');
    Promise.resolve().then(() =>
    console.log('promise resolve')
    );
    });
    setTimeout(() => console.log('timeout3'));
    setTimeout(() => console.log('timeout4'));

    View full-size slide

  8. ➜ ~ nvm use v10
    Now using node v10.16.3 (npm v6.9.0)
    ➜ ~ node --print process.versions.v8
    6.8.275.32-node.54
    ➜ ~ nvm use v12
    Now using node v12.13.0 (npm v6.12.0)
    ➜ ~ node --print process.versions.v8
    7.7.299.13-node.12
    6.8 ➜ 7.7

    View full-size slide

  9. const array = [];
    for (let i = 1; i < 10000; i++) array.push(i);
    console.time('assign');
    const assign = array.reduce(
    (acc, curr) =>
    Object.assign(acc, {[curr]: curr}),
    {});
    console.timeEnd('assign');
    console.time('spread');
    const spread = array.reduce(
    (acc, curr) => ({...acc, [curr]: curr}),
    {});
    console.timeEnd('spread');

    View full-size slide

  10. 1. Faster JavaScript parsing
    2. Faster async functions
    and promises
    3. Zero-cost async stack
    traces

    View full-size slide

  11. const { promisify } = require('util');
    const wait = promisify(setTimeout);
    async function testAsyncStacktrace() {
    await wait(10);
    await willDie();
    return 42;
    }
    async function willDie() {
    await Promise.resolve();
    throw new Error('#Feelsbadman');
    }
    testAsyncStacktrace()
    .catch(error => console.log(error.stack));

    View full-size slide

  12. By default stack-trace is 10
    On CLI level
    ➜ ~ node async-stack-trace.js \
    --stack-trace-limit=1000
    On code level
    Error.stackTraceLimit = Infinity;
    More

    View full-size slide

  13. Node.js
    features

    View full-size slide

  14. Node.js v12 disappointments
    1. ECMAScript Modules support is
    not stable. Again.
    2. Most native modules are callback
    based. Only fs and dns modules
    have promises.

    View full-size slide

  15. JavaScript designed for browser
    where a failure affects only one tab,
    only one user.
    But at Node.js failing affect
    everything...

    View full-size slide


  16. Worker Threads
    are no longer experimental!

    View full-size slide


  17. New http parser
    llhttp based on llparse

    View full-size slide

  18. 1. You use it!
    2. For your own
    parser
    3. TypeScript
    Why learn how it works?

    View full-size slide


  19. native Promises

    View full-size slide

  20. 1. Faster JavaScript parsing
    2. Faster async functions
    and promises
    3. Zero-cost async stack
    traces

    View full-size slide

  21. What need to know:
    1. promisify from util
    2. once from events
    3. Reading streams
    asynchronously

    View full-size slide

  22. function wait(timeout) {
    return new Promise(resolve => {
    setTimeout(resolve, timeout));
    });
    }
    // VS
    const util = require('util');
    const wait = util.promisify(setTimeout);

    View full-size slide

  23. const { EventEmitter } = require('events');
    const emitter = new EventEmitter();
    async function getPromise() {
    return new Promise(resolve => {
    emitter.once('eventName', resolve);
    })
    }

    View full-size slide

  24. const { EventEmitter } = require('events');
    const { once } = require('events');
    const emitter = new EventEmitter();
    async function getPromise() {
    return once( emitter, 'eventName');
    }

    View full-size slide

  25. const { EventEmitter } = require('events');
    const emitter = new EventEmitter();
    async function getPromise() {
    return new Promise(resolve => {
    emitter.once('eventName', resolve);
    })
    }

    View full-size slide

  26. async function main(filePath) {
    const readStream =
    fs.createReadStream(filePath);
    for await (const chunk of readStream) {
    console.log('>>> '+chunk);
    }
    console.log('### DONE ###');
    }

    View full-size slide

  27. What need to use:
    1. Promise.all/Promise.race
    2. p-limit
    3. multipleResolves from
    process

    View full-size slide

  28. Next big thing
    is
    QUIC/HTTP3

    View full-size slide

  29. 1. Node.js Foundation and
    JS Foundation Merge to
    Form OpenJS Foundation
    2. Node.js certification
    3. Nodejs.dev arrived

    View full-size slide

  30. 1. Boolean
    2. Null
    3. Undefined
    4. Number
    5. String
    6. Symbol
    7. Object
    Data types in JavaScript.

    View full-size slide

  31. 1. Boolean
    2. Null
    3. Undefined
    4. Number
    5. String
    6. Symbol
    7. Object
    8. BigInt
    Data types in JavaScript.

    View full-size slide

  32. Not only Node.js
    news

    View full-size slide

  33. 1. TC39 new proposals
    2. GraphQL is not hype and
    has foundation.
    3. Nestjs is the most
    promising framework

    View full-size slide

  34. TypeScript 3.7

    View full-size slide

  35. HAPPY NODE.JS
    DEVELOPMENT!
    You can find me on Twitter as @galk_in
    Slides are available at speakerdeck.com/galkin
    or at my site galk.in

    View full-size slide