モダンなJavaScript講座①

*こちらの動画を参考にさせていただきました

①JavaScriptの歴史

JavaScriptの誕生
・JavaScripthは1995年
・Netscapeの技術者ブレンダン・アイク作
・Netscape Navigator2.0に実装された

JavaScriptの豆知識
JavaScriptという名前だったが、サン・マイクロシステムのプログラミング言語Javaが当時大きな注目を浴びており、Netscapeが業務提携していたこともあったため、JavaScriptに変更された

ECMAScriptの誕生
NetscapeはJavaScriptを国際的な標準化団体EcmaInternationalに提出しました。その結果1997年6月にECMAScriptという標準の第1版が公開された。1998年に第2版、1999年に第3版が公開されている

ECMAScriptの豆知識
2015年に第6版が公開され、そのリリースからは年号が使われるようになった。そのため、ES6の表記は間違っており、正解はES2015である。また、2015年から仕様策定プロセスが変更され、毎年リリースする形になっている。

ECMAScriptって?
JavaScriptの中核となる言語仕様のこと

JavaScriptの環境
例えば、Node.jsが分かりやすいが、ブラウザ上のJavaScriptには存在したUIを操作するための機能がNode.jsにはない

ECMAScriptとJavaScript
ECMAScriptはどの環境でも共通な動作のみが定義されている。Node.jsやブラウザの違いなどを意識せずにECMAScriptで開発することができる(実際は実装速度に差があるためコンパイルor気をつける必要がある)

コンパイル・・・あるプログラミング言語を他のプログラミング言語に変えること

Server Side JavaScriptの動き
2009年1月、MoじぁのエンジニアKevin DanKevin DangoorがServerJSというプロジェクトを立ち上げた。しかし、サーバーサイドで使うにはいろんなAPIが不足していた。ServerJSの実現にはいろんなAPIを作る必要がある。

ServerJSからCommonJSへの改名
2009年からより広い範囲のAPIを対象とすることを示すために、現在のCommonJSへと改名された。

モジュールAPIについて
CommonJSでいろんなAPI仕様が作られていくが、特にフロントエンド開発にも大きく影響するモジュールに焦点を絞って解説する

モジュールとは

モジュールはただのファイルです。1つのスクリプトは1つのモジュールです。モジュールは相互に読み込んだり、exportとImportを使用してやり取りしたり、あるモジュールの関数を別のモジュールから呼び出したりすることができる。

JavaScriptの問題点をストーリーで理解する

ここに一つのindex.jsがあります。

//index.js
// ...数千行のJavaScriptコード

数千行は見にくい→エンジニアはファイルを分けることに

一つのindex.jsのファイルを三つにわけました。

//a.js
//...数百行のJavaScriptコード
//a.js
//...数百行のJavaScriptコード
//c.js
//...数百行のJavaScriptコード

HTMLも3つのJSファイルを読み込みます

<script src="./a.js"></script>
<script src="./b.js"></script>
<script src="./c.js"></script>

すぐにバグが、、、

例えば中でこのような処理を書いてしまいました

//a.js
var foo = 123;
//b.js
var foo = "foo";
//c.js
foo *10;//NaN

a→b→cの順に読み込まれるので変数fooは上書きされてしまいます

<script src="./a.js"></script>
<script src="./b.js"></script>
<script src="./c.js"></script>

JavaScriptは名前空間が1つしかない
命名が被る、、、JavaScriptつらい

今度はa.jsのコードを変更するとバグが発生してしまいました
aのコードを下にb,cは作られていたためバグが発生してしまった

<script src="./a.js"></script>
<script src="./b.js"></script>
<script src="./c.js"></script>

依存関係はとても怖いもの

jQueryでよく見る光景で下記コードも順番を変えたらバクります

<!--- jQuery UIは作られている -->
<script src="./jquery"></script>
<script src="./jquery-ui.js"></script>

↑ JavaScriptで起きていた実際に問題

・どうすれば解決できたのか
名前空間、依存関係の2つの問題が出てきた
名前空間はモジュールが解決
依存関係はパッケージ管理(npm)で解決

モジュール

モジュールがあると例えばこう

//a.js
var foo = 123;
module.exports = foo;
//b.js
var foo = "foo"; //よそのfooは気にしない
//c.js
var foo = require("./a")
console.log(foo): //123

・スコープについて
モジュールにはスコープの概念がある。JavaScriptのモジュールは1ファイル単位で、ファイル内の変数や関数は外部に影響を及ぼさない。

あくまでCommonJSの話
今の話はあくまでCommonJSの話で、ブラウザのJavaScriptで使うことはできない。ブラウザのJavaScriptはずっと名前空間は一つでモジュールが使えないので問題は依然として残る。

次回はパッケージ管理(npm)について!

この記事が気に入ったらサポートをしてみませんか?