JavaScriptの実行環境についての現状の理解
JavaScriptの実行環境についての現状の理解
現状の理解を整理する。
実行環境が色々ある。 例えば、
- Webブラウザ
- Node.js
など。初めのころは全く区別がついていなかった。似て非なるようなもの。JavaScriptエンジンがどうこうは気にしないことにする。
Webブラウザ上のJavaScript
Webページの動的処理のためのもので、DOM操作ができる。そのためのAPIがあらかじめ用意されている。ただし、ブラウザの種類によって差がある。サンドボックスなのでWebブラウザの外側に自発的には干渉できない。例えばJavaScriptでファイルのダウンロードをしたい場合にはユーザーの操作が必須となる。様々なWebアプリケーションの需要によって音声や動画を扱ったり、デバイスのカメラやマイクを扱うようなAPIが追加されていたりする。この話題はどちらかというとWebブラウザの話になる?Webブラウザ上で使えるAPIについては「JavaScript | MDN」を参照。
ESほにゃらら、という形で仕様が決まっていて、新しい機能?構文?が増えている(const, let での変数宣言やPromise, class構文など)。WebブラウザがES何某に対応していれば新しい機能が使える。JavaScriptで何かを書くときにすべてのWebブラウザに対応させようとすると、それぞれのWebブラウザがどの仕様に対応しているかを調べなくてはいけない。そして一番古い仕様に合わせる他なくなって結局新しい機能が使えなかったりする。(例:Internet Explorerはconst, letが使えない。)ただし、この点については回避策があり新しい機能や構文を使う方法がある。Babelを参照「What is Babel? · Babel」。Promiseならポリフィルで対応できる(らしい)が、Webブラウザそのものの機能(例えば?)が足りない場合にはBabelを使っても対応できない。
ES Modulesに従ったモジュール機能があるが、例によってWebブラウザの対応状況が違うのでBabelのトランスパイルだかコンパイルをせずに使う状況にはまだなってないと思われる。
ES Modules
import MyModule from './MyModule.js'
windowオブジェクトがある。constまたはletを使わずにグローバルに宣言した変数はwindowオブジェクトのプロパティになる。
Node.jsで動かすJavaScript
Webサーバーのためのもの(らしい)。ElectronのMain Processの実行環境でもある。OSのコンソール上でJavaScriptを実行するような使い方ができる。サンドボックスではなくOS機能に容易にアクセスできる。例えばファイルの読み書きをするためのAPIが存在している点がWebブラウザ上のJavaScriptとは大きく異なる。Node.js上で使えるAPIについてはリンク先「ドキュメント | Node.js」のAPIリファレンスを参照。
CommonJSに従ったモジュール機能がある。
CommonJS
const fs = require('fs')
Node.jsもES Modulesに対応しつつある。(もうした?)
windowオブジェクトがない。globalオブジェクトとglobalThisオブジェクトがある。