2021年にJavaScriptやNode.jsを勉強し始めたので、読んで良かった資料をまとめる
2021年になってJavaScript、TypeScript、Node.jsの勉強を始めました。
この記事では、読んで良かった本、記事、公式ドキュメントなどをまとめていきます。
※2021/03時点の情報です。
個人的なリンク集ですが、「これも読むと良いよ」というものがあればぜひ教えてください。
ECMAScript
- ECMAScriptの仕様は、EcmaのTC39で策定されている
- ep78 TC39 | mozaic.fm
- Node.jsの各バージョンでのECMAScriptサポート状況
JavaScript
- Misreading Chat - #86: JavaScript: the first 20 years
- JavaScript 二十年の歴史についての回
- JavaScript チュートリアル | MDN
- JavaScript Primer
これからJavaScriptを学びたい人が、ECMAScript 2015以降をベースにして一からJavaScriptを学べる書籍です。
- リファクタリング(第2版)
- 第2版では、サンプルコードがJavaからJavaScriptで書き換えられています
- ブラウザごとのAPI対応状況
TypeScript
Prettier/ESLint
Node.js
- 公式サイト
- https://nodejs.org
- リリースノート
- 各バージョンのサポート期間
- Dependencies
- Node.jsはいくつかのライブラリ(V8,libuv,OpenSSL,zlibなど)を使って実装されている
- https://nodejs.dev
- このサイトのソースは、https://github.com/nodejs/nodejs.dev
Nodejs.dev site built using Gatsby.js with React.js, TypeScript, SCSS, and Remark.
- How much JavaScript do you need to know to use Node.js?
- Differences between Node.js and the Browser
- このサイトのソースは、https://github.com/nodejs/nodejs.dev
- https://nodejs.org
- Node.js Version Manager
- Node.js Version Managerはいくつか存在しますが、GitHubスター数的にもGoogleトレンド的にも、nvm が一番人気があるようです
- https://nodejs.dev でも nvm を使ったインストール方法が紹介されています
- 公式Docker image
- Udemy - Node JS: Advanced Concepts
- イベントループ
- Promise/async/await
- 非同期関数 - JavaScript | MDN
- JavaScript Promiseの本
- Node.jsデザインパターン 第2版 の
4章 ES2015以降の機能を使った非同期パターン
- ストリーム
- Node.js 公式ドキュメント
- Node.jsデザインパターン 第2版 の
5章 ストリーム
- プロファイリング
- pprof を使って nodejs アプリケーションのプロファイルを取る
- Flame Graph便利ですよね
- pprof を使って nodejs アプリケーションのプロファイルを取る
- ヒープダンプ
- パフォーマンスチューニング
- メトリクス
V8
V8は、インタプリタ(Ignition)、JITコンパイラ(TurboFan)、ガベージコレクタ(Orinoco)の機能を持っています。
- Google Developers Blog - Chrome がスピードにかけた 10 年間
- 公式サイト
- Docs
- Ignition
- TurboFan
- Orinoco
- Debugging
- Using d8
d8 is V8’s own developer shell.
- メモリリークの調査や、JITコンパイルされた結果をアセンブリ言語で確認したい時は、V8を自分でコンパイルして使うと便利
- v8_enable_disassembler = true: 逆アセンブラを有効
- v8_enable_object_print = true: verbose output
- V8 JavaScript Engine: Compiling with GN and Ninja
- Twitterで見つけた情報
自分で試してみたけど差はなかったAnswer: 所謂境界値チェックですね。 forを1000000回回して配列にアクセスするというコードを書いた場合、v8は添字のアクセスが、配列の外にアクセスする可能性を排除できないため、毎回境界値チェックが走ります。arr.length以下に必ず保証されていれば境界値チェックは不要ですね。 #jsconfjp pic.twitter.com/RjzmKZIytq
— Yosuke Furukawa (@yosuke_furukawa) December 11, 2019使ったv8はソースからコンパイルした最新の9.1.0 candidate。
— Matsuzaki (@matsumana) February 27, 2021
結果、それぞれの処理時間に差はなかった。v8のJITコンパイラが改善されているって事なのかな?
JITコンパイルされたものをdisassembleして見比べてみたけどアセンブラわからない。。https://t.co/VJDCD4XOas
- Building V8 from source
- Checking out the V8 source code
- Investigating memory leaks
- Using d8
- Blog
- Faster JavaScript calls
- V8はmulti-tierなVM
- 最初のtierはIgnitionと呼ばれ、アキュムレータ・レジスタを持つバイトコード・スタック・マシン
- まず、Ignitionがソースコードをバイトコードにコンパイルする
- TurboFanは、Hotなコード(頻繁に呼ばれるコード)をJITコンパイルする
- The cost of JavaScript in 2019
- Faster JavaScript calls
- Tools
- Turbolizer
Turbolizer is a HTML-based tool that visualizes optimized code along the various phases of Turbofan's optimization pipeline, allowing easy navigation between source code, Turbofan IR graphs, scheduled IR nodes and generated assembly code.
- Turbolizer
- Docs
- GC
- メモリ管理 - JavaScript | MDN
- V8のGCのソースは この辺り から読むと良さそう
- A tour of V8: full compiler
- A tour of V8: Garbage Collection
- V8のGCは世代別GCで、アルゴリズムはMark and Sweep
- Calculating 1 + 1 in JavaScript — Part 1
- Calculating 1 + 1 in JavaScript — Part 2
- Calculating 1 + 1 in JavaScript — Part 3
libuv
JavaScript/TypeScript界隈のトレンド
- JavaScript情報の情報源となっているサイトの一覧を作った
- JSer.info 10周年: JavaScript情報の集め方、書き方、まとめ方
- Web 技術の調査方法 | blog.jxck.io
- 2020 JavaScript Rising Stars
- 2020年に増えたGitHubスター数に基づくランキング
the numbers which projects got traction in 2020, by comparing the numbers of stars added on GitHub, over the last 12 months.
- 2020年に増えたGitHubスター数に基づくランキング
- State of JavaScript 2020:いちばん利用率の高いJSフレームワーク、フロントエンドがReact、バックエンドはExpress、テストにはJest。2万4000人の調査結果