Babel 7 Released

After nearly 2 years, 4k commits, over 50 pre-releases, and lot of help we are excited to announce the release of Babel 7. Babel 6 のリリースからほぼ3年です! 多くの動く部分があるので、リリースの最初の数週間は私たちに我慢してください。 Babel 7 は巨大なリリースです: 私たちはより速くし、アップグレードツールを作成し、JS 設定、設定「オーバーライド」、サイズ/最小化のためのより多くのオプション、JSX フラグメント、TypeScript、新しい提案、その他を行いました!

Babel で行っている作業を評価するなら、 Open Collective で Babel を後援し、 Patreon で私を支援し、あなたかあなたの会社を仕事の一部として Babel に関わってもらうことが可能です。 JavaScript コミュニティにおけるこの重要なプロジェクトの集団的所有権に感謝します!

It’s Happening! 🎉

Software は決して完璧ではありませんが、すでに実運用でしばらく使われているものを出荷する準備はできています! @babel/core は、Next.js 6、vue-cli 3.0、React Native 0.56、そして WordPress.com のフロントエンド🙂などのツールで使われているので、すでに 510 万ダウンロード/月です!

Babel の役割

過去数年の JavaScript エコシステムの中で Babel の役割を再紹介してこの投稿を開始したいと思います。

最初の問題は、サーバー言語と異なり、ユーザーがさまざまなレベルのサポート (特に古いバージョンの Internet Explorer) を持つ異なるブラウザを使用している可能性があるため、すべてのユーザーが同じ JavaScript サポートを持つことを保証する方法がない、ということでした。 開発者が新しい構文 (たとえば class A {}) を使いたい場合、古いブラウザのユーザーは SyntaxError のために空白の画面が表示されるだけでした。

Babel は開発者が最新の JavaScript 構文を使用する方法を提供し、翻訳 (class A {} から var A = function A() {}) によってユーザーの下位互換性をどう確保するかを気にする必要がないようにしています。

Babel は JavaScript コードを変換する能力があるため、新しい機能を実装するためにも使用できます。したがって、TC39 (JavaScript 言語を規定する委員会) が提案された JavaScript のアイデアについてフィードバックを得るためのブリッジとなり、コミュニティが言語の将来について発言できるようになりました。 現在、GitHub には 130 万以上の依存レポがあり、npm では毎月 1700 万ダウンロードされ、多くの主要なフレームワーク (React, Vue, Ember, Polymer) や企業 (Facebook, Netflix, Airbnb) を含む数百のユーザーが利用しています。 多くの人が使っていることを知らないほど、JavaScript 開発の基盤となっています。

Maintainers are People

Babel は、言語自体の将来だけでなく、コミュニティやエコシステムにも大きな影響を及ぼしているのです。 しかし、これだけの責任があっても、Babel は数人のボランティアによるコミュニティ主導のプロジェクトにすぎません。

チームの一部が初めて直接会うことができたのは、ちょうどこの1年のことでした:

オリジナルの @babeljs チーム、ついに集結。 左から右へ。 @left_pad, @jamiebuilds, @sebmck, yours truly, and @loganfsmyth pic.twitter.com/XfPj6OhZfA

– Amjad Masad (@amasad) May 3, 2018

これは告知記事ですが、この機会に皆さんにこのプロジェクトの状態を再認識してもらいたいと思います。

私自身は6.0リリースの数ヶ月前に参加しましたが、それなりに議論と反発がありました。 そこでの評判の多くが、既存のメンテナの燃え尽き症候群 (Babel の生みの親である Sebastian を含む) につながり、残された私たち数人が手綱を取りました。

多くのメンテナと同様に、私たちも偶然にその役割につまずいたのです。 私たちの多くは、コンパイラがどのように動作するか、またどのようにオープンソースプロジェクトを保守するかについて、正式なトレーニングを受けていませんでした。 皮肉なことに、私は大学でコンピュータサイエンスを専攻するのを意図的に避けました。コンパイラや低レベルなものの授業は面白みがなく、難しそうだったので受けたくなかったからです。 しかし、私は、ツーリング、リンター、Babel、および言語としての JavaScript に惹かれていることに気づきました。

私は皆さんに、自分が依存しているオープンソース プロジェクトを調べ、(可能なら時間と金銭的支援の両方で)それらをサポートすることをお勧めしたいと思います。 あなたは好奇心と謙虚さの両方を持って参加することになりますが、それはメンテナとして持つべき素晴らしい特性です。

