Babel 7についての紹介
6848 ワード
一、Babelの紹介
Babelは、ECMAScript 2015+バージョンのコードを後方互換性のあるjavaScript文法に変換するためのツールチェーンであり、現在および古いバージョンのブラウザまたは他の環境で動作することができる.babel 7の重要な構成部分@babel/cli @babel/core @babel/presete-env @babel/polyfill @babel/runtime @babel/plugin-transform-runtime @babel/plugin-transform-xxx これらは私達がこれからよく使うbabelの各重要な部分です.ここで注意してください.これはbabel 7ならではのものです.次は適当にプロジェクトを建てます.例えばindex.jsの中にコードを書きます.
二、@babel/cliと@babel/core
@babel/cliはBabelが提供する内部建設のコマンドラインツールで、主にbabelというコマンドを提供してjsファイルをコンパイルして、プロジェクトにインストールするのに適しています.ただnpm install@babel/cliだけでbabel index.jsを実行するのは成功しません.Babelのコア機能は@babel/coreモジュールに含まれているからです.だから@babel/coreをインストールして実行します.
三、@babel/preset-env
本当にBabelを実際に動作させるのはプラグインです.上記のコードを例にして、矢印関数を変換したいです.プラグインが必要です.コマンドラインを入力します.
私たちはbabelrcのプロファイルに以下のような構成をしています.
四、@babel/polyfill
私たちはindex.jsのコードを次のように変更します.
名前の通り、polyfillの中国語の意味はスペーサーです.スペーサーというのはバーンとは違ったブラウザや異なる環境の下での違いです.新しい内蔵関数や実例の方法などを低バージョンのブラウザでも使えます.
まず@babel/polyfill依存をインストールします.
そこで私たちは.babelrcの配置ファイルに次のように配置しました.
五、@babel/plugin-tranform-runtime
私たちはindex.jsのコードを修正しました.
@babel/plugin-transform-runtimeは@babel/runtimeと連携して使用する必要があります.
まずインストールに依存します.@babel/plugin-transform-runtimeは通常開発時のみ使用しますが、運転時の最終コードは@babel/runtimeに依存しますので、@babel/runtimeは生産依存としてインストールされなければなりません.
今findIndex関数に戻ると言っていますが、コンパイルしたらrequire(「coree-js/modules/s.array.find-index」)ができます.このような方式はAray.prototypeを修正して、大域汚染します.この問題を防ぐために、プラグインにはもう一つの役割があります.もちろん私たちは@babel/plugin-transform-runtimeに配置情報を追加したいです.まず依存@babel/runtime-corejs 3を追加します.
おわりに
私はよくBabelの配置についての文章を見ましたが、体系的な説明が特によく分かりませんでした.本文は基本的に文章の作者の考え方によって、自分で整理しました.この文章を見て、もっと深く理解したいなら、原作者の文章も参考にしてください.参照リンク見逃せないBabel 7の知識
Babelは、ECMAScript 2015+バージョンのコードを後方互換性のあるjavaScript文法に変換するためのツールチェーンであり、現在および古いバージョンのブラウザまたは他の環境で動作することができる.babel 7の重要な構成部分
let fn = () => console.log('Hello World')
そして、私たちはそれを放置して、一歩ずつ勉強したいと思います.二、@babel/cliと@babel/core
@babel/cliはBabelが提供する内部建設のコマンドラインツールで、主にbabelというコマンドを提供してjsファイルをコンパイルして、プロジェクトにインストールするのに適しています.ただnpm install@babel/cliだけでbabel index.jsを実行するのは成功しません.Babelのコア機能は@babel/coreモジュールに含まれているからです.だから@babel/coreをインストールして実行します.
npm install --save-dev @babel/core @babel/cli
私たちはバベルで上のindex.jsを実行します.babel index.js
発生したコードは何の変化もないことが分かりました.他の組み合わせが必要なようです.他のオプションを設定し続けます.三、@babel/preset-env
本当にBabelを実際に動作させるのはプラグインです.上記のコードを例にして、矢印関数を変換したいです.プラグインが必要です.コマンドラインを入力します.
npm install --save-dev @babel/plugin-transform-arrow-functions
babelrcというプロファイルを作成します.@babel/cliは呼び出し時に呼び出します.Babelrcファイルの内容は以下の通りです.{
"plugins": [
"@babel/plugin-transform-arrow-functions"
]
}
再コンパイルすると、矢印関数は矢印関数ではないことが分かりますが、他のES 6の新しい特性も転化します.例えば、constまたはletをvarに変換するには、プラグイン@babel/plugin-tranform-block-scopingが必要です.classキーワードを従来の原型に基づいたものに変換するには、プラグイン@babel/plugin-trans form-classingが必要です.だから、ES 6を使う時、大量のプラグインを配置する必要があります.これは明らかに不合理です.そこで、Babelはプリセットの概念を提出しました.つまり、事前に一連のプラグインパッケージを作ってくれました.私たちはbabelrcのプロファイルに以下のような構成をしています.
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "4"
}
}
]
]
}
注:targettsは、node環境を設定できるほか、各ブラウザ環境に対する設定も可能です.上記の構成により、運転後、現在のコードについては問題がないことが分かりました.四、@babel/polyfill
私たちはindex.jsのコードを次のように変更します.
const m = [1,2,3].findIndex(x => x == 1)
コンパイルされたコードは以下の通りです."use strict";
var m = [1, 2, 3].findIndex(function (x) {
return x == 1;
});
このコードが低バージョンのブラウザで実行されると、必ずエラーが発生します.低いバージョンのブラウザでは、配列例にincludesメソッドがありません.このような場合は、構文変換は高バージョンの文法を低バージョンに変換するだけで発生しますが、新しい内蔵関数、実例方法は変換できません.そこにオリフィルが登場しました.名前の通り、polyfillの中国語の意味はスペーサーです.スペーサーというのはバーンとは違ったブラウザや異なる環境の下での違いです.新しい内蔵関数や実例の方法などを低バージョンのブラウザでも使えます.
まず@babel/polyfill依存をインストールします.
npm install --save @babel/polyfill
私達は私達のコードの中でpolyfillに導入する必要があります.import '@babel/polyfill';
const m = [1,2,3].findIndex(x => x == 1)
このコードは低バージョンで実行できますが、すべてのpolyfillをロードする必要はありません.これは最終的に構築されたパッケージの体積が大きいことをもたらします.この問題を解決するために、@babel/presete-envはuse BuiiltInsパラメータを提供します.設定値がusageの場合、コードに必要なpolyfillだけが含まれます.このパラメータの値をusageとして設定するには、corejsを同時に設定しなければなりません.(設定しないと、警告が与えられます.デフォルトでは「corejs」です.2)、より多くの新しい特性を使用できるように、core-を使用することをお勧めします.js@3. そこで私たちは.babelrcの配置ファイルに次のように配置しました.
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "4"
},
"useBuiltIns": "usage",
"corejs": 3
}
]
]
}
このようにコンパイルしたコードは次の通りです.import "core-js/modules/es.array.find-index";
var m = [1, 2, 3].findIndex(function (x) {
return x == 1;
});
このように私達はfindIndex関数が必要です.polyfill内のfindIndex関数だけを包装する必要があります.五、@babel/plugin-tranform-runtime
私たちはindex.jsのコードを修正しました.
class A {
constructor (name) {
this.name = name
}
}
const a = new A()
コンパイルされたコードは以下の通りです.import "core-js/modules/es.function.name";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var A = function A(name) {
_classCallCheck(this, A);
this.name = name;
};
var a = new A();
今から考えてみます.もし複数のjsファイルにクラスがあるなら、コンパイルされたファイルごとにクラスがありますか?classicallCheck関数.この問題を解決するために、babelは@babel/plugin-transform-runtimeプラグインを持っています.@babel/plugin-transform-runtimeプラグインを使って、すべてのヘルププログラムはモジュール@babel/runtimeを参照します.そうすると、コンパイル後のコードに重複したヘルププログラムが現れないようにして、効果的にパッケージの体積を減らすことができます.@babel/plugin-transform-runtimeは@babel/runtimeと連携して使用する必要があります.
まずインストールに依存します.@babel/plugin-transform-runtimeは通常開発時のみ使用しますが、運転時の最終コードは@babel/runtimeに依存しますので、@babel/runtimeは生産依存としてインストールされなければなりません.
npm install --save-dev @babel/plugin-transform-runtime
npm install --save @babel/runtime
修正.babelrcの配置は以下の通りです.{
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3
}
]
],
"plugins": [
[
"@babel/plugin-transform-runtime"
]
]
}
コンパイルしたコードは:
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
require("core-js/modules/es.function.name");
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var A = function A(name) {
(0, _classCallCheck2["default"])(this, A);
this.name = name;
};
var a = new A();
この時、_を発見しましたclassCallCheck 2関数は、直接コードに関数を挿入するのではなく、導入された方法である.今findIndex関数に戻ると言っていますが、コンパイルしたらrequire(「coree-js/modules/s.array.find-index」)ができます.このような方式はAray.prototypeを修正して、大域汚染します.この問題を防ぐために、プラグインにはもう一つの役割があります.もちろん私たちは@babel/plugin-transform-runtimeに配置情報を追加したいです.まず依存@babel/runtime-corejs 3を追加します.
npm install @babel/runtime-corejs3 --save
設定ファイルを変更{
"presets": [
[
"@babel/preset-env"
]
],
"plugins": [
[
"@babel/plugin-transform-runtime",{
"corejs": 3
}
]
]
}
コンパイルしたコードは
"use strict";
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
var _findIndex = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find-index"));
var _context;
var m = (0, _findIndex["default"])(_context = [1, 2, 3]).call(_context, function (x) {
return x == 1;
});
上記のようにAray.prototypeは直接修正されません.全体の汚染を避ける.おわりに
私はよくBabelの配置についての文章を見ましたが、体系的な説明が特によく分かりませんでした.本文は基本的に文章の作者の考え方によって、自分で整理しました.この文章を見て、もっと深く理解したいなら、原作者の文章も参考にしてください.参照リンク見逃せないBabel 7の知識