質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Babel

Babelは、JavaScriptの次世代仕様であるECMAScriptのコンパイラ。次世代の標準機能を用いて記述されたコードを、それらの機能に対応していないブラウザでも動作するコードに変換することができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

637閲覧

babelのie11変換について

susumu-99

総合スコア44

Babel

Babelは、JavaScriptの次世代仕様であるECMAScriptのコンパイラ。次世代の標準機能を用いて記述されたコードを、それらの機能に対応していないブラウザでも動作するコードに変換することができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2022/07/04 10:34

お世話になります。

本日職場のイーサネットのホームページで「タブメニュー」を作る必要があったのでHP作成のサイトを参考に作ったのですが、職場のブラウザはedgeとIE11の両方を使用しておりどちらにも対応させる必要がありました。

参考にしたサイトのJavaScriptのコードがこちらになります。

JavaScript

1'use strict'; 2 3{ 4 const menuItems = document.querySelectorAll('.menu li a'); 5 const contents = document.querySelectorAll('.content'); 6 7 menuItems.forEach(clickedItem => { 8 clickedItem.addEventListener('click', e => { 9 e.preventDefault(); 10 11 menuItems.forEach(item => { 12 item.classList.remove('active'); 13 }); 14 clickedItem.classList.add('active'); 15 16 contents.forEach(content => { 17 content.classList.remove('active'); 18 }); 19 document.getElementById(clickedItem.dataset.id).classList.add('active'); 20 }); 21 }); 22}

edgeでは問題なく動きます。
しかしながらIE11のブラウザでは全く動かないため、よくよく詳しく調べるとIE11がforEachをサポートしていないことが分かりました。
「Can I use」でもしらべました。
イメージ説明

じゃあbabelとやらにie11で使用できるコードに変換してもらおうと、初babelしてみました。
ところが、変換された結果が以下のようなコードになりました。
ie11対応のコードでもforEach使ってます。

JavaScript

1'use strict'; 2 3{ 4 var menuItems = document.querySelectorAll('.menu li a'); 5 var contents = document.querySelectorAll('.content'); 6 menuItems.forEach(function (clickedItem) { 7 clickedItem.addEventListener('click', function (e) { 8 e.preventDefault(); 9 menuItems.forEach(function (item) { 10 item.classList.remove('active'); 11 }); 12 clickedItem.classList.add('active'); 13 contents.forEach(function (content) { 14 content.classList.remove('active'); 15 }); 16 document.getElementById(clickedItem.dataset.id).classList.add('active'); 17 }); 18 }); 19}

明日、職場でこのコードを試してみますが、動く気が全くしません。
babelもIE11がforEachが使用できないことが分かっているだろうになぜこのようなコードを出してきたのでしょうか。
理由があれば教えていただきたいのと、もしかしたら私のbabelの使用方法が間違っているのかも思い質問させていただきました。
どなたか分かる方ご教授いただけませんでしょうか。

私がbabelを使用したときの画面はこちらです。

イメージ説明

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

forEachの互換はbabelではなくpolyfill(core-js)の範疇だからです。

投稿2022/07/04 11:04

RiaFeed

総合スコア2701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

susumu-99

2022/07/04 11:55

回答ありがとうございます。 babelが下位互換だとすると、polyfillは上位互換というイメージでいいのでしょうか。 forEachの入ったコードを、forEachを使用せず書くこともできるのにbabelでは変換してくれないのですか? 質問を重ねてすいません。
RiaFeed

2022/07/04 12:19 編集

babelとpolyfillは役割が違います。 babelは新しい構文を古い構文で同等の動作をするように変換するもので、 polyfillは新しくなったライブラリやメソッドや関数等を古い環境でも動くように再定義して使えるようにするものです。 今回の質問のケースの場合、forEachはNodeListクラスのメソッドであり役割としてはpolyfillが対応するべきなのでbabelはノータッチなんです。というか結局はpolyfillで再定義した結果forEachが使えるようになるので変換する必要がないとも言えます。 とはいえこれは自分なりの解釈なので厳密な話はググったほうが確実です。
susumu-99

2022/07/04 12:32

ありがとうございます。 インターネット環境でないとpolyfillが使用できないのが不便なところですね。 イーサーネットの環境で使用したかったので。 babelで元のコードからたとえばアロー関数を普通の関数に戻したり、constをvarに変えてたりするので、一般的にbabel+polyfillが必要になるのかなと思いますが、その考えであっていますでしょうか。
RiaFeed

2022/07/04 13:03

インターネット環境でないとpolyfillが使用できないってことはないんですが、 たいていwebpack使用前提なので煩雑かもしれませんね。
susumu-99

2022/07/05 10:05

丁寧な回答ありがとうございました。 おかげで本日IE11でタブメニューを作成することができました。 RiaFeedさんとmaisumakunさんのおかげです。 両方ともベストアンサーにしたいのですが、システム上できないのでより早く回答をいただいたRiaFeedさんをベストアンサーにさせていただきました。 またよろしくお願いします。
guest

0

Babelはあくまで、文法レベルの変換を行うツールです。ライブラリ関数の不足には関与しません。

投稿2022/07/04 12:04

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/07/04 12:06

> babelもIE11がforEachが使用できないことが分かっているだろうに そのような、「どのメソッドが使えるか」にまつわる判断は行いません。
susumu-99

2022/07/04 12:21

回答ありがとうございます。 そうなんですか ではbabelで変換しても必ずしも使えるコードに変換できるわけではないんですね。 ではES6をIE11に対応させるには、さきの人が回答していてくれていたようにbabelで変換したコードにpolyfillのCDNを使用するということが必要になることがあるというとうことでしょうか?
maisumakun

2022/07/04 12:27

それか、コードを書く時点でIE11に配慮して書くか、です(ものによっては、「機能性を実現することが不可能」ということもありえます)。
RiaFeed

2022/07/04 12:32

もう正直forEachだけの問題ならArrayのforEachならIEでも使えるから NodeList.prototype.forEachにArray.prototype.forEachを代入したら
susumu-99

2022/07/04 12:37

そういうものなんですね。 概略分かったように思います。 考えたらものすごく回りくどいことをする必要があるんですね。 (いったんES6をES5に落として、ES5にないものをpolyfillから補うという) 早くIEがなくなったらいいのに、と思ってしまいます。 ありがとうございました。
maisumakun

2022/07/04 23:36

厳密にいえば、NodeList#forEachはDOMに属するメソッドで、ES5やES6と言った区分とは全く無関係です。
susumu-99

2022/07/05 10:07

いつも分かりやすい回答ありがとうございます。 今回はRiaFeedさんの回答をベストアンサーにさせていただきました。 またよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問