Babel は会社ではありませんし、Facebookのような大企業のオープンソースチームでもありません。 Babel で働いているボランティアはほんの一握りで、私が仕事を辞めて、オープンソースでフルタイムで働くためにこれまででたった一人になってから、まだ数カ月しかたっていません。 しかし、人々は行き来し、この「趣味」以外の生活を持ち、家族を養い、違うことに移り、仕事を変え、あるいは仕事を探しているなどということがあります。 私たちは集団として、私たちの働き方の基本であるものを維持するためにできることをしているのでしょうか、それとも土台が徐々に崩れていくのを許すつもりなのでしょうか。 オープンソースを歓迎し、包含しつつ、明確な境界を保つにはどうしたらいいのでしょうか?

オープンソースは明らかにソフトウェアを支配していますが、その背後にいる人々を考慮に入れずに、本当に健全な状態であると考えることができるのでしょうか?

#BabelSponsorsEverything

Tips 4 @babeljs at @ReactRally #BabelSponsorsEverything pic.twitter.com/WCxefMOC8V

– Harry Wolff (@hswolff) August 17, 2018

Open Source sustainabilityは今のところ献金かごを配っている感じですね。 プロジェクトがオープンソースを利用する何千もの人々や企業に提供する価値を述べるのは難しいことではありませんが、しかし、その価値が仕事をしようとする少数の人々に示されているのを見ることはありません。 オープンソースをサポートする方法はたくさんあり得ますが、すべてのアプローチがそれぞれのプロジェクトや人々にとってうまくいくわけではありません。

さて、変更点に行きましょう!

Major Breaking Changes

私たちはこれらを移行ガイドに文書化しています。 これらの変更の多くは、私たちの新しい babel-upgrade ツールで自動的に行うことができますし、将来的に追加することもできます。

  • メンテナンスされていない Node バージョンのサポートを停止しました。 0.10, 0.12, 4, 5 (詳細)
  • “scoped” パッケージの使用に切り替えることにより、我々を @babel 名前空間へ移動させる (詳細)。 これは公式パッケージの区別に役立ち、babel-core@babel/core になります (そしてスクワットはありません)
  • あらゆる年間プリセット (preset-es2015 など) を削除 (および公開を停止) します (詳細)。 @babel/preset-env は、特定のブラウザのセットをターゲットにする能力と同様に、すべての年次追加を含むので、これらの必要性を置き換えます
  • また、個々の提案を選択するために、「ステージ」プリセット (@babel/preset-stage-0、その他) を削除してください。 同様に、デフォルトで @babel/polyfill からプロポーザルを削除します (詳細)。
  • いくつかのパッケージは名前を変更しました: TC39 提案プラグインは -transform ではなく -proposal になりました (詳細)。 つまり、@babel/plugin-transform-class-properties@babel/plugin-proposal-class-properties になります。
  • 特定のユーザ向けパッケージ (例: babel-loader, @babel/cli, etc) の @babel/corepeerDependency を導入 (詳細)

babel-upgrade

babel-upgrade は私たちが始めた新しいツールで、自動的にアップグレード変更しようとします:現在 package.json.babelrc config で依存性が確認されています。

Git リポジトリ上で npx babel-upgrade を使って直接実行することを推奨しますが、npm i babel-upgrade -g を使ってグローバルにインストールすることもできます。

ファイルを変更したい場合は、--install と同様に --write を渡すことができます。

npx babel-upgrade --write --install

Please consider contributing by reporting issues or PRs that help everyone transition to Babel 7 ! 将来の希望としては、すべての将来の破壊的な変更にこの同じツールを使用し、更新するプロジェクトを PR するボットを作成することです。

JavaScript 設定ファイル

私たちは babel.config.js を導入しています。 これは必須ではありませんし、.babelrc の代替でもありませんが、これを持つことは特定のケースで有用かもしれません。

*.js 設定ファイルは JavaScript エコシステムでかなり一般的です。 ESLint と Webpack では、それぞれ .eslintrc.jswebpack.config.js 設定ファイルを使用できます。

以下では、プラグインを “production” でコンパイルするだけの場合を示します (.babelrc ファイル内の "env" オプションですでに可能):

