背景
- Node.js v20が10/24にLTSになる為
目次
- そもそもNode.jsとは
- Node.jsのMajor番号とリリーススケジュール
- Node.js v20の主なChangeLog
- その他参考
- 感想
1. そもそもNode.jsとは
Node.js® is an open-source, cross-platform JavaScript runtime environment.
クロスプラットフォームな非同期イベント駆動なJavaScript実行環境
-
非同期イベント駆動 = 非同期駆動 + イベント駆動 とは
As an asynchronous event-driven
非同期:コードを書くときに、すべての行が実行される正確な順序を予測しようとしないこと
イベント駆動:ネットワークリクエストのような特定のイベントに反応して呼び出される小さな関数の集まりとしてコードを記述
Introduction: What is NodeJS?以下ソースで動作確認します。
https://github.com/yamatai12/node-asynchronous-event-driven-sample環境構築
ローカル環境を汚さないし、環境構築なしですぐに検証できるのでDockerコンテナ内で開発します
【図解】Dockerの全体像を理解する -前編-Dockerfile
https://hub.docker.com/_/node/
-
node image
node imageには様々な種類があり、それぞれが特定の用途向けに設計されています。Image Variants
The node images come in many flavors, each designed for a specific use case.-
image verions
ltsを使う
node:<version>
-
image tags
Debian DistributionのCurrent LTSのbusterを採用
node:lts-<tags>
debian LTS time table from June 17, 2023
Choosing the best Node.js Docker image
How to Use the Node Docker Official Image- bookworm,buster,bullseye
- Debianのversionのコードネーム
- alpine
- Node.jsの公式サポートではない
- 超軽量、主要なパッケージが不足している場合がある
The Node.js Docker team doesn’t officially support container image builds based on Alpine.
- hydrogen
LTSのコードネーム(Nodejsのリリース一覧のLTSにHydrogenとありますが、これはなんでしょうか?)
LTSとHydrogenがNodeのimageで別で書かれてるのが分からないので次回調べたいと思います。。
- bookworm,buster,bullseye
-
image variant
node:lts-buster-<variant>
slimを採用- Docker image上のソフトウェアのフットプリントを小さくし、潜在的な脆弱性のベクトルを減らし、サイズを小さくすることで、イメージのビルドプロセスを高速化する(10-best-practices-to-containerize-nodejs-web-applications-with-docker)
- slimが用意されているのは、公式バージョンとDebian系(3-slim, 3.0-slim, 3.0.1-slim, bullseye-slim, buster-slim)
DockerfileFROM node:lts-buster-slim WORKDIR /app
docker-compose.yml
docker-compose.ymlservices: app: build: context: . dockerfile: Dockerfile volumes: - ./app:/app command: sh -c "node --version"
-
-
-
asynchronous-event-driven.js
index.jsconsole.log("start asynchronous-event-driven"); const fs = require('fs'); fs.readFile("sample.txt", "utf-8", function(err, data){ if (err) throw err; console.log("File Read Successful!!"); console.log(data); }); console.log("end asynchronous-event-driven");
sample.txt
sample.txtFile contents
index.jsの実行
terminaldocker-compose run --rm app /bin/sh -c "node asynchronous-event-driven.js" start asynchronous-event-driven end asynchronous-event-driven File Read Successful!! File contents
コンソールへの出力を確認すると,ファイル読み込みが飛ばされている。
これは「ファイルの読み出しが可能になった」というイベントの発生をトリガーにコールバック関数が実行される為、出力が前後している。
一見すると複雑にしているように見えるが,このおかげで,大量のアクセスを処理することができる。
非同期的/ノンブロッキング的な動きをしている。- ブロッキング
Node.js プロセス内の後続のJavaScriptの実行が、JavaScript以外の操作(I/O:入出力処理,c言語で書かれてるlibuv)が完了するまで待たなればならないこと(ブロッキングとノンブロッキングの概要)
(https://tamotech.blog/wp-content/uploads/2020/07/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2020-07-14-16.58.39-1024x866.png)
こちら参考に厳密な仕組みについて勉強しておきます。。
Node.jsでのイベントループの仕組みとタイマーについて
- ブロッキング
-
フロントエンドのイベント
window,documentが対象
例)JavaScriptでaddEventListenerを使って、マウスクリックやキーボード押下などのユーザーアクションを待つ等 -
Node.jsのイベント ネットワーク・リクエストやデータベース・クエリ
参考
2. Node.jsのMajor番号とリリーススケジュール
本番アプリケーションのMajor番号は偶数にするべき
奇数:半年後→サポートされない
偶数:半年後→Active LTS
(long-term support 長期サポート、重大なバグ修正)ステータスに移行
Major Node.js versions enter Current release status for six months, which gives library authors time to add support for them. After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to Active LTS status and are ready for general use.
LTS release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. Production applications should only use Active LTS or Maintenance LTS releases.
3. Node.js v20の主なChangeLog
-
Test Runner
jest等のテスティングライブラリほどの機能はないが徐々に機能が追加されている -
V8 JavaScriptエンジンの新しいバージョン(バージョン11.3)
-
String.prototype.isWellFormedとtoWellFormed
- JavaScriptの文字列はUTF-16でエンコードされている。
カスタム実装の必要なく、文字列がUTF-16かどうかを調べることができる。
また、isWellFormed()はV8エンジン(Node.jsは内部的にGoogle V8 JavaScriptエンジンを使ってコードを実行)が文字列の内部表現に直接アクセスするのでより効率的。
MDN String.prototype.isWellFormed()
- JavaScriptの文字列はUTF-16でエンコードされている。
-
ArrayとTypedArrayのコピーメソッド
- toSorted、toReversed、toSpliced、with メソッドにより、配列のデータを変更せずに、コピーを作成してそのコピーを変更
ES2023 introduces new array copying methods to JavaScript
- toSorted、toReversed、toSpliced、with メソッドにより、配列のデータを変更せずに、コピーを作成してそのコピーを変更
-
ArrayBufferとSharedArrayBufferがサイズ変更可能になった
-
The ArrayBuffer object is used to represent a generic raw binary data buffer. It is an array of bytes, often referred to in other languages as a "byte array".
JavaScriptでバイナリデータを扱ってみる
用途について理解したいと思った。。勉強します。
-
-
set記法+文字列プロパティを持つRegExp vフラグ
以下にまとめました。
正規表現 vフラグ -
WebAssembly Tail Call
WebAssemblyとはWebAssembly (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications.
いまいち分からないのでこちらを見てみると
WebAssemblyとは?できること・できないこと・使い方をわかりやすく解説
Webブラウザ、サーパアプリケーションでコンパイルされたC/C++やRustを実行する仕組み(アセンブラ)を指すもの
こちらも勉強しておきます。。
(https://staff.persol-xtech.co.jp/hatalabo/wp-content/uploads/2023/02/it641_01.webp)
-
参考
- Node.js 20: New Features, Updates, and Improvements
- Node.js v20の新機能(テストランナー、Permission Model、SEA、V8 JS Engine 11.3)
- 別にしんどくないブログ
- Node.js v20 から使える ECMAScript の新機能
4.その他参考
5.感想
- まだNode.jsの仕組みがわかってない(イベントループ等)ので勉強しないといけない。
- Node.jsのソースを見るとcだったり、pythonだったり色んな言語で書かれていて興味深かった。いつかissue起票したり、discussionに参加したい。
https://github.com/nodejs/node#:~:text=%2B%203%2C275%20contributors-,Languages,-JavaScript
- WebAssembyについても勉強したい。
参考になる記事を書いてくださった皆様ありがとうございました!
宣伝させてください!