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

Next Node.js on DevSummit 2017

Next Node.js on DevSummit 2017

Developers Summit 2017 で話した Next Node.js の話です。

D76231a2114896dfcc7b79ac69558b79?s=128

Yosuke Furukawa
PRO

February 16, 2017
Tweet

Transcript

  1. Next Node.js developers summit 2017 2017/02/16 @ Meguro Gajoen

  2. @yosuke_furukawa

  3. Organizer Leader Node Collaborator Node Evangelist

  4. Twitter: @yosuke_furukawa Github: yosuke-furukawa

  5. What’s Node.js ???

  6. Server side JavaScript?

  7. Server side JavaScript? No.

  8. JavaScript Runtime Environment

  9. Node.js Philosophy: Small Core, Less is More

  10. Pavelleó Mies van del Rohe / yisris Less is More

  11. So, Node.js does not add any new brilliant features??

  12. So, Node.js does not add any new brilliant features?? No.

  13. Node.js Past Present Future

  14. Past Node.js My favorite changes v4.x ~ v6.x

  15. My favorite features (v4.x ~ v6.x) • inspect mode with

    Chrome • Intl built-in Object support • stable and performance
  16. inspect mode DEMO

  17. Intl built-in Object > new Intl.NumberFormat('en').format(10000000) ’10,000,000' > new Intl.NumberFormat('en',

    { style: 'currency', currency: 'USD' }).format(10000000) '$10,000,000' > new Intl.DateTimeFormat('ja-JP-u-ca- japanese').format(new Date()); 'ฏ੒28೥11݄24೔' > new Intl.DateTimeFormat('en').format(new Date()); '11/24/2016'
  18. Stable & Performant /PEFKTWJTGBTUFSUIBO PUIFSWFSTJPOT

  19. Present Node.js v7.x

  20. Node.js v7 is released

  21. Notable Changes • ES2016+ support • New URL Parser

  22. ES2016+ Support

  23. ES2015 Support

  24. ES2015 Support 

  25. ES2016 Support 

  26. exponential operator / Array.prototype.includes > 2 ** 3 8 >

    [1,2,3].includes(1) true
  27. ES2017 Support 

  28. ES2017 Support  8FDBOVTFBTZODBXBJU CFIJOEUIFqBH

  29. ES2017 Support  "OEOFYUWDBOVTF BTZODBXBJUCZEFGBVMU

  30. Before async-await: callback const fs = require('fs'); const copy =

    (from, to, done) => { fs.readFile(from, (err, data) => { if (err) return done(err); fs.writeFile(to, data, (err) => { if (err) return done(err); done(null); }); }); }; copy('./foo.txt', './bar.txt', (err) => err ? console.error(err) : console.log('done'))
  31. Before async-await: Promise const fs = require('fs'); const promisify =

    require('./promisify'); const readFile = promisify(fs.readFile); const writeFile = promisify(fs.writeFile); const copy = (from, to) => { return readFile(from).then( (data) => writeFile(to, data)); }; copy('./foo.txt', './bar.txt').then(() => console.log('done')).catch(console.error);
  32. async-await // --harmony_async_await const fs = require('fs'); const promisify =

    require('./promisify'); const readFile = promisify(fs.readFile); const writeFile = promisify(fs.writeFile); const copy = async function(from, to) { const data = await readFile(from); await writeFile(to, data); }; copy('./foo.txt', './bar.txt').then(() => console.log('done')).catch(console.error);
  33. New URL Parser

  34. New URL Parser • current URL parser const url =

    require('url'); // Create URL Object const u = url.parse('https://www.example.com/path/ foo/bar'); // Stringify URL Object url.format(u);
  35. New URL Parser • new URL Parser is same to

    Browser URL API const URL = require('url').URL; // Create URL Object const u = new URL('https://www.example.com/path/ foo/bar'); // Stringify URL Object u.toString();
  36. New URL Parser • new URL Parser is same to

    Browser URL API const URL = require('url').URL; // Create URL Object const u = new URL('https://www.example.com/path/ foo/bar'); // Stringify URL Object u.toString(); 8)"58(63-
  37. Node.js v7 follows standardization • ES2016+ support • New URL

    Parser &$." 8)"58(
  38. Node.js v7 follows standardization • ES2016+ support • New URL

    Parser &$." 8)"58( 8FC4UBOEBSE
  39. Future Node.js v8.x ~

  40. Future Node.js move forward to Web Standard • HTTP/2 support

    • ES Modules interop *&5' &$."
  41. HTTP/2 Support • HTTP/2 is new version of HTTP •

    RFC7540 is already published by IETF • Release Target: Node v8
  42. HTTP/2 Goal • Decrease Latency • Data Compression of HTTP

    Header (hpack) • Fixing Head-of-Line Blocking • Server Push • Prioritized Request
  43. Request Header becoming huge NFUIPE (&5 TDIFNF IUUQT IPTU FYBNQMFDPN

    QBUI GPPCBSCB[ VTFSBHFOU .P[JMMBʜ DPPLJF TFTTJPOJEYYYY
  44. Request Header becoming huge .P[JMMB DPNQBUJCMF.4*& 8JOEPXT/547 .P[JMMB 8JOEPXT/58JOY 

    "QQMF8FC,JU ,)5.- MJLF(FDLP  $ISPNF4BGBSJ&EHF 
  45. Data Compression of HTTP Header 3FRVFTU)FBEFST NFUIPE (&5 TDIFNF IUUQT

    IPTU FYBNQMFDPN QBUI GPPCBSCB[ VTFSBHFOU .P[JMMB $PNQSFTTJPO%JDUJPOBSZ  BVUIPSJUZ  NFUIPE (&5 ʜ  TDIFNF IUUQT ʜ  IPTU FYBNQMFDPN  VTFSBHFOU .P[JMMBʜ $PNQSFTTFE)FBEFS     )V⒎NBO GPPCBSCB[ 
  46. Head-of-Line Blocking 4FSWFS #SPXTFSDBOTFOESFRVFTUT QBSBMMFMZ

  47. Head-of-Line Blocking 4FSWFS #VUJGSFRVFTUJTTMPX CSPXTFS DBOVTFPOMZSFRVFTUT

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

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

  50. HTTP/2 on Node inside MJCVW IUUQQBSTFS 7 DBSFT 0QFO44- [MJC

    OHIUUQ OFXMJCSBSZUPDSFBUF )551DMJFOUTFSWFS
  51. HTTP/2 Support // plain http support const http2 = require('http').HTTP2;

    const server = http2.createServer((req, res) => { res.end('hello plain text http2'); }); server.listen(3000);
  52. HTTP/2 Support const http2 = require('http').HTTP2; const fs = require('fs');

    const path = require('path'); const options = { key: fs.readFileSync( path.resolve('.', 'keys/agent2-key.pem')), cert: fs.readFileSync( path.resolve('.', 'keys/agent2-cert.pem')) }; const server = http2.createSecureServer(options, (req, res) => { res.end('hello http2'); }); server.listen(3010);
  53. HTTP2 by node core DEMO

  54. HTTP/2 Implementation Status • Strongly Work In Progress • Some

    missing APIs • We have not supported HTTP/2 feature like Server Push/Prioritization yet • We need help!!! • https://github.com/nodejs/http2
  55. ES Modules interoperability • Release Target: Node v10 (maybe) •

    ES Modules interop is not so easy.
  56. ES Modules interoperability is…? • Node.js uses own CommonJS-like module

    load system. • However JavaScript defines new module system in ES2015. import/export • We need to show users to options to choose both CommonJS and ES Modules style.
  57. ES Modules Goal • new Declarative Grammar (Tool/Engines friendly) •

    easy to detect errors • easy to optimize • new Strict Rules • Module is new Script.
  58. Tools/Engines Friendly, Easy to detect errors module.exports = 'foo'; module.exports

    = 'bar'; // This is not error
  59. Tools/Engines Friendly, Easy to detect errors export default function ()

    { return 'foo'; } export default function () => { return 'foo'; } // Syntax Error, export default is duplicated
  60. Tools/Engines Friendly, Easy to detect errors // export.js module.exports.foo =

    () => { return 'foo' } // import.js const bar = require('./export.js').bar; // bar is undefined
  61. Tools/Engines Friendly, Easy to detect errors // export.js export function

    foo() {} // import.js import { bar } from './export.js'; // Syntax Error, bar is not found.
  62. Tools/Engines Friendly, Easy to optimize • MicroSoft Edge experimentally implements

    ES Modules. • webpack tree shaking
  63. Engines Friendly, Easy to optimize https://blogs.windows.com/msedgedev/ 2016/05/17/es6-modules-and-beyond/ #CmgS4hcpMwUTShU3.97

  64. Tools Friendly, Easy to optimize • webpack2 can reduce the

    bundled JavaScript size using `tree-shaking`. • tree-shaking detects `export module but not used one`.
  65. Tools Friendly, Easy to optimize • webpack2 can reduce the

    bundled JavaScript size using `tree-shaking`. • tree-shaking detects `export module but not used one`.
  66. ES Modules: new Script • Module is new Script •

    Module has some differences with current Script • implicit Strict Mode • Different Scope (top level this : undefined) • reserved keywords ( await )
  67. ES Modules // Syntax Error under strict mode, you cannot

    use with. with (obj) {} // undefined, top level this is undefined not window console.log(this); // it is not window.foo, just module local scope var foo = 1; // Syntax Error, await is reserved in ES Modules var await = 'foo';
  68. ES Modules Current Status -PBEFSTQFDJTTUJMM 6/%&3%*4$644*0/

  69. ES Modules Current Status 7JTXPSLJOQSPHSFTT

  70. ES Modules Current Status • Safari TP is enabled under

    flag • Firefox Nightly is enabled under flag • Edge is enabled but it does not completed yet • Chrome is starting to development
  71. ES Modules Current Status &4.PEVMFT(SBNNFS4QFD TDSJQUUBHTQFDTDSJQUUZQFNPEVMF *NQMFNFOUBUJPOCZ7 *OUFSPQJNQMFNFOUBUJPOCZ/PEFKT ✓ ✓

    &4.PEVMFT-PBEFS4QFD
  72. Discussion, Discusssion, Discussion… • Loader Spec is under discussion •

    ES Modules new spec is also under discussion • Node Interop is also under discussion…
  73. new extension?: .mjs • Current Node Proposals looks at file

    extension • `.js` is Script • `.mjs` is Module • this is still discussing on Node-EPS repository. • https://github.com/nodejs/node-eps/
  74. Features are based on Standard • Past Node.js • Intl

    built-in Object • Present Node.js • ES 2016+ support • new URL Support • Future Node.js • HTTP/2 • ES Modules &$." &$." 8)"58( *&5' &$."
  75. 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
  76. Why Node needs standard? • We are focusing on keep

    node ecosystems better. • ECMAScript and other internet Standard will be next community standard. • Node.js would be better to follow those standardization
  77. Thank you!!!

  78. References • You Don’t Know ES Modules by Teppei Sato

    • Node And Web Standard by James Snell • The Journey to ES Modules by Bradley Ferias • High Performance Browser Networking by Ilya Grigorik • https://github.com/nodejs/node-eps