東京Node学園祭2017(1日目)に行ってきました。

今年は本格的にNode.jsに触れる場面が増えたので参加しました。

Source to Binary - journey of V8 javascript engine

  • V8とは
  • Googleが実装したJavascriptエンジン
  • バイトコードの状態で実行
  • parseの処理に構文木を作り出す
  • いきなりパースするのは速度が遅くなってしまう
  • parseを遅延して行ったり、2段階に分けて実行している
  • 関数を分析している(この時点ではASTは作らない)
  • Lazy Parsing(遅延パース)、関数は呼び出されて初めてコンパイルされる
  • 詳しくはGoogleのスライドを
  • スプレッド演算子の中身はdo for文なのでコストが高い
  • ECMAScriptで、Binary ASTはどうか?という提案が出ている
  • ASTはツリーなので重たいのでBinaryにすることによって軽くする
  • いかにしてバイトコードを生成しているのか?
    • 構文木を深さ優先で探索する
  • アセンブラを書かずに実現できるDSLが用意されている
  • CodeStubAssembler
  • Hidden Class

    • V8は内部的にクラスを持っているのでより高速に安全に実行できる
  • Inline Caching

    • Java等のVMで動く言語ではメジャーなもの
    • プロパティへのアクセスを削減
    • 最適化が並列で行われている

Node.js Production Checklist

  • なぜproduction checklistが必要なのか?
  • SLAが99.9%サービスとすると、1ヶ月に26秒間のダウンタイムしか許されない
    • SLAを維持するためにどうやってエラー処理をし、ログを取るか
  • throwを再学習
  • エラーログにはboomが便利
  • async-await はthrow と try-catch と一緒に使う

  • アプリケーションのセキュリティを高める

    • npmアカウントを他要素認証を使う
    • Node Security Project
    • Security HTTP header
    • ユーザーの入力をJSON Schemaを使って検証する
  • ロギングのベストプラクティス

    • Log Levelをサポートする
    • ログレベルの定義
    • モニタリングが重要
    • どこからユーザーはアクセスしているのか?を分析、ユーザーのロケーションの近い場所からサービスを提供する
  • Incident handling

    • カスタマーをより満足させるためにハンドリングしていく
    • status page を 用意することでユーザーを安心させる
    • post-mortems
    • シフト制で3人以上が待機、さらに支援のセカンドチームが控えている

TurboFan and Ignition

  • エンタープライズやWebサイト、フロントエンドなど様々な場所で使われるJavaScriptで、最高のパフォーマンスを出すためにV8エンジンを開発している
  • v8 エンジンはオープンソース

  • パイプラインの流れは、Sourcecode , Parser, AST, Interpreter, Compiler, MachineCode

    • JIT = Just In Time Compilation
    • not ahed of time (早めに、ではなく実行時に機械語を生成する)
  • JIT Compiler → MachineCodeをくりかえす

  • Recompile hot functions
  • 時代遅れなパフォーマンスアドバンスになった
  • コードは簡潔な方がよりパフォーマンスが高まる

  • 似た処理はキャッシュする

  • 静的型付けのように見える
  • ESNext featuresを使っている
  • Ignition + TurboFan はChromeで使用され安定している
  • Node 8 以降から Ignition TurboFan
  • 読みやすいJavaScriptが最高のパフォーマンスになるようにエンジンを開発している

No REST for the weary… Introducing GraphQL

  • RESTの前にはSOAPが存在していた
    • SOAPはクライアントとサーバーが密結合していた
    • RESTはクライアントとサーバーをより分離するために開発された
  • Star Wars の GraphQL を使った(非公式)API!
  • 欲しい情報を欲しい分だけ簡単に取れる
    • 必要な情報だけなので、情報を取得するコストが適切なものになる

今さら聞けないSPAのCORS対策の話

  • スピーカーの杉浦さんの将来の夢はJavaScriptになること(!)
  • CORS は Cross Origin Resource Sharingの略
  • Origin は Scheme, Host, Port の3つから構成される
  • https://example.com:80 というURLがあった場合、 Scheme = https://, Host = example.com, Port = 80
  • Same Origin Policy: 異なるOiginでの通信を制御する
  • サーバーからレスポンスが返ってきたとしても、ブラウザ上ではブロックされてエラーとなる
  • よくわかんないけどワイルドカード、よくわかんないけどpreflight、なんとなく知ってるけど言葉にできないはNot good
  • 理解するには CORS, preflight, Ajax with credential の3つを理解する必要がある
  • User sessionを持つ場合
  • Access Token?
    • どこかでトークンの情報を持たないといけない
    • XSSで抜かれる可能性がある
    • ログイン・ログアウトの仕組みを自前で実装する必要もある
  • Cookie が無難
    • モダンブラウザであれば守る仕組みが実装されている
    • HTTPS通信下であればの話
  • Preflight Request
    • 他のオリジンにアクセスする前にPre requestをする
    • コストが2倍になってしまう
    • Preflight Requestを使わない場合はCSRFに気をつけて
    • Preflight Requestはブラウザでキャッシュすることができる
    • ブラウザによってキャッシュできる時間が違う
  • 細かな設定がしたい場合はMDNを参照

Native ES Module - something almost, but not quite entirely unlike CommonJS

  • .mjs と .jsの違いについて
  • やっとやっとES ModulesがNodeにきたぞー!
  • 似たソースコードを比較しながら違いを紹介
    • import/from文, const/require文
  • mjs は マイケル・ジャクソンスクリプトとおぼえてね!
  • CJSとMJSの相互利用もできるけど、ルールを守ろう

雑感

  • 今まで全く考えたことがなかったNode.jsの裏側(どうコンパイルされて実行していくのか)に興味を持つきっかけになりました。

    • コードとしてはきれいでも、パフォーマンスが落ちる場合があったことを知らなかったのでびっくりしました。
    • 今のv8エンジンはReadableなコードであればパフォーマンスが出るようなエンジンになっていると聞いて安心しました。
    • そうなることを実現するためにv8エンジンを開発されている方々には本当頭が下がるなと思いました。
    • v8エンジンのドキュメントも読もうと思います。
  • Graph QLはGitHubがAPIに採用したということで名前だけ知ってましたが、実際に使う場面を初めて見ることができました。

    • 必要な情報だけを取得できるというのはとても魅力的ですね。
    • 通信コストも抑えられて、情報量も抑えられて、クライアントの負荷を減らせそうです。
    • さっそく何かで試してみたいと思います。
  • CORSはちょうど聞いたことあるけど、何だかあまりわかっていない状態だったので、これもまた興味を持つきっかけにできました。

    • 確かに全然わからない時にエラーが出たらとりあえず確かにワイルドカードにしちゃいそうです。
    • きちんと理解してCORSをちゃんと設定しようと思いました。
  • MJSとCJSのお話はそもそも全く知らない部分のお話でした。

    • 普段Vue.jsを書いているので、よく使っているのがimport文の方でしたが、MJSに対応しないとピュアなNode.jsでは使えないのですね。
  • 来年はWorkShopのメンターをお手伝い出来ることを目標にNode.js練度を上げたいなと思いました。

改めてスピーカーの皆様、スタッフの皆様、東京Node学園祭に関わっている皆様、楽しい時間を有難うございました!

B!