Node.js16(Gallium)リリース記念 Node.js再入門
Node.jsの基礎とニュースについて広く浅くしゃべります
目次
Node.jsの基礎
Node.js16(Gallium)新機能
ESModules
Deno
一般的なプログラミング言語:OSの機能にアクセスできる
https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F238976%2F7f0a84bd-a324-35ab-3eb7-20b48810147a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=49ba1dedd4c32c92175ef5cdd355f80b
普通のjs:ブラウザの機能にしかアクセスできない
https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F238976%2F0127a5af-6f2e-0e26-70d9-aa52e2110d17.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=7fea848db3bf624cfbf0dab400246ab1
Node.js:JavaScriptでOSの機能にアクセスできる
https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F238976%2Fb5b4f7d6-56c0-776e-91bf-36cdc566a8f5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=a8ad463c8f2c411a1e87d83b1348c242
なぜNode.jsを使うのか
本来は、Webサーバー構築などのネットワークプログラミングを簡単にできるようにするため
C10K問題
Node.jsをベースにした機能、ツール、パッケージ等を使いたい
バンドラー、トランスパイラ、etc.
jsでモバイル/デスクトップ用アプリ/Webアプリを作りたい。
React Native、Electron
インストール/ツール周り
homebrew:mac用のパッケージマネージャ
nodenv:nodeのバージョン管理ツール(ディレクトリごとにバージョンを変えられる) Node.js
npm/yarn
各ライブラリ
偶数バージョンがLTSに移行し、名前がつく(名前は元素になっていて、v4からArgon, Boron, Carbon... と続いている)
the update of the V8 JavaScript engine to 9.0
V8:Chromeに搭載されているjsエンジンで、nodeもV8を積んでいる .indicesプロパティで正規表現のマッチしたキャプチャーグループの開始位置・終了位置を配列として取得できるようになった
code:indices.js
const matchObj = /(Java)(Script)/d.exec('JavaScript');
undefined
matchObj.indices
matchObj.indices0; // Match matchObj.indices1; // First capture group matchObj.indices2; // Second capture group prebuilt Apple Silicon binaries:M1対応
additional stable APIs.
code:これまで.mjs
import { promisify } from 'util';
const setTimeoutPromise = promisify(setTimeout);
async function run() {
console.log('start');
await setTimeoutPromise(3000);
console.log('waited 3 seconds');
}
run();
code:timers.mjs
import { setTimeout } from 'timers/promises';
async function run() {
console.log('start');
await setTimeout(3000);
console.log('waited 3 seconds');
}
run();
キャンセルはclearXXXの代わりにAbortController(webリクエストをabortするAPI:webAPIにも存在し、IE以外がサポート)を使う code: AbortController.mjs
import { setTimeout as promiseSetTimeout } from 'timers/promises';
const ac = new AbortController()
const signal = ac.signal
async function run() {
// 2秒後にabort
setTimeout(() => ac.abort(), 2000);
try {
console.time('test')
await promiseSetTimeout(5000, true, { signal })
} catch (err) {
console.timeLog('test', err)
} finally {
console.timeEnd('test');
}
}
run()
Other features
Experimental implementation of the standard Web Crypto API:各種暗号処理(鍵生成/鍵交換/鍵導出/暗号化/復号/署名/検証...)をJavaScriptで安全に実行するためのAPI npm 7 (v7.10.0 in Node.js v16.0.0)
Node-API version 8
Stable AbortController implementation based on the AbortController Web API
Stable Source Maps v3
Web platform atob (buffer.atob(data)) and btoa (buffer.btoa(data)) implementations for compatibility with legacy web platform APIs
ESModules
ESModules(=JavaScriptファイルから別のJavaScriptファイルを読み込む仕組み)基本事項
js自体には他のjsファイルを取り込む標準的な仕様がなかった
外部JSを読み込みたい時に、HTMLファイルにscriptタグを書き込むことで別ファイルを読み込む
code:scriptTag.html
<script src="js/vender/jquery.min.js"></script>
<script src="js/vender/jquery.cookie.js"></script>
<script src="js/vender/jquery.easing.1.3.js"></script>
<script src="js/common.js"></script>
<script src="js/utils.js"></script>
<script src="js/app.js"></script>
AMD, CommonJSなど様々アプローチがあり、Node.jsではCommonJS
code:commonjs.js
// モジュール側
module.exports = function() {
console.log('Hello World!!');
}
// 読み込み側
const helloWorldModule = require('./module.js');
helloWorldModule(); // Hello World!!
標準仕様としてES Modulesが登場(主要ブラウザサポート済)し、Node.jsでも順次実装、5月から全バージョンでサポート
バンドラーはいらなくなる?
パッケージマネージャーnpmで管理するJSライブラリをバンドルするにはwebpackなどのツールが必要
Vite:ノーバンドルなビルドツール:はやいらしい
Deno:ESModulesオンリー
Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.
TypeScriptを標準でサポート
ECMAScriptの最新規格への追従が早い:トップレベルawaitなど
WebAPIとの適合性が高い
Promiseとasync/awaitを非同期処理の標準として採用
プログラムが必要な権限を実行時に指定
例えばファイルへの書き込みが必要な場合は実行時に--allow-writeを、ネットワークアクセスが必要な場合は--allow-netを実行時オプションとして指定する必要があります。これにより、万一セキュリティーホールを突かれた場合でも被害を軽減できます。例えばファイルアクセスが必要ないアプリケーションであれば、セキュリティーホールを突かれてもファイルへの被害はありません。
モジュールはrequire()を廃止し、ES Modulesに統一
インポートするときは、エントリーポイントとなるファイルを直接指定
npmがない:ESModules使用。ダウンロードは実行時に行われ、結果はキャッシュされる。
またパッケージという概念がなくなり、いかなる場合でもインポートしたいファイル名をピンポイントで指定することを要求されます。標準ライブラリーすらもURLで指定する必要があります。
この変更のために既存のNPMパッケージ等はほぼ使えなくなった
https://deno.land/logo.svg
👍 Yuki Agatsuma YukiAgatsuma.icon がいいねしました on 2021/4/28