html5j nodejs2018...Long Term Support で不具合は2年間修正される...

81
Node 2018 2018/11/23 @ HTML5j

Transcript of html5j nodejs2018...Long Term Support で不具合は2年間修正される...

Page 1: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Node 20182018/11/23 @ HTML5j

Page 2: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Twitter: @yosuke_furukawa Github: yosuke-furukawa

Page 3: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Node.js v11 released!!!

Page 4: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Node.js Core Policy

Page 5: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Node.js Core Policy

small core, less is more

Page 6: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても
Page 7: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Less is More Focusing on Stability, Security, Performance

Page 8: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Stability

Page 9: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Stability (Node.js Core)

Page 10: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても
Page 11: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Long Term Support で不具合は2年間修正される

また、セキュリティ問題はさらに3年間修正される

Page 12: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Page 13: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

♥V8 は Node.js 非互換の修正をするときは事前に 通知する。

Page 14: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

V8自身がNodeをforkして最新アップデートをしても テスト壊れないことを保証してる。

Page 15: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

毎PR毎にCIでテストするのはもちろん、全CPU・プラットフォームでビルドしてうまくいくことを確認する。

Page 16: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

たまに壊れるテスト (flaky test) に関してはどのプラットフォームで起きるか調査し、修正していく流れ

Page 17: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Stability (Node.js Application)

Page 18: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても
Page 19: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

CPU・メモリ等のプロファイラーがあり、これを使うとボトルネックを調査できる。

Page 20: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても
Page 21: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても
Page 22: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Performance

Page 23: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Performance priority is high

Page 24: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

必ず定期的にbenchmarkを取得し、遅くなってないことを調査する。

Page 25: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

マイクロベンチマークだけではなく、Expressを使ったある程度の規模のアプリでもテストする。

Page 26: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

keep v8 fresh

Page 27: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

v8 のバージョンはメジャーバージョンリリース時までのStable Chrome に利用されて

るv8を利用。

Page 28: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

(余談)なので、実はES unshippedの機能とか使える(v11だとprivate fieldとか

BigIntとか)

Page 29: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Worker

Page 30: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Worker

• Thread を使えるようにするためのもの。

• Node.js で multi thread プログラミングができる(ついに)

Page 31: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Worker

Page 32: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Worker

Page 33: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

ちなみに最近入った llhttpというパーサがやばい

(まだexperimental)

Page 34: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

llhttp は Node.js v11.2から入った新しいパーサ

$ node --experimental-http-parser test.js

# で実行可能。

Page 35: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

ここがやばいよllhttp

• TypeScript から LLVM bitcode生成する。ラッパーを書いてCからも呼べるようにしている。

• (普通(?) CからLLVMにしてWASMにしてJSで呼べるようにっていう逆のアプローチを取りそうだが、TypeScript(JS)からLLVM bitcode生成して、Cのライブラリとして呼べるようにしたという所がやばいんだけど、一旦やばさは書ききれない。。。)

Page 36: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

llhttp performance

2倍くらい早い(なぜか)

Page 37: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Security

Page 38: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Security (Node Core)

Page 39: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Node.js自身のセキュリティ脆弱性はTSCで必ず話されてる。

Page 40: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

つい最近あったリリース、OpenSSLの脆弱性が発見されたのでパッチバージョンで全体に展開。

Page 41: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Security Releaseは脆弱性が報告される度に修正パッチが作られて報告されるようになってる

Page 42: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Security (Ecosystem)

Page 43: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

npm audit は脆弱性が報告されてるライブラリが 自分のパッケージ内に存在するかを調査してくれる機能

Page 44: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

ちなみに yarn にも audit は追加されてる(snyk.io というデータベースでnpmの脆弱性データベースと違うが)

Page 45: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Less is More で機能追加はしないと言っても例外はある。

Page 46: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Web Standards

Page 47: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Why Node needs web standard?

James Snell @ NodeFest 2016Node.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 andcritical internet standards

Page 48: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Node.js v10.0.0 ~ v10.12.0

• HTTP/2

• ES Modules

• Promise in node core

• Stream/Promisesの親和性改善

Page 49: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Node.js v11

