読んで、すこしだけもやもや感がぬぐえなかったので、適当に自分が思ってる「今のJavaScriptはこんなかんじ」というのを書いた。EcmaScriptだいじなことEcmaScriptとは、プログラミング言語ではない。EcmaScriptとは、Ecmaインターナショナルが決めているJavaScriptの言語仕様のこと。略で、要は世界のコンピュータ関連の仕様を決めてる闇の組織みたいなところ。Ecma)なんでEcmaScriptとかいうものがあるのか?大昔、JavaScriptという言語はHTMLやCSSの「おまけ」扱いだった。当時のブラウザベンダ(NetScapeやIE)が自分たちの好きなようにJavaScriptを作っていたので、Webサイト開発者がサイトを開発するとき、彼らは各ブラウザの独自仕様を理解して同じような動きをするサイトを作らなければいけなかった。そこで、JavaScriptの仕様を統一しようということで、EcmaScriptという言語仕様が登場した。これの登場によって、各ブラウザベンダ間での実装がまぁまぁ同じになって、昔より格段と作りやすくなった。(マシになったというだけで、今も辛いのは変わっていない)今でも他の言語とは違ってJavaScriptでは、仕様と実装が乖離していることが多い。そのためEcmaScriptのことを意識しないと使いにくい。Pythonでは、PEPが言語仕様で、CPythonやPyPyが言語実装であり、あんまり実装や仕様のことを考えなくてもCPythonがかなり支配的なので「Pythonとはこういうもの」という理解だけでも、そんなに混乱することはない。*2一方JavaScriptでは、IE・Safari・Chrome・FirefoxでJavaScriptの動きが異なっており、日本ではそのすべてに対応しないといけないことが多いので、EcmaScriptを意識しないと「JavaScriptとはなんやねん」って感じになってしまう。EcmaScriptという言語仕様があるという概念を理解するのは、ものすごくだいじ。現在でも各JavaScriptエンジン開発者は、このEcmaScriptという言語仕様をもとにおのおののエンジンを開発している。EcmaScriptは、現在バージョン8まで仕様が決められており、これはES8とかES2017と呼ばれている。現在はES2019が策定中。IE11は2025年10月までサポートされる💢のようになっている。各ブラウザベンダは、それぞれ別々のJavaScriptエンジンを使って、開発者にJavaScriptの実行環境を提供している。https://github.com/WebKit/webkitこんな感じでまあ色々ある。前述した通りそれぞれJavaScriptの実装状況が全く違う。した状況で、自分たちが各々の実装を見極めて使える使えないを判定しなければいけない。これが大変なので、polyfill(様々なブラウザに対応するためのプラグインという概念)や、後述するBabelというトランスパイラが出現することになる。あるとき、Node(のーど)というJavaScriptの実装が登場した。それまでJavaScriptというのは、ブラウザベンダが実装するものであって、ぼくたちがターミナルでJavaScriptを触るという機会はほとんどなかった。World!のようにしてJavaScriptを実行できるようになった。これがJavaScriptのひとつの転換期で、Node全盛の時代が始まる。現在もNode全盛の時代である。Managerのことで、Nodeで動かすことを目的として作られたJavaScriptのライブラリを管理するためのツールである。npmはNodeに同梱されている。v10からはV8に依存しなくなったので、好きにエンジンを切り替えられるらしいです)JavaScriptビルド時代nodeやnpmを使用してJavaScriptの開発をするようにまで人類が成長した近代。人類は他の言語でも使われているビルドという概念を、JavaScriptに導入したのであった。それがGruntやGulpである。タスクランナーと呼ばれている。書いたコードを、製品として出すときに、インデントなどを削ったりしてコードのサイズを小さくしたりするために使われたり、JavaScriptでテストを実行するときにも使われた。現在ではnpmのpackage.jsonファイルに若干存在を食われており、あまり新規で使うことはないが、まだ使われてはいる。.pipe(gulp.dest('./build/js'))});トランスパイルして古いバージョンはどんどん殺していく現代あらゆるソフトウェアで、バージョン違い、つまり後方互換性とはものすごくめんどくさい問題だった。サービスが広まれば広まるほど、古いバージョンを使っている人の数が増えるので、これまでは「古いバージョンをどうサポートするか」ということに主眼が置かれていた。現在ではアップデートは自動で行われるようになり、それでもアップデートしないやつはもう知らん、という方針を人類が選択したことで、開発者が新機能を使って開発することができるようになった。OS周りでその動きが顕著である。JavaScriptでは、IEのサポート終了期間が長すぎるので、気軽に自動でJavaScriptをアップデートとかできなかった。そこで誰かが「古い言語仕様にしか対応してないブラウザに対応せざるを得ないなら、新しい言語仕様で書かれたコードを、古い言語仕様のコードに変換すればよくね?」という天才の発想を思いつき、それをトランスパイルという。このトランスパイルするやつの1つがBabel。BabelはおもにES6(ES2015)のJavaScriptをES5仕様のJavaScriptに変換する。新しい言語仕様の実装を使いたい場合はpresetというのを含めると良い。Babel)などで、クロスブラウザ問題(ブラウザ間のJavaScriptの実装の違いの問題)を解決する。ついてNodeはもともとサーバーサイドでもJavaScript使おうぜという発想で作られたものだった。npmは、サーバーサイドで使うJavaScriptライブラリを格納するためのものだった。いわゆるパッケージマネージャ。bowerは、npmがサーバーサイドのものなんだから、こっちはクライアントサイドのものを入れようぜという思想のもと作られたパッケージマネージャであった。