INDEX
開く ▼

JavaScript学習:実行環境編|ブラウザ上の実行と非ブラウザ上の実行で何が変わる?

Learning Javascript Exec Env 8cvjkfqr8u

JavaScriptは実行する環境によって使える機能が異なってきますが、そんな話の中でも誰もが触れるであろう「JavaScriptをブラウザ上で実行した時と非ブラウザ上(Node.js環境など)で実行した時で何が変わるか」という話を簡単に整理してみます。

【前提知識】ブラウザとJavaScriptの関係

まずブラウザは、クライアントの要求する情報を提供するために、下記のような様々なコンポーネントを活用しています。

参照元:ブラウザの仕組み: 最新ウェブブラウザの内部構造|web.dev|記事公開日が2011年8月5日なので古いソースな可能性があります

上記の中のJavaScriptエンジンを扱って、JavaScriptコードの解析と実行を行っていて、ECMAScriptの仕様に則ったJavaScriptのプログラムが扱えたり、DOM APIやFetch APIといったWeb上の様々な操作ができる「Web APIs」が提供され活用できるようになっています。

【補足】実行するブラウザによっても挙動に変化がある

先ほど、ブラウザはJavaScriptエンジンを使ってJavaScriptを実行していると書きましたが、そもそもブラウザによって扱うJavaScriptエンジンが異なっています。

ブラウザ JavaScriptエンジン
Chrome V8
Safari JavaScriptCore
Firefox SpiderMonkey
Edge Chakra / V8
Opera V8

参照元:JavaScriptエンジン|Wikipedia

Chrome / Edge / OperaはV8で動きますが、SafariやFirefoxは扱っているエンジンが異なります。例えば、letの変数制限でもコンテキストによっては、V8ならundefinedになるところSpiderMonkey(Firefox)ではuninitializedとなりエラーを吐く挙動になったります。

まとめ

JavaScriptをブラウザ上で実行するときは、ブラウザが提供しているコンポーネントの内、JavaScriptエンジンを使ってJavaScriptの解析と実行を行っており、その中でECMAScriptに則った機能を扱ったり、Web APIsを活用できたりします。

そして、そのJavaScriptエンジンはブラウザ毎で異なり、別のエンジンを使っているからこその微妙な挙動の違いが出てきます。なので、ES5以前の記述にトランスパイルしたのにブラウザ毎で挙動が異なる場合は、そのブラウザが扱うJavaScriptエンジンの仕様を辿るのが良いでしょう。

【前提知識】Node.js(非ブラウザ環境)とJavaScriptの関係

続いて、Node.jsなどの非ブラウザ環境でJavaScriptを動かすと何が変わってくるのか。まず初めに、Node.jsもV8エンジンを扱ってプログラムの解析と実行を行っており、ブラウザの時と同様ECMAScript仕様のJavaScriptの記述が可能です。

ここで一度、ブラウザ環境と非ブラウザ環境とで扱える機能の違いを簡単に整理しておきます。

実行環境 扱える機能
ブラウザ ECMAScript仕様のJavaScript、Web APIs、ESModules、など
非ブラウザ ECMAScript仕様のJavaScript、CommonJS(モジュールシステム)、など

当然ですが、Web APIsはあくまでもブラウザ側から提供されているAPIなので、Node.jsでは扱えませんし、逆にCommonJSというモジュールシステムは、Node.jsから提供されているシステムなので、ブラウザ上では扱えません。

エンジニアになって1ヶ月の頃に、ブラウザにアップロードするJavaScriptファイル上に、Node.jsで扱うfsを書いて呆れられた恥ずかしい記憶は頑張って忘れます...笑

【補足】ESModules・CommonJS、モジュールシステムの話

この辺りの話でよく出てくる話が、ESModules・CommonJSとの違い。まずESModulesとは、ES6(2015版)で新たにリリースされたJavaScriptのモジュールシステムです。簡単なモジュールの定義・インポート・実行の例を書いてみます。

const iModule = function () {console.log()};

export { iModule };
import { iModule } from './module.mjs';
iModule();

次にCommonJSとは、Node.jsが採用しているソフトウェア側でJavaScriptを動かすために必要だったモジュールシステムです。こちらも、簡単なモジュールの定義・インポート・実行の例を書いてみます。

引用元:common.js と ECMAScript の違いについて

module.exports = {
  iModule: function () {console.log()}
};
const { iModule } = require('./module.mjs');
iModule();

CommonJSはNode.jsが使っているモジュールシステムなので、当然ブラウザ上では動かす事ができないのですが、Node.jsはECMAScriptの仕様に則ってJavaScriptを解析・実行するため、ESModulesも扱う事ができます。そんな中で、2つのモジュールシステムが混在している問題やどっちを使うの?といった話なんかもあります。もし興味ある人は調べてみると良いかと...!

まとめ

かなりザックリとした内容でしたが、基本的なところは抑えられたので復習がてらまとめてみました!サーバーサイド開発としては、モジュールシステムの適切な扱い方・管理方法などは、重要なトピックになってくるかと思います!

References

スキルアップ転職を目指すなら「エンジニア特化型転職エージェント」を活用しよう

もし下記のような悩みがあれば、スキルアップを目的とした転職をするのもひとつの手段です。

・モダンな環境での経験が積みたい...
・実際に働いてみてもっと取り組みたい案件が明確になった
・学習をしているが先が見えずこのまま1人でスキルアップするのは辛い...
・今の職場ではなかなか理想の案件にアサインしてもらえない...

レバテックキャリアやユニゾンキャリアといったエンジニアに特化した転職エージェントであれば、初回面談でまずは現状の悩みを聞いてくれたり丁寧にヒアリングをしてくれます。

さらに、プロのキャリアアドバイザーが企業個別の技術質問・頻出質問の対策、模擬面接でのサポート、ES対策、企業分析・自己分析、求人の紹介など、あなたの転職を徹底サポートしてくれて...下記のどの状況の人でもメリットがあるので、まだ使っていない人は無料相談から進めておきましょう。

シチュエーション メリット
既に採用面接を控えている人 模擬面接や面接企業の分析をしてくれる
応募先企業の固有の
質問を気にしている人
応募先企業の頻出質問や気にしていることなど、企業ごとの対策をしてくれる
応募企業がまだ少ない人 応募したい企業をヒアリングしてくれ、ベストな求人をピックアップしてくれる
転職に自信がない人 転職理由や希望条件をヒアリングの上、ベストな応募企業や採用面接のコツをレクチャーしてくれる

IT・Web業界のエンジニア転職に強いエージェントがおすすめ。筆者や同僚も実際に活用していたエージェントをまとめておきます。

現役がおすすめするIT・Webエンジニア特化型の転職エージェント

IT・WEB・ソーシャルゲーム業界への転職ならGEEKLY
The Service Aid Your Career.
ボタンをクリックして無料の転職相談から始めよう!
IT・Web業界での転職なら【レバテックキャリア】
The Service Aid Your Career.
ボタンをクリックして無料の転職相談から始めよう!
IT・Web・ゲーム業界特化の転職エージェント【ユニゾンキャリア】
The Service Aid Your Career.
ボタンをクリックして無料の転職相談から始めよう!
ITエンジニア就職に特化した【ウズカレIT】
The Service Aid Your Career.
未経験ITエンジニアの就職サポートに特化したサービスに無料相談しよう!