• url module が deprecated になり、 WHATWG

URL を利用するように内部改善が行われた

• WHATWG TextEncoder/TextDecoderがglobalになった

• queueMicrotask API が実験的に追加された

Page 50: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

http2

Page 51: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Multiplexing requests on 1 TCP connection

Server

1 TCP Connection but multi requests

Page 52: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Multiplexing requests on 1 TCP connection

Server

If some requests are slow, BUT whole requests are not affected

Page 53: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

HTTP/1.1

Page 54: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

HTTP/2

Page 55: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

ES Modules

Page 56: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

ES Modules

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

Page 57: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

ES Modules

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

import で読み込める

Page 58: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

ES Modules

• まだ Experimental だが、 commonjs も es modules も相互運用できる形で実装されてる。

• ただ `.mjs` という拡張子が必要になる(試験的なもの)

• 今は nodejs/modules で議論中

• https://github.com/nodejs/modules

Page 59: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Promise in Node core

Page 60: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Promise in Node Core

• そもそも Node.js には非同期処理のやり方が複数存在する。

• Callback

• Promise

• Stream

• WebではPromiseがほぼ標準的な地位、これに合わせてPromiseと相互運用できるようにしていく流れ。

Page 61: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

util.promisify

const util = require('util');const dns = require('dns');

// Promise 化された関数を取れる。const lookup = util.promisify(dns.lookup);

Page 62: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

fs.promises

const fs = require('fs');

async function main() { // fs.promisesから処理を実行 const content = await fs.promises.readFile("./foo.txt"); console.log(content.toString());}

main();

Page 63: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

fs.promises

const fs = require('fs');

async function main() { // fs.promisesから処理を実行 const content = await fs.promises.readFile("./foo.txt"); console.log(content.toString());}

main();

fs.promises にreadFileでCallbackではなくPromiseを返すようになる。

Page 64: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

fs.promises

• これもまだExperimental

• PromiseがWeb開発者にとっては親和性が高く、ニーズも強いので追加された。

• httpなどの他のAPIはまだ

Page 65: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Stream/Promiseの親和性改善

• for await of で Stream を逐次処理できるようになった

• Node v10 から Stream に追加された finished,

pipeline APIが Promiseとの親和性高い

Page 66: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

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);

Page 67: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

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();

Page 68: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

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();

Page 69: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

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)});

Page 70: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

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();

Page 71: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

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();

Page 72: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Stream/Promiseの親和性改善

• Stream => Promise

• Promise => Stream

• のどちらでも運用できるようになった。

Page 73: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Node.js Future ~~~

Page 74: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Node.js Big News!!!

• Node.js Foundation and JS Foundation intent to create joint organization.

Page 75: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Node.js Big News!!!

• Node.js Foundation and JS Foundation intent to create joint organization.

Node.js Foundation と JS Foundation は統合 されて、一つになるのを目指す。

Page 76: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Unified JavaScript Platform

W3C / WHATWG Node.jsECMA

Page 77: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Unified JavaScript Platform

W3C / WHATWG Node.jsECMA

W3C/WHATWG の Web API と Node.js API

は徐々に寄せていく。さらにECMAScriptが その標準を中央で固めていく。

Page 78: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Example

Page 79: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Unified JavaScript Platform

• Web API も Node.js API も ECMAScript も求めているのは "ユースケース"

• さらにWeb API も Node API も ECMAScriptも全部丸っと知っているのは仕様策定者よりも開発者

• 開発者側、つまり僕らがユースケースを作っていき、仕様策定者側にフィードバックしていく必要がある。

Page 80: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Unified JavaScript Platform

• Web API も Node.js API も ECMAScript も求めているのは "ユースケース"

• さらにWeb API も Node API も ECMAScriptも全部丸っと知っているのは仕様策定者よりも開発者

• 開発者側、つまり僕らがユースケースを作っていき、仕様策定者側にフィードバックしていく必要がある。リードしていくのは仕様策定者だけではなく、我々です。

Page 81: html5j nodejs2018...Long Term Support で不具合は2年間修正される また、セキュリティ問題はさらに3年間修正される V8自身がNodeをforkして最新アップデートをしても

Thank you