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

Node.js 2018

Node.js 2018

HTML5 Conference で発表した Node.js 2018 の話です。 #html5j

Yosuke Furukawa
PRO

November 25, 2018
Tweet

More Decks by Yosuke Furukawa

Other Decks in Programming

Transcript

  1. Node 2018
    2018/11/23 @ HTML5j

    View Slide

  2. Twitter: @yosuke_furukawa
    Github: yosuke-furukawa

    View Slide

  3. Node.js v11 released!!!

    View Slide

  4. Node.js Core Policy

    View Slide

  5. Node.js Core Policy
    small core, less is more

    View Slide

  6. View Slide

  7. Less is More
    Focusing on Stability,
    Security, Performance

    View Slide

  8. Stability

    View Slide

  9. Stability (Node.js Core)

    View Slide

  10. View Slide

  11. Long Term Support Ͱෆ۩߹͸2೥ؒमਖ਼͞ΕΔ
    ·ͨɺηΩϡϦςΟ໰୊͸͞Βʹ3೥ؒमਖ਼͞ΕΔ

    View Slide


  12. View Slide


  13. V8 ͸ Node.js ඇޓ׵ͷमਖ਼Λ͢Δͱ͖͸ࣄલʹ
    ௨஌͢Δɻ

    View Slide

  14. V8ࣗ਎͕NodeΛforkͯ͠࠷৽ΞοϓσʔτΛͯ͠΋
    ςετյΕͳ͍͜ͱΛอূͯ͠Δɻ

    View Slide

  15. ຖPRຖʹCIͰςετ͢Δͷ͸΋ͪΖΜɺશCPUɾϓ
    ϥοτϑΥʔϜͰϏϧυͯ͠͏·͍͘͘͜ͱΛ֬ೝ͢Δɻ

    View Slide

  16. ͨ·ʹյΕΔςετ (flaky test) ʹؔͯ͠͸Ͳͷϓϥο
    τϑΥʔϜͰى͖Δ͔ௐࠪ͠ɺमਖ਼͍ͯ͘͠ྲྀΕ

    View Slide

  17. Stability (Node.js
    Application)

    View Slide

  18. View Slide

  19. CPUɾϝϞϦ౳ͷϓϩϑΝΠϥʔ͕͋Γɺ͜ΕΛ࢖͏ͱ
    ϘτϧωοΫΛௐࠪͰ͖Δɻ

    View Slide

  20. View Slide

  21. View Slide

  22. Performance

    View Slide

  23. Performance priority is high

    View Slide

  24. ඞͣఆظతʹbenchmarkΛऔಘ͠ɺ஗͘ͳͬͯͳ͍͜
    ͱΛௐࠪ͢Δɻ

    View Slide

  25. ϚΠΫϩϕϯνϚʔΫ͚ͩͰ͸ͳ͘ɺExpressΛ࢖ͬͨ
    ͋Δఔ౓ͷن໛ͷΞϓϦͰ΋ςετ͢Δɻ

    View Slide

  26. keep v8 fresh

    View Slide

  27. v8 ͷόʔδϣϯ͸ϝδϟʔ
    όʔδϣϯϦϦʔε࣌·Ͱͷ
    Stable Chrome ʹར༻͞Εͯ
    Δv8Λར༻ɻ

    View Slide

  28. ʢ༨ஊʣͳͷͰɺ࣮͸ES
    unshippedͷػೳͱ͔࢖͑Δ
    ʢv11ͩͱprivate fieldͱ͔
    BigIntͱ͔ʣ

    View Slide

  29. Worker

    View Slide

  30. Worker
    • Thread Λ࢖͑ΔΑ͏ʹ͢ΔͨΊͷ΋ͷɻ
    • Node.js Ͱ multi thread ϓϩάϥϛϯά͕Ͱ
    ͖Δʢ͍ͭʹʣ

    View Slide

  31. Worker

    View Slide

  32. Worker

    View Slide

  33. ͪͳΈʹ࠷ۙೖͬͨ
    llhttpͱ͍͏ύʔα͕΍͹͍
    (·ͩexperimental)

    View Slide

  34. llhttp ͸ Node.js v11.2͔Βೖͬͨ
    ৽͍͠ύʔα
    $ node --experimental-
    http-parser test.js
    # Ͱ࣮ߦՄೳɻ

    View Slide

  35. ͕͜͜΍͹͍Αllhttp
    • TypeScript ͔Β LLVM bitcodeੜ੒͢Δɻϥούʔ
    Λॻ͍ͯC͔Β΋ݺ΂ΔΑ͏ʹ͍ͯ͠Δɻ
    • (ී௨(?) C͔ΒLLVMʹͯ͠WASMʹͯ͠JSͰݺ΂Δ
    Α͏ʹ͍ͬͯ͏ٯͷΞϓϩʔνΛऔΓͦ͏͕ͩɺ
    TypeScript(JS)͔ΒLLVM bitcodeੜ੒ͯ͠ɺCͷϥ
    ΠϒϥϦͱͯ͠ݺ΂ΔΑ͏ʹͨ͠ͱ͍͏ॴ͕΍͹͍
    Μ͚ͩͲɺҰ୴΍͹͞͸ॻ͖͖Εͳ͍ɻɻɻ)

    View Slide

  36. llhttp performance
    ഒ͘Β͍ૣ
    ͍ʢͳ͔ͥʣ

    View Slide

  37. Security

    View Slide

  38. Security (Node Core)

    View Slide

  39. Node.jsࣗ਎ͷηΩϡϦςΟ੬
    ऑੑ͸TSCͰඞͣ࿩͞ΕͯΔɻ

    View Slide

  40. ͍ͭ࠷ۙ͋ͬͨϦϦʔεɺOpenSSLͷ੬ऑੑ͕ൃݟ͞
    ΕͨͷͰύονόʔδϣϯͰશମʹల։ɻ

    View Slide

  41. Security Release͸੬ऑੑ͕ใ
    ࠂ͞ΕΔ౓ʹमਖ਼ύον͕࡞Β
    Εͯใࠂ͞ΕΔΑ͏ʹͳͬͯΔ

    View Slide

  42. Security (Ecosystem)

    View Slide

  43. npm audit ͸੬ऑੑ͕ใࠂ͞ΕͯΔϥΠϒϥϦ͕
    ࣗ෼ͷύοέʔδ಺ʹଘࡏ͢Δ͔Λௐࠪͯ͘͠ΕΔػೳ

    View Slide

  44. ͪͳΈʹ yarn ʹ΋ audit ͸௥Ճ͞ΕͯΔʢsnyk.io ͱ
    ͍͏σʔλϕʔεͰnpmͷ੬ऑੑσʔλϕʔεͱҧ͏
    ͕ʣ

    View Slide

  45. Less is More Ͱػೳ௥Ճ͸͠
    ͳ͍ͱݴͬͯ΋ྫ֎͸͋Δɻ

    View Slide

  46. Web Standards

    View Slide

  47. Why Node needs web standard?
    James Snell @ NodeFest 2016

    Node.js is, and has been, primarily a
    platform for Web Application Development
    While Node.js presumes a "small core"
    philosophy for most things, it includes
    support for the most basic and
    critical internet standards

    View Slide

  48. Node.js v10.0.0 ~ v10.12.0
    • HTTP/2
    • ES Modules
    • Promise in node core
    • Stream/Promisesͷ਌࿨ੑվળ

    View Slide

  49. Node.js v11
    • url module ͕ deprecated ʹͳΓɺ WHATWG
    URL Λར༻͢ΔΑ͏ʹ಺෦վળ͕ߦΘΕͨ
    • WHATWG TextEncoder/TextDecoder͕global
    ʹͳͬͨ
    • queueMicrotask API ͕࣮ݧతʹ௥Ճ͞Εͨ

    View Slide

  50. http2

    View Slide

  51. Multiplexing requests on 1 TCP
    connection
    4FSWFS
    5$1$POOFDUJPOCVUNVMUJ
    SFRVFTUT

    View Slide

  52. Multiplexing requests on 1 TCP
    connection
    4FSWFS
    *GTPNFSFRVFTUTBSFTMPX #65
    XIPMFSFRVFTUTBSFOPUB⒎FDUFE

    View Slide

  53. )551

    View Slide

  54. )551

    View Slide

  55. ES Modules

    View Slide

  56. ES Modules
    import { readFile } from 'fs';
    readFile('./foo.txt', (err, source) => {
    if (err) {
    console.error(err);
    } else {
    console.log(source);
    }
    });

    View Slide

  57. ES Modules
    import { readFile } from 'fs';
    readFile('./foo.txt', (err, source) => {
    if (err) {
    console.error(err);
    } else {
    console.log(source);
    }
    });
    JNQPSUͰಡΈࠐΊΔ

    View Slide

  58. ES Modules
    • ·ͩ Experimental ͕ͩɺ commonjs ΋ es modules
    ΋૬ޓӡ༻Ͱ͖ΔܗͰ࣮૷͞ΕͯΔɻ
    • ͨͩ `.mjs` ͱ͍͏֦ுࢠ͕ඞཁʹͳΔʢࢼݧతͳ΋
    ͷʣ
    • ࠓ͸ nodejs/modules Ͱٞ࿦த
    • https://github.com/nodejs/modules

    View Slide

  59. Promise in Node core

    View Slide

  60. Promise in Node Core
    • ͦ΋ͦ΋ Node.js ʹ͸ඇಉظॲཧͷ΍Γํ͕ෳ਺ଘࡏ͢Δɻ
    • Callback
    • Promise
    • Stream
    • WebͰ͸Promise͕΄΅ඪ४తͳ஍Ґɺ͜Εʹ߹Θͤͯ
    Promiseͱ૬ޓӡ༻Ͱ͖ΔΑ͏ʹ͍ͯ͘͠ྲྀΕɻ

    View Slide

  61. util.promisify
    const util = require('util');
    const dns = require('dns');
    // Promise Խ͞Εͨؔ਺ΛऔΕΔɻ
    const lookup =
    util.promisify(dns.lookup);

    View Slide

  62. fs.promises
    const fs = require('fs');
    async function main() {
    // fs.promises͔ΒॲཧΛ࣮ߦ
    const content = await
    fs.promises.readFile("./foo.txt");
    console.log(content.toString());
    }
    main();

    View Slide

  63. fs.promises
    const fs = require('fs');
    async function main() {
    // fs.promises͔ΒॲཧΛ࣮ߦ
    const content = await
    fs.promises.readFile("./foo.txt");
    console.log(content.toString());
    }
    main();
    GTQSPNJTFTʹSFBE'JMFͰ$BMMCBDLͰ͸ͳ
    ͘1SPNJTFΛฦ͢Α͏ʹͳΔɻ

    View Slide

  64. fs.promises
    • ͜Ε΋·ͩExperimental
    • Promise͕Web։ൃऀʹͱͬͯ͸਌࿨ੑ͕ߴ
    ͘ɺχʔζ΋ڧ͍ͷͰ௥Ճ͞Εͨɻ
    • httpͳͲͷଞͷAPI͸·ͩ

    View Slide

  65. Stream/Promiseͷ਌࿨ੑվળ
    • for await of Ͱ Stream Λஞ࣍ॲཧͰ͖ΔΑ͏
    ʹͳͬͨ
    • Node v10 ͔Β Stream ʹ௥Ճ͞Εͨ finished,
    pipeline API͕ Promiseͱͷ਌࿨ੑߴ͍

    View Slide

  66. for await of ͷվળ
    const fs = require('fs');
    async function print(readable) {
    readable.setEncoding('utf8');
    let data = '';
    // for await ۟Ͱiterateͭͭ͠ɺchunkΛऔΓग़͢
    for await (const k of readable) {
    data += k;
    }
    console.log(data);
    }
    print(fs.createReadStream('file')).catch(console.log);

    View Slide

  67. Stream finished API
    const fs = require('fs');
    const { finished } = require('stream');
    const rs = fs.createReadStream('./stream.js');
    //finished API ͰΤϥʔऴྃɺਖ਼ৗऴྃʹ͔͔ΘΒͣऴྃͨ͠ΒίʔϧόοΫΛݺ΂Δɻ
    finished(rs, (err) => {
    if (err) {
    console.error('Stream failed', err);
    return;
    }
    console.log('Stream is done reading');
    });
    rs.resume();

    View Slide

  68. Stream finished API
    const fs = require('fs');
    const util = require('util');
    const stream = require('stream');
    // Promisify Λ࢖ͬͯcallbackΛpromiseʹ͢Δ
    const finished = util.promisify(stream.finished);
    const rs = fs.createReadStream('./stream.js');
    // async await ͕࢖͑Δ
    async function run() {
    await finished(rs);
    console.log('Stream is done reading');
    }
    run().catch((err) => console.error('Stream failed', err));
    rs.resume();

    View Slide

  69. Stream Pipeline API
    const fs = require('fs');
    const rs = fs.createReadStream('error.txt');
    const ws = fs.createWriteStream('output.txt');
    rs.pipe(ws).on("error", (e) => {
    // ͜͜Ͱ౷ҰతʹΤϥʔΛϋϯυϦϯά͍͕ͨ͠ɺ
    // readstreamͰΤϥʔʹͳΔͱ͜͜ʹདྷͳ͍ɻ
    // ͜͏΍ͬͯॻ͔ͳͯ͘͸͍͚ͳ͍
    // rs.on("error", errorHandler).pipe(ws).on("error", errorHandler)
    });

    View Slide

  70. Stream Pipeline API
    const { pipeline, Transform } = require('stream');
    const rs = fs.createReadStream('./stream.js');
    const ts = new Transform({
    transform(chunk, encoding, callback) {
    callback(null, chunk.toString().toUpperCase())
    }
    });
    const ws = fs.createWriteStream('./stream_cap.js');
    pipeline(rs, ts, ws, (err) => {
    if (err) {
    console.error(err);
    return;
    }
    console.log('Stream is done reading');
    });
    rs.resume();

    View Slide

  71. Stream Pipeline API
    const { pipeline, Transform } = require('stream');
    const p = util.promisify(pipeline);
    const rs = fs.createReadStream('./stream.js');
    const ts = new Transform({
    transform(chunk, encoding, callback) {
    callback(null, chunk.toString().toUpperCase())
    }
    });
    const ws = fs.createWriteStream('./stream_cap.js');
    // promisify ͔ͯ͠Β async-awaitͰ͖Δ
    async function run() {
    await p(rs, ts, ws);
    console.log('Stream is done reading');
    }
    run().catch(console.error);
    rs.resume();

    View Slide

  72. Stream/Promiseͷ਌࿨ੑվળ
    • Stream => Promise
    • Promise => Stream
    • ͷͲͪΒͰ΋ӡ༻Ͱ͖ΔΑ͏ʹͳͬͨɻ

    View Slide

  73. Node.js Future ~~~

    View Slide

  74. Node.js Big News!!!
    • Node.js Foundation and JS Foundation intent
    to create joint organization.

    View Slide

  75. Node.js Big News!!!
    • Node.js Foundation and JS Foundation intent
    to create joint organization.
    Node.js Foundation ͱ JS Foundation ͸౷߹
    ͞ΕͯɺҰͭʹͳΔͷΛ໨ࢦ͢ɻ

    View Slide

  76. Unified JavaScript Platform
    W3C / WHATWG Node.js
    ECMA

    View Slide

  77. Unified JavaScript Platform
    W3C / WHATWG Node.js
    ECMA
    W3C/WHATWG ͷ Web API ͱ Node.js API
    ͸ঃʑʹد͍ͤͯ͘ɻ͞ΒʹECMAScript͕
    ͦͷඪ४ΛதԝͰݻΊ͍ͯ͘ɻ

    View Slide

  78. Example

    View Slide

  79. Unified JavaScript Platform
    • Web API ΋ Node.js API ΋ ECMAScript ΋ٻΊͯ
    ͍Δͷ͸ "Ϣʔεέʔε"
    • ͞ΒʹWeb API ΋ Node API ΋ ECMAScript΋શ
    ෦ؙͬͱ஌͍ͬͯΔͷ͸࢓༷ࡦఆऀΑΓ΋։ൃऀ
    • ։ൃऀଆɺͭ·Γ๻Β͕ϢʔεέʔεΛ࡞͍͖ͬͯɺ
    ࢓༷ࡦఆऀଆʹϑΟʔυόοΫ͍ͯ͘͠ඞཁ͕͋Δɻ

    View Slide

  80. Unified JavaScript Platform
    • Web API ΋ Node.js API ΋ ECMAScript ΋ٻΊͯ
    ͍Δͷ͸ "Ϣʔεέʔε"
    • ͞ΒʹWeb API ΋ Node API ΋ ECMAScript΋શ
    ෦ؙͬͱ஌͍ͬͯΔͷ͸࢓༷ࡦఆऀΑΓ΋։ൃऀ
    • ։ൃऀଆɺͭ·Γ๻Β͕ϢʔεέʔεΛ࡞͍͖ͬͯɺ
    ࢓༷ࡦఆऀଆʹϑΟʔυόοΫ͍ͯ͘͠ඞཁ͕͋Δɻ
    Ϧʔυ͍ͯ͘͠ͷ͸࢓༷ࡦఆऀ͚ͩͰ͸ͳ
    ͘ɺզʑͰ͢ɻ

    View Slide

  81. Thank you

    View Slide