2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

パーソンリンクAdvent Calendar 2022

Day 4

BABELプラグインについて調べてみた

Posted at

今までフロントエンドの開発をしたことがなかったので、個人的に学習をしようと始めました。
その中でBABELというコンパイラの存在を知ったので自分のためのメモ・これからフロントエンドエンジニアを目指す人のために記録として残しておこうと思います。

コンパイラとは

そもそもコンパイラについて理解していない人向け

コンパイラとはjsで我々にもわかるように書かれているソースコードを機械が処理を実行するための機械語に翻訳してくれる機能のことを言います。

Babelが行ってくれる処理

コンパイラについて理解したら次はBabelがどのような処理をしているのかを理解します
babelは最新のJavascriptで書かれたコードを古いJavascriptに変換するツールチェーンです
これによりまだ最新のjavascriptをサポートしていないブラウザでも実行することが可能になります。

Babelは基本的に以下の処理を実行しています
・ECMAScript の最新文法をブラウザがサポートする記述に変換する
・実行環境に足りない機能の Polyfill を提供する
・ソースコードの変換を行う

聞きなれない単語があるのでそれを踏まえて解説します

ECMAScript の最新文法をブラウザがサポートする記述に変換する

ECMAスクリプトとは

そもそもJavascriptはNetscape社のブラウザで処理が実行できるように作られた言語でした。
なので、普段皆さんが使用しているGoogleやfireFoxなどのブラウザでは実行がきませんでした。そこで国際標準化団体のECMAに全てのブラウザでも使用できるjsを作るように依頼してできたのがECMAScriptです(最新はES6)

つまり、Babelがやってくれている処理1つ目は全てのブラウザでjsが実行できるようにしてくれるということですね

実行環境に足りない機能の Polyfill を提供する

Polyfillとは

先ほど説明したECMAScriptはあくまで全てのブラウザで共通して使用できるようにしたものなので、Javascriptのすべての関数を網羅しているわけではありません。
そこで、不足している関数やライブラリを代替してくれるのがこのPolyfillになります。

つまり、完全にブラウザでJavascriptが実行できる環境を構築してくれるのがPolyfillということですね

ソースコードの変換を行う

最後にソースコードの変換を行ってくれるとありますが、これはBabelはもともとコンパイラということもあるのでコンパイルをしてくれるということです(そのままですね)

Babelの処理内容

では実際にどのようにして処理が行われているのか

まず初めに簡単に説明すると
   @babel/parser (コード解析)
        ↓
       AST変換
        ↓
  @babel/generator (コード生成)
という流れで処理が実行されていきます

babelで使用されているツール

babelの処理を理解するには避けては通れないツール理解です
最低限の解説なので、詳細については他の記事に任せます

AST

そもそもASTという言葉が聞きなれない方のための説明です
Babel以外にもESLingなどでも使用されています

これはソースコードを構造体で表現したものです

言葉で説明するとわかりにくいで実際に見た方が早いと思うのでサンプルを載せておきます

const a = 1

     ↓ (AST化)

{
  "type": "Program",
  "start": 0,
  "end": 12,
  "body": [
    {
      "type": "VariableDeclaration",
      "start": 0,
      "end": 11,
      "declarations": [
        {
          "type": "VariableDeclarator",
          "start": 6,
          "end": 11,
          "id": {
            "type": "Identifier",
            "start": 6,
            "end": 7,
            "name": "a"
          },
          "init": {
            "type": "Literal",
            "start": 10,
            "end": 11,
            "value": 1,
            "raw": "1"
          }
        }
      ],
      "kind": "const"
    }
  ],
  "sourceType": "module"
}

このほかにもどのように変換されるのか気になる方は以下のサイトで確認することができるので、興味のある人は遊んでみてください!

@babel/core

babel/coreはbabelが処理を実行するための関数群を提供するAPIになります
なので、このbabel/coreと連携しながら他のツールが処理を行います

これを一番最初にインストールしないと、他のbabelツールのバージョンが古くなったりするらしいので注意が必要らしいです

@babel/preset

babelにどのような変換処理をさせたいかを設定することができるコレクションに当たるのが@babel/presetです

設定方法としては.babelrcに設定を書いていきます

{
 "presets": ["@babel/preset-env(3番目)", "@babel/preset-react(2番目)", "@babel/preset-typescript(1番目)"]
}

このようにプラグインを指定して配列の後ろから順番に変換処理がされていきます
ここでの簡単な処理の流れとして
@babel/presetでどのプラグインを使用して変換を行うか確認
            ↓
AST変換を行い指定したプラグインに変換をさせる(プラグインはASTでしか変換ができないため)

という感じ

さらにこの段階で@babel/preset-envで変換したいECMAScriptバージョンを指定します

例)
Chrome40以上・iOS10以上をサポート対象

package.jsonに記述
~~ 省略
"babel" : {
  "presets": [
    ["@babel/preset-env", {
        "targets": [
          "chrome 40",
          "iOS 10"
        ]
      }
    ]
  ]
}

先ほども説明したようにECMAScriptでカバーしきれない関数などはPolyfillをインストールしてカバーします

@babel/generator

最後になりますが、これはbabel/presetで指定したプラグインがASTを受け取り変換処理が完了した後にASTで結果を返してくれます
その帰ってきたASTをコードに直してくれるのがこの@babel/generatorです

最後に

簡単ではありましたがこれがbabelが行っている処理になります。

また、今回presetについてめっちゃ簡単に説明しましたが正直presetがbabelの一番重要なことなので、今回の記事で概要を把握できた方は次はどういうpresetがあるのか調べるのもいいかもしれないですね!

初めてこのような記事を書いたので何かアドバイスをいただけると嬉しいです!

また、弊社株式会社パーソンリンクではエンジニアを募集中です。ご応募お待ちしております!

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?