var env = process.env.NODE_ENV;module.exports = { plugins: .filter(Boolean)};

babel.config.js には .babelrc と異なる設定解決法があります。 元々 Babel は config を見つけるまで各ファイルから上へルックアップしていたのですが、これは常にそのファイルから config を解決するようになります。 これにより、以下に掲載する次の機能である overrides を利用できるようになります。

オーバーライドによる選択的構成

最近、私は ES2015+ パッケージの公開とその消費/コンパイルの両方についての考えを掲載しました。

module.exports = { presets: , overrides: , presets: , }, { test: , presets: , }]};

これにより、テスト、クライアント コード、およびサーバー コードに異なるコンパイル設定を必要とするアプリケーションで、フォルダごとに新しい .babelrc ファイルを作成する必要を省けます。 v8 チームからのパッチを受け入れるだけでなく、コードを最適化するために多くの変更を加えました。 他の多くの素晴らしい JavaScript ツールと共に Web Tooling Benchmark の一部になれたことを嬉しく思います。

出力オプション

Babel は以前からプリセットおよびプラグイン オプションをサポートしています。 要約すると、プラグインを配列でラップし、オプション オブジェクトをプラグインに渡すことができます:

{ "plugins": , ]}

いくつかのプラグインの loose オプションにいくつかの変更を加え、他のプラグインにいくつかの新しいオプションを追加しました! これらのオプションを使用すると、仕様に準拠しない動作を選択することになるので、自分が何をしているかを知っておく必要があることに注意してください。

  • For classes, class A {} will now not include the classCallCheck helper.
class A {}
var A = function A() {- _classCallCheck(this, A);};
  • There is a new option if every use of a for-of loop is just an array.The new option is a new option if every use of a for-of loop is just an array.The new option as a new new option as a new use of a for-of loop is just an array:
let elm;for (elm of array) { console.log(elm);}
let elm;for (let _i = 0, _array = array; _i < _array.length; _i++) { elm = _array; console.log(elm);}
  • preset-env #6831

すでに多くのライブラリがこれを実行していることがわかりましたので、デフォルトでこれを実行することにしました。

デフォルトの動作は、Babel のオフまたは preset-env の使用がシームレスであることと、バイトを節約するためだけに小さい出力を許可すること (各プロジェクトが行うトレードオフがあります) ができるように、できるだけ仕様準拠にすることに注意してください。 私たちは、それを容易にするためにより良いドキュメントとツールに取り組む予定です。

“純粋” なアノテーション サポート

#6209 以降、トランスパイル ES6 クラスは /*#__PURE__*/ コメントで注釈され、デッドコード除去のための Uglifybabel-minify といった最小化ツールへのヒントとします。 これらのアノテーションは、他のヘルパー関数にも追加されます。

class C { m() {}}
var C =/*#__PURE__*/function () { // ...}();

Minifier のヒントや最適化のための機会がもっとあるかもしれませんので、お知らせください。

Syntax

TC39 Proposals Support

私たちは、提案 < Stage 4 に明示的に参加するようユーザーに求める方針を優先して Stage プリセットを削除したことを再確認したいと思います。 しかし、これは特にStage 0や1の提案についてはそうではありません。 この投稿では、新しいアイデアの背後にある種類の考え方について少し説明します。

以下は、Babel がサポートする新しい構文の一部 (この機能セットは追加/削除/停止される可能性がある移動目標であることを念頭に置いてください) と、v7 で追加されたものの小さな一覧です:

  • ES2018.Babel.Inc: オブジェクトレストスプレッド(var a = { b, ...c }
  • ES2018 (新規): Unicode Property Regex
  • ES2018 (新規): JSON スーパーセット
  • ES2015 (新規): new.target
  • Stage 3 (新規): クラスのプライベートなインスタンス フィールド (class A { #b = 2 })
  • Stage 3 (WIP): Static Class Fields, Private Static Methods (class A { static #a() {} })
  • Stage 3 (new): オプションのキャッチバインディング try { throw 0 } catch { do() }
  • Stage 3 (新規): BigInt (構文のみ)
  • Stage 3: ダイナミックインポート (import("a"))
  • Stage 2 (new): import.meta (構文のみ) (import.meta.url)
  • ステージ 2 (新規): Numeric Separators (1_000)
  • Stage 2 (new)。 function.sent
  • Stage 2: export-namespace-from (export * as ns from 'mod'), export-extensions
  • Stage 2: Decorators から分割されました。 進捗状況は以下をご確認ください!
  • ステージ1。 export-default-fromexport v from 'mod')、export-extensions
  • ステージ1(新)より分割しました。 Optional Chaining (a?.b)
  • Stage 1 (new)。 論理的代入演算子 (a &&= b; a ||= b)
  • Stage 1 (new)。 Nullish Coalescing Operator (a ?? b)
  • Stage 1 (new)。 パイプライン演算子 (a |> b)
  • Stage 1 (new)です。 Throw Expressions (() => throw new Error("a"))

すべての提案を追跡することは誰にとっても難しいので、babel/proposals でそれを試みます。

TypeScript Support (@babel/preset-typescript)

TypeScript チームと協力して、@babel/preset-typescript で型構文を解析/変形するようにし、@babel/preset-flow で Flow を取り扱う方法と同様にしています。

詳細については、TypeScript チームからのこの投稿をご覧ください!

Before (types with):

interface Person { firstName: string; lastName: string;}function greeter(person : Person) { return "Hello, " + person.firstName + " " + person.lastName;}

After (types removed):

function greeter(person) { return "Hello, " + person.firstName + " " + person.lastName;}

フローと Typescript は両方とも JavaScript ユーザーが段階的タイピングを活用できるツールであり、我々は両方を Babel で可能にしたいのです。 私たちは、互換性を維持し、新しい機能をサポートするために、FB および Microsoft のそれぞれのチームと (コミュニティ全体と同様に) 密接に作業を継続する予定です。 問題を報告したり、PR を送ったりするのにご協力いただければ幸いです!

JSX フラグメント サポート (<>)

Reactブログにあるように、beta.31時点で JSX フラグメント サポートが利用可能になっています。

render() { return ( <> <ChildA /> <ChildB /> </> );}// output 👇render() { return React.createElement( React.Fragment, null, React.createElement(ChildA, null), React.createElement(ChildB, null) );}

Babel Helpers Changes

The babel-upgrade PR is in progress

@babel/runtime@babel/runtime@babel/runtime-corejs2 (PR)に分割されました。 前者は Babel のヘルパー関数だけを含み、後者はそれに加えてあらゆる polyfill 関数 (例: Symbol, Promise) を含みます。

Babel は再利用できるコードに特定の関数を注入する必要があるかもしれません。

この例として、class (loose モードなし) をコンパイルした場合を挙げます。

仕様ではnew Person()でクラスを呼び出す必要がありますが、関数にコンパイルされている場合は技術的にはPerson()で済むので、そのための実行時チェックを入れています。

class Person {}
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }var Person = function Person() { _classCallCheck(this, Person);};

@babel/plugin-transform-runtime@babel/runtime (依存関係として) では、Babel は個々の関数を抽出して、以下のように小さな出力を可能にするモジュール関数だけを要求できます:

var _classCallCheck = require("@babel/runtime/helpers/classCallCheck");var Person = function Person() { _classCallCheck(this, Person);};

同じことは external-helpersrollup-plugin-babel でも可能です。 将来的には、このようなことを自動的に行うことができないか検討中です。 近いうちに、Babel のヘルパーに関する独立した投稿を楽しみにしていてください。

Automatic Polyfilling (experimental)

ポリフィルは、PromiseSymbol といった機能をサポートしていない環境で有効にするために必要なものです。 これは、Babel がコンパイラとして行うこと (構文の変換) とポリフィル (組み込み関数/オブジェクトの実装) を区別する際に重要です。

@babel/polyfill:

import "@babel/polyfill";

のようにすべてをカバーするものをインポートするだけなら簡単ですが、ポリフィル全体を含んでおり、すでにブラウザがサポートしていれば、すべてをインポートしなくてもよい場合があります。 これは@babel/preset-envがシンタックスで解決しようとしている問題と同じなので、ここではポリフィルで適用しています。useBuiltins: "entry"オプションは、元のインポートを必要なインポートだけに分割してこれを行います。

しかし、コードベースで使用されているポリフィルだけをインポートすれば、もっとうまくいきます。

各ファイルを通して実行し、組み込みがコードで「使用」されている場合、各ファイルの先頭にインポートを挿入します。 たとえば、

import "core-js/modules/es6.promise";var a = new Promise();

推論は完全ではないので、誤検出があるかもしれません。

import "core-js/modules/es7.array.includes";a.includes // assume a is an 

この分野における他のアイデアとしては、サービスに依存することが問題でなければ polyfill.io を使用する(または Kent C. Dodds が PayPal でホストされたサービスを構築するためにこれを使用しました)。

Misc

Babel Macros 🎣

Babel の優れた部分の 1 つは、ツールのプラグイン可能性です。 長年にわたり、Babel は単なる「6to5」コンパイラーからコード変換プラットフォームとなり、ユーザーと開発者の経験の両方においていくつかの素晴らしい最適化を可能にしました。 大量の Babel プラグインが特定のライブラリおよびユースケース用に開発され、他の方法では不可能なライブラリ API のパフォーマンスと機能を向上させました (いくつかの「ライブラリ」は完全にトランスパイルされ、ランタイムがまったくない状態になっています)。 これらの問題は、Kent C. Dodds による babel-plugin-macros によって解決されました!

babel-plugin-macros がインストールされて設定に追加されると (create-react-app v2 に含まれています)、どのマクロを使用するために設定を気にする必要がありません。 さらに、アプリまたはコードの一部分に固有のユースケースのために、独自のカスタム変換を書くことがさらに簡単になります。

babel-plugin-macros の詳細については、オリジナルの投稿「babel-plugin-macros によるゼロ構成コード変換」で説明しています。 Babel 7 では、モジュール/ノモジュール パターンの人気の高まりをサポートするために Babel を構成することがはるかに容易になりました。

特に、人気のある Web フレームワーク (1, 2) 用のいくつかの CLI ツールはすでに、Babel によってトランスパイルしたアプリケーションの消費者への出荷 JavaScript を約 20% 減らすというサポートを利用しています。

Caller Metadata and Better Defaults

ツールがプリセット/プラグインにメタデータを渡せるように、@babel/corecaller オプションを追加しました。 たとえば preset-env が自動的にモジュール変換を無効にするように、babel-loader はこのようなものを追加できます (rollup:

babel.transform("code;", { filename, presets: , caller: { name: "babel-loader", supportsStaticESM: true, },});

これは、ツールがより良いデフォルトと少ない設定を提供する方法を可能にするので、とてもエキサイティングです! webpack/rollup の場合: Babel のモジュール変換の代わりに彼らのモジュール変換を使用するように自動的にデファレンシングできます (import("a") と同じ)。 将来的には、これを利用するためのより多くのツールに注目してください!

class C extends HTMLElement {} 。

最も古い問題の 1 つに独自の見出しを付けました (詳細)

Babel は常に、ネイティブ ビルトイン (ArrayError など) の拡張をサポートできない注意点を持っていましたが、それが可能になりました! 私たちはこのことについて多くの問題を得ました。🎉 あなたは Andrea のように祝うべきです!

この変更はクラス プラグインに行われたので、preset-env を使用している場合、自動的に有効になるはずです。

私たちはまだ Crowdin で翻訳を設定している最中ですが、Babel 7 がリリースされたので、そのプロセスを開始するのに良い場所になるでしょう。

REPL

私たちは REPL を React Component として書き換え、Ives とともに CodeSandbox との統合を強化しようとしています。 これにより、REPL で npm から任意のプラグインやプリセットをインストールしたり、CodeSandbox が取得するすべてのアップデートを取得したりすることができます。 今回は、Gyujin と Sujin が Boopathi の babel-time-travel を REPL に統合するために頑張ってくれていて、現在すでにテストすることができます!

ここには、Babel や AST、その他のツールをよりよく動かすために参加する機会がたくさんあります!

そして、Rails Girls Summer of Code にも参加しています。

We Have A Song 🎶

Hallelujah-In Praise of Babel

ある日 Angus が素晴らしい曲をくれたので、これを公式ソングにしないか? そしてShawnが見事にカバーしてくれました。

この曲は私たちのレポ、SONG.mdで見ることができます。 他のプロジェクトがこれに続くことを期待しています!

What’s Next?

  • Babel は本質的に何をコンパイルするかに縛られているのです。 それは JavaScript です。 提案する/取り組むべき新しい追加がある限り、そこで行われるべき仕事があります。 それは、構文が「安定」する前であっても、それを実装し維持するための時間/労力を含みます。 アップグレードパス、新機能の教育、標準/言語設計の教育、使いやすさ、そして他のプロジェクトとの統合です。
    • 関連: Nicolò のおかげで、Babel の新しいデコレーターの提案をほぼ実装し終えました。 新しい提案は古いものとは全く異なり、はるかに強力であるため、長い道のりでした (1年以上かかりました!)。 次のマイナーバージョンでリリースされ、変更点の詳細を説明するブログ記事と一緒に公開されることを期待できます。
  • Boopathi が babel-minify を熱心にメンテナンスしているので、次はその 1.0 を作成する予定です!
  • 作業中の多くの新機能があります: プラグインの順序付け、より良い検証/エラー、スピード、ルース/スペック オプションの再考、キャッシュ、Babel を非同期に使用、CI から自分自身に対して構築、スモーク テスト、test262 を実行します。 このロードマップ ドキュメントで、さらに可能性のあるアイデアをチェックしてください!

私たちに秘密の計画はありません。 しかし、この現在のリリースで示したように、物事には予想以上に時間がかかります!

ところで、なぜこれらのリリースはそんなに時間がかかるのでしょうか。 それは、私たち自身とユーザーの両方からの機能クリープのせいでしょうか。 追加または修正する可能性のあるすべてのものの中から優先順位をつける方法を理解していないためでしょうか。 基本的な問題を最後まで修正せず、低いところにある果実を修正することにしたのでしょうか。 GitHubやSlack、Twitterで他の人を助けることに「気を取られて」いないか? 私たちは、時間の見積もりが下手で、これらの問題の複雑さを理解できず、ボランティアとして過剰にコミットしているのでしょうか。

それとも、自分自身に高い期待をかけすぎたり、自分自身を犠牲にしてでも他の人のニーズに合わせて実行しなければならないというプレッシャーを感じているのでしょうか。 ネット上で「なぜ発売されないのか」というメッセージや、「なぜこのバグがまだ直らないのか」というメッセージを見たときの恐怖といったらないですね。 急いでリリースして終わらせたいのですが、真剣に取り組みたいという気持ちもあります。

React Rally で先週行った講演では、これらの考えや葛藤のいくつかを表現しようとしました。 Through the (Open Source) Looking Glass」での先週の講演で、これらの考えや葛藤を表現してみましたので、ぜひ機会を見て聞いていただければと思います。 私が自問自答していること。

人生の多くと同様に、私たちが行うことは私たちの性格を反映し、私たちの本当の姿を示しています。 私たちが取る行動は、それ自体で、良くも悪くも私たちを変えることができます。 即座の満足感、測定基準での成功、権利対感謝、過労の誇りなどです。

しかし、それにもかかわらず、このリリースに向けて働くことはとても価値がありました。

感謝

これは、私たちが達成し、可能にしたことを振り返るだけでなく、この 1 年間、これを実現するためにどれだけの時間と心が注がれたかを知るだけでも、本当にエキサイティングなリリースです。 世界中の企業と交流したり、企業を支援したり、訪れたほとんどの都市で友人を見つけたり、このグループが共に歩んできた信じられないような旅について正直に話したりと、その過程で起こった機会や経験を信じるのは難しいことです。 特に、コアの動作の多くを変更するために数え切れないほどの時間を費やしてきた Logan Smyth と、フリーランスで働きながら私たちの Slack でいつも時間を割いてとても助けてくれる Brian Ng には感謝します。 Daniel Tschinder、Sven Sauleau、Nicolò Ribaudo、および Justin Ridgewell はすべて、このリリースを可能にし、楽しく作業するのに役立っています。

Slack や Twitter、そして GitHub 上のすべてのプロジェクトで、ユーザーのために何をしているかを理解しなければならない多くのコミュニティ メンバーに敬意を表します。 フルタイムで働くことを決める前に、Babel で働くためにほぼ 1 年間スポンサーになってくれた Behance/Adobe の友人たちに、大きな感謝を捧げたいと思います(また、私がそこにいた間ずっと、Babel 7 の本番テストを手伝ってくれました)。 Open Collective のスポンサーの皆さん、特に Trivago と Handshake に大感謝です。 そして、私たちの友人と家族のすべての愛とサポートに感謝します。

私たちはこの時点でかなり疲れていますが、このように奉仕することは本当に名誉であり特権でしたので、リリースを評価していただけると幸いです!