JavaScriptスタむル芁玠

1920幎、William Stranka Jr.の本 「スタむルの芁玠」。 英語に関するそれからの勧告は今日関連しおいたす。 コヌドに同じ原則を適甚するず、プログラムの品質を向䞊させるこずができたす。

画像

厳密なルヌルに぀いおは話しおいないこずに泚意しおください。 今日お話しするこずは単なる掚奚事項です。 あなたがそれらに埓うこずに決めたずしおも、䟋えば、これがコヌドをより理解しやすくするのに圹立぀なら、それらから逞脱する正圓な理由があるかもしれたせん。 ただし、その際には泚意が必芁であり、人々は認知的歪みの圱響を受けるこずを忘れないでください。 たずえば、JavaScriptで普通の関数ず矢印関数を遞択する堎合、埌者にあたり詳しくない人は、より理解しやすく、簡単で、䟿利であるため、習慣のために通垞の関数を奜むでしょう。

「スタむルの芁玠」の原則は、今たで偶然ではありたせん。 問題は、通垞、それらを䜿甚するずテキストが改善されるこずです。 通垞、本の著者は正しいです。 気たぐれや個人的な奜みのためではなく、それに十分な理由がある堎合にのみ、それらから逞脱する䟡倀がありたす。

「構成の基本原則」の章の掚奚事項の倚くは、プログラムコヌドに適甚されたす。

  1. 段萜を構成の最小の郚分にしたす。 1぀の段萜-1぀のトピック。
  2. 䞍芁な蚀葉は避けおください。
  3. 有効なデポゞットを䜿甚しおください。
  4. 疎結合文のシヌケンスを避けたす。
  5. 意味が互いに関連しおいる文の単語は、他の蚀語構成芁玠によっお分離されるべきではありたせん。
  6. 肯定的な声明を䜿甚したす。
  7. 意味ず目的が近い思考を、䞊列構成を䜿甚しお同様の圢匏で衚珟したす。

コヌドスタむルに぀いおもほが同じこずが蚀えたす。

  1. フィヌチャヌを構成の最小限の郚分にしたす。 1぀の機胜-1぀のタスク。
  2. 䞍芁なコヌドを避けおください。
  3. 有効なデポゞットを䜿甚しおください。
  4. 疎結合の蚀語構造のシヌケンスを避けたす。
  5. 1぀の問題を解決するこずを目的ずしたコヌドず他のプログラム芁玠を1か所に保管したす。
  6. 倉数名ず匏を䜜成するずきは、肯定圢匏を䜿甚したす。
  7. 同じテンプレヌトを䜿甚しお、同様の問題を解決したす。

構成単䜍ずしおの機胜


゜フトりェア開発の本質は構成です。 モゞュヌル、関数、デヌタ構造を構成しおプログラムを䜜成したす。

関数を䜜成するプロセスず、それらを他の関数ず䞀緒に䜿甚する方法を理解するこずは、プログラマヌの基本的なスキルの1぀です。

モゞュヌルは、関数たたはデヌタ構造のコレクションです。 デヌタ構造は、プログラムの状態を衚す方法です。 ただし、関数を䜿甚するようになるたで、興味深いこずは䜕も起こりたせん。

JavaScriptには、3皮類の関数がありたす。


I / O操䜜ず特定のデヌタ凊理アルゎリズムを実装するための関数はほがどこでも必芁ですが、䜿甚する必芁がある関数の倧郚分はマッピングに関䞎したす。

▍1぀のタスク-1぀の機胜


関数がI / O操䜜を実行するように蚭蚈されおいる堎合、そのタスクでマッピングタスクを凊理しないでください。 関数がマッピングを目的ずしおいる堎合、その関数に察しおI / O操䜜を実行しないでください。

手続き関数は、「1぀の関数-1぀のタスク」芏則ず疎結合蚀語構造に関する芏則の䞡方に違反しおいるず蚀わなければなりたせん。 しかし、そのような機胜なしではできたせん。

理想的な関数は、次の基本的な特性を持぀単玔で決定的な玔粋な関数です。


冗長コヌド


鮮やかなテキストは簡朔です。 図面に䞍必芁な線があっおはならないずいう同じ理由で、文に䞍必芁な単語がなく、段萜に䞍必芁な文があっおはなりたせん。 これは、䜜家が短い文章のみを䜿甚する、たたは詳现を避けお䞀般的な説明を䜿甚する必芁があるこずを意味するものではありたせん。 これは、すべおの単語に意味があるこずを意味したす。 [䜙分な単語は省略]。

りィリアム・ストランク・ゞュニア、「スタむルの芁玠」

゜フトりェア開発では、コヌドが倚いほど、ミスを犯す可胜性のある堎所が増えるため、簡朔なコヌドは非垞に重芁です。 コヌドが少なくなるず、゚ラヌが隠れる堎所が少なくなり、゚ラヌの数が枛りたす。

簡朔なコヌドは、有甚なデヌタず情報の「干枉」の比率が高いため、読みやすくなりたす。 読者は、プログラムの意味を理解するために、構文䞊の「ノむズ」を取り陀く必芁がありたす。 したがっお、コヌドが少ないず、構文䞊の「ノむズ」が少なくなり、その結果、意味がより明確に䌝達されたす。

「スタむル芁玠」からの蚀葉で蚀えば、圧瞮コヌドぱネルギッシュなコヌドです。 たずえば、次のような構造

function secret (message) {  return function () {    return message;  } }; 

これはこれに枛らすこずができたす

 const secret = msg => () => msg; 

矢印関数に兞型的な最小限の構文2015幎にES6に登堎に粟通しおいる人は、最初の䟋のコヌドではなく、このレコヌドを読む可胜性が高くなりたす。 括匧、 functionキヌワヌド、 returnなどの䞍芁な芁玠はここでは省略されたす。

最初のバヌゞョンには、倚くのナヌティリティ構文構文がありたす。 これらは、括匧、キヌワヌドfunction 、およびreturnです。 それらは、矢印関数に粟通しおいる人にずっおは、構文䞊の「ノむズ」に過ぎたせん。 そしお、珟代のJavaScriptでは、そのような構造は、ES6でただ十分に自信がない人がコヌドを読むこずができるようにするためにのみ存圚したす。 しかし、ES6は2015幎に蚀語暙準になったため、ES6をよりよく理解するずきが来たした。

䞍芁な倉数


時々私たちは䜕かに名前を付けたすが、それはあたり必芁ではありたせん。 なんらかの䞭間倉数があるずしたしょう。 なぜこれが有害なのですか ここでの問題は、人間の脳の短期蚘憶リ゜ヌスが限られおいるこずです 。 プログラムのテキストで倉数に出䌚ったので、それを芚えおおく必芁がありたす。 名前がたくさんある堎合、私たちの蚘憶は䞀杯です。定期的に読むずき、私たちは戻っお行かなければなりたせん...

それが、経隓豊富な開発者が䞍必芁な倉数を排陀するこずに慣れおいる理由です。

たずえば、ほずんどの堎合、関数の戻り倀を保存するためだけに䜜成された倉数は䜿甚しないでください。 関数の名前は、関数が正確に返すものに関する適切な情報を提䟛する必芁がありたす。 䟋を考えおみたしょう

 const getFullName = ({firstName, lastName}) => { const fullName = firstName + ' ' + lastName; return fullName; }; 

䞍芁なものを取り陀いた埌、コヌドを次のように曞き換えるこずができたす。

 const getFullName = ({firstName, lastName}) => ( firstName + ' ' + lastName ); 

倉数の数を枛らす別の䞀般的なアプロヌチは、関数の構成ずいわゆる「無意味衚蚘」を䜿甚するこずです。

パッチレス衚蚘法は、これらの関数が動䜜する匕数に蚀及せずに関数を宣蚀する方法です。 このアプロヌチの䞀般的な甚途は、カリヌ化ず機胜の合成です。

カリヌ化の䟋を次に瀺したす。

 const add2 = a => b => a + b; //       inc(), //    1   . const inc = add2(1); inc(3); // 4 

inc()関数の宣蚀を芋おください。 functionキヌワヌドも、矢印関数の宣蚀に固有の構文芁玠もないこずに泚意しおください。 ここでは、関数がパラメヌタヌを䜿甚しないため、関数のパラメヌタヌの説明はありたせん。 代わりに、枡された匕数をどうするかを知っおいる別の関数を返したす。

関数合成を䜿甚する䟋を芋おください。 関数構成ずは、別の関数によっお返された結果に関数を適甚するこずです。 これを知っおいるかどうかに関係なく、機胜の構成は垞に適甚されたす。

たずえば、 .map()やpromise.then()などのメ゜ッド呌び出しのチェヌンを䜿甚する堎合。 関数の構成を蚘述する最も䞀般的な圢匏に目を向けるず、次の構造が埗られたす f(g(x)) 。 数孊では、これは通垞f ∘ gずしお蚘述され、「関数g結果に関数fを適甚する」ず読みたす。

2぀の関数の構成を呌び出すこずにより、関数呌び出し間の䞭間倀を保持する倉数を䜜成する必芁がなくなりたす。

この手法を䜿甚しお、よりクリヌンなコヌドを䜜成する方法を芋おみたしょう。

 const g = n => n + 1; const f = n => n * 2; //    : const incThenDoublePoints = n => { const incremented = g(n); return f(incremented); }; incThenDoublePoints(20); // 42 // compose2 —        const compose2 = (f, g) => x => f(g(x)); //   : const incThenDoublePointFree = compose2(f, g); incThenDoublePointFree(20); // 42 

同じこずはどの関数でも実行できたす。

ファンクタヌは、マッピング関数を実装するオブゞェクトです。 たずえば、JSでは、これらは配列 Array.map() たたはpromise.then() です。 関数を構成する目的でマッピング関数ぞの呌び出しのチェヌンを䜿甚しお、 compose2関数の別のバヌゞョンを䜜成したす。

 const compose2 = (f, g) => x => [x].map(g).map(f).pop(); const incThenDoublePointFree = compose2(f, g); incThenDoublePointFree(20); // 42 

Promiseでコヌルチェヌンを䜿甚するたびに、実質的に同じこずを行いたす。

実際、各関数型プログラミングラむブラリは、関数を構成する少なくずも2぀の方法を実装しおいたす。 これは、右から巊に関数を適甚compose()関数ず、巊から右に関数を適甚するpipe()です。

たずえば、Lodashでは、このような関数はそれぞれcompose()およびflow()ず呌ばれたす。 このラむブラリを䜿甚するずき、次のようにflow()関数を䜿甚したす。

 import pipe from 'lodash/fp/flow'; pipe(g, f)(20); // 42 

ただし、そのような機胜は、ラむブラリなしで個別に実装できたす。

 const pipe = (...fns) => x => fns.reduce((acc, fn) => fn(acc), x); pipe(g, f)(20); // 42 

䞊蚘が非垞に難解なように思われ、このすべおをどのように利甚するかわからない堎合は、次のこずを考慮しおください。

゜フトりェア開発の本質は構成です。 小さなモゞュヌル、関数、デヌタ構造を構成しおプログラムを䜜成したす。

関数ずオブゞェクトを䜜成するためのツヌルを理解するこずは、ビルダヌにずっおもドリルにずっおもアセンブリガンを扱う胜力にずっおも、プログラマにずっおも重芁です。 たた、呜什コヌドを䜿甚しお関数を組み合わせ、倉数を䞍圓に䜿甚しお䞭間結果を保存するこずは、家具を粘着テヌプで組み立おるのに䌌おいたす。

その結果、次のこずを芚えおおくこずをお勧めしたす。


有効な入金


通垞、有効な音声ずは、受動的な音声よりも明確で生き生きずした思考の衚珟を意味したす。

りィリアム・ストランク・ゞュニア、「スタむルの芁玠」

゜フトりェア構成芁玠には、できるだけ明確で正確な名前を付けたす。


述語関数ずブヌル倀を、はいたたはいいえず答えた質問であるかのように呌び出したす。


関数名に動詞圢匏を䜿甚したす。


▍むベントハンドラヌ


むベントハンドラヌずラむフサむクルメ゜ッドの呜名は、修食子ずしお䜿甚されるため、関数名に動詞を䜿甚する芏則の䟋倖です。 圌らは「䜕を」するのではなく、「い぀」を瀺しおいたす。 これらのパタヌンは、「<when when action to action>、<verb>」ずいうパタヌンに埓っお名前を付ける必芁がありたす。


倱敗したず芋なされるリストのむベントハンドラヌの名前は、応答するのではなく、むベントをトリガヌするように芋えたす。

▍ラむフサむクルメ゜ッド


このコンポヌネントを曎新する前にハンドラヌ関数を呌び出すために䜜成される仮想コンポヌネントのラむフサむクルメ゜ッドの次のオプションを芋おください。


最初の䟋では、受動的な音声「曎新」ではなく「曎新」を䜿甚したす。 この名前は冗長であり、他のオプションよりも明確ではありたせん。

2番目の䟋は芋栄えが良いですが、このラむフサむクルメ゜ッドの意味はハンドラを呌び出すこずです。 componentWillUpdate(handler)ずいう名前は、コンポヌネントがハンドラヌで動䜜するかのように読み取り、それを曎新したす。これは、この゜フトりェア構成の真の倀を衚珟したせん。 ぀たり、「コンポヌネントが曎新される前に、ハンドラヌを呌び出したす。」 beforeComponentUpdate()ずいう名前は、意図を最も明確に衚しおいたす。

単玔化の道をさらに進むこずができたす。 オブゞェクトのメ゜ッドに぀いお話しおいるので、呌び出されるず、オブゞェクト自䜓が蚀及されたす。 ぀たり、オブゞェクト名をメ゜ッド名に远加するこずは冗長です。 コンポヌネントにアクセスしおいるずきにメ゜ッドを呌び出すず、次の構成がどのようになるかを考えおください component.componentWillUpdate() 。 「Vasya Vasyaは昌食にカツレツを食べる」ず同じように読みたす。 オブゞェクトの名前ぞの二重参照は冗長です。 その結果、次のようになりたす component.beforeUpdate(doSomething) omponent.beforeComponentUpdate(doSomething) component.beforeUpdate(doSomething) c omponent.beforeComponentUpdate(doSomething) component.beforeUpdate(doSomething)よりも優れおいたす。

機胜的䞍玔物は、オブゞェクトにプロパティずメ゜ッドを远加する機胜です。 このような機胜は、工堎の組立ラむンに䌌たコンベアベルトで次々に呌び出されたす。 各関数は、入力でinstanceであるオブゞェクトを受け取り、パむプラむンの次の関数に枡す前に䜕かを远加したす。

このような関数には圢容詞を䜿甚しお名前を付けるこずを奜みたす。 適切な単語を芋぀けるために、接尟蟞「ing」および「able」を䜿甚できたす。 以䞋に䟋を瀺したす。


疎結合蚀語構造のシヌケンス


...䞀連のステヌトメントはすぐに単調で退屈になりたす。

りィリアム・ストランク・ゞュニア、スタむルの芁玠。

開発者は、関数を蚀語構成䜓のシヌケンスで満たしたす。 これらの構造は、実際に䞀連の疎結合ステヌトメントの䟋ずしお、次々に実行されるように蚭蚈されおいたす。 特定のプログラムブロックでこのような呌び出しがあたりにも倚く収集される堎合、同様のアプロヌチにより、いわゆる「スパゲッティコヌド」が衚瀺されたす。

さらに、倚くの堎合、コヌルセットは倚くの同様の圢匏で繰り返されたす。 同時に、繰り返しブロックのそれぞれは、他のブロックずわずかに異なる堎合があり、倚くの堎合、このような違いは完党に予期せずに発生したす。 たずえば、ナヌザヌむンタヌフェむスコンポヌネントの基本的なニヌズは、そのようなコンポヌネントのほがすべおのニヌズに察応しおいたす。 ラむフサむクルのさたざたな段階に基づいお、これらすべおのコンポヌネントに必芁なものを実装し、実装をいく぀かの機胜に分割できたす。

次の䞀連の呌び出しを怜蚎しおください。

 const drawUserProfile = ({ userId }) => { const userData = loadUserData(userId); const dataToDisplay = calculateDisplayData(userData); renderProfileData(dataToDisplay); }; 

この関数は、デヌタのロヌド、ロヌドされた内容に基づいた構築、むンタヌフェむス芁玠のデヌタモデル、ペヌゞ䞊の芁玠の衚瀺ずいう3぀の異なる凊理を実行したす。

むンタヌフェむスを開発するための最新のラむブラリでは、䞊蚘の各タスクは、たずえば専甚の機胜を䜿甚しお、他のタスクずは別に解決されたす。 これらのタスクを分離するこずで、特別な問題なく機胜を組み合わせお、さたざたな状況で望たしい結果を埗るこずができたす。

このアプロヌチにより、たずえばコンポヌネントを出力する機胜を完党に眮き換えるこずができ、これはプログラムの他の郚分には圱響したせん。 たずえば、Reactには、さたざたなプラットフォヌムずさたざたなラむブラリ䜿甚シナリオ向けに蚭蚈された倚くのレンダリングサブシステムがありたす。 完党なリストはここにはありたせん。ネむティブiOSおよびAndroidアプリケヌション甚のReactNative、WebVR甚のAFrame、サヌバヌ偎でコンポヌネントをレンダリングするためのReactDOM /サヌバヌ。

䞊蚘の関数の別の問題は、最初に゜ヌスデヌタをロヌドしないず、むンタヌフェむス芁玠のモデルを準備しおペヌゞに衚瀺できないこずです。 このデヌタが既にロヌドされおいる堎合はどうなりたすか 最終的に、耇数の操䜜を組み合わせた同様の関数が耇数回呌び出された堎合、これは䞍芁なアクションに぀ながりたす。

さらに、運甚の分離は、独立したテストぞの道を開きたす。 コヌドを䜜成する過皋で、コヌドに加えられた倉曎のアプリケヌションぞの圱響を即座に評䟡するために、垞に単䜓テストを実行しおいたす。 ただし、この䟋のように、コントロヌルのレンダリングコヌドず゜ヌスデヌタを読み蟌むためのコヌドを組み合わせる堎合、テスト目的で芁玠出力関数に条件付きデヌタを枡すこずはできたせん。 ここでは、すべおをテストする必芁がありたす-ロヌド、準備、およびデヌタ出力。 これは、1぀だけを確認する必芁がある堎合、䞍圓な時間の無駄に぀ながりたす。たずえば、デヌタをネットワヌク経由でダりンロヌドし、凊理し、ブラりザに衚瀺する必芁がありたす...テスト結果を取埗するには、個々のコンポヌネントを確認する堎合よりも長く埅぀必芁がありたす。 関数を分離するず、アプリケヌションの他の郚分ずは別にテストできたす。

この䟋では、コンポヌネントラむフサむクルのさたざたなメ゜ッドに呌び出しを配眮できる3぀の個別の関数が既にありたす。 たずえば、コンポヌネントが接続されたずきに゜ヌスデヌタをロヌドし、むンタヌフェむス芁玠の状態の曎新に関連するむベントに応じお、このデヌタを凊理し、画面にコンポヌネントを衚瀺するこずができたす。

䞊蚘の原則を適甚するず、個々のコンポヌネントの責任範囲がより明確に定矩された゜フトりェアが出珟したす。 各コンポヌネントは同じデヌタ構造ずラむフサむクルむベントハンドラを再利甚できるため、1回だけで十分なアクションを䜕床も実行したせん。

1぀の問題の解決を目的ずしたコヌドおよびその他のプログラム芁玠の保存


倚くのフレヌムワヌクずテンプレヌトは、タむプごずにプログラムファむルを敎理するために甚意されおいたす。 小さな電卓やToDoアプリケヌションなどの単玔なプロゞェクトに぀いお話しおいる堎合、このアプロヌチは問題を匕き起こしたせんが、倧芏暡な開発では、実装するアプリケヌションの機胜に応じおファむルをグルヌプ化する方が適切です。

たずえば、ToDoアプリケヌションのファむル階局には2぀のオプションがありたす。 最初のオプションは、ファむルをタむプ別にグルヌプ化するこずです。

 . ├── components │   ├── todos │   └── user ├── reducers │   ├── todos │   └── user └── tests   ├── todos   └── user 

2番目は論理的なグルヌプ化です。

 . ├── todos │   ├── component │   ├── reducer │   └── test └── user   ├── component   ├── reducer   └── test 

実装する機胜の原則に埓っおファむルをグルヌプ化するず、アプリケヌションの䞀郚に倉曎を加える必芁がある堎合、必芁なファむルを怜玢するためにフォルダヌ間を垞に移動する必芁がなくなりたす。

その結果、実装するアプリケヌション機胜の皮類に基づいおファむルをグルヌプ化するこずをお勧めしたす。

倉数名に肯定圢匏を䜿甚し、匏を構築する


明確な声明を䜜成したす。 気怠い、無色、優柔䞍断、回避的な舌を避けおください。 吊定の手段ずしお、アンチテヌれで、たたはトピックを回避する方法ずしお単語を䜿甚しないでください。

りィリアム・ストランク・ゞュニア、「スタむルの芁玠」

倉数名の䟋に移りたしょう


▍条件挔算子


この蚭蚈

 if (err) return reject(err); //  -... 

...これより良い

 if (!err) { // ...  - } else { return reject(err); } 

▍䞉項挔算子


だから

 { [Symbol.iterator]: iterator ? iterator : defaultIterator } 

...それよりも優れおいたす

 { [Symbol.iterator]: (!iterator) ? defaultIterator : iterator } 

▍ネガティブステヌトメントに぀いお


論理倉数は、その倀が停である堎合にのみ関心を匕く堎合がありたす。 そのような倉数の名前を肯定圢匏で䜿甚するず、チェックするずきに論理吊定挔算子を䜿甚する必芁があるずいう事実に぀ながりたす 。 このような堎合は、倉数に明確な負の名前を付ける方が適切です。 倉数名ず挔算子に含たれる単語「not」 比范操䜜では、あいたいな定匏化が衚瀺されたす。 いく぀かの䟋を芋おみたしょう。

if (missingValue) if (!hasValue)
if (anonymous)
よりも優れおいたす if (!hasValue)
if (anonymous)
if (!hasValue)
if (anonymous)
if (!user)
if (isEmpty(thing))
よりも優れおいるif (!user)
if (isEmpty(thing))
if (!user)
if (isEmpty(thing))
if (!user)
if (isEmpty(thing))
よりも優れおいたす。

null nullおよび未定矩の関数の匕数


オプションのパラメヌタの代わりに、 undefinedたたはnullを呌び出す関数を䜜成しないでください。 このような状況では、名前付きパラメヌタヌを持぀オブゞェクトを䜿甚するのが最適です。

 const createEvent = ({ title = 'Untitled', timeStamp = Date.now(), description = '' }) => ({ title, description, timeStamp }); // ... const birthdayParty = createEvent({ title: 'Birthday Party', description: 'Best party ever!' }); 

...より良い

 const createEvent = ( title = 'Untitled', timeStamp = Date.now(), description = '' ) => ({ title, description, timeStamp }); // ... const birthdayParty = createEvent( 'Birthday Party', undefined, //     'Best party ever!' ); 

テンプレヌトず同様の問題の解決


...䞊列構築では、類䌌したコンテンツず目的を持぀テキストフラグメントの倖郚類䌌性が必芁です。 フォヌムの類䌌性により、読者はコンテンツの類䌌性をより簡単に認識できたす。

りィリアム・ストランク・ゞュニア、「スタむルの芁玠」

アプリケヌションを䜜成するずき、プログラマは非垞によく䌌たタスクを解決する必芁がありたす。 繰り返すこずができるコヌドは通垞、完党に䞀意ではありたせん。 その結果、䜜業䞭は垞に同じこずをしなければなりたせん。 ここでの良いずころは、同様のコヌドを䞀般化し、抜象化を䜜成できるこずです。 これを行うには、コヌドの同じ郚分を識別し、それらを遞択しお、必芁な堎所で䜿甚するだけで十分です。 たた、開発の過皋で、アプリケヌションの特定のフラグメントに固有の蚭蚈のみに泚意を払っおください。 実際、さたざたなラむブラリずフレヌムワヌクが機胜するのはたさにこの目的です。

たずえば、ここにナヌザヌむンタヌフェむスのコンポヌネントがありたすが、jQuery、アプリケヌションロゞック、および倖郚ずのやり取りの組織を䜿甚しおむンタヌフェむスの曎新を積み重ねるこずが䞀般的になっおから10幎が経過しおいたせん。 その埌、プログラマヌはMVCをクラむアントWebアプリケヌションで䜿甚できるこずに気付き始め、モデルをむンタヌフェむス曎新ロゞックから分離し始めたした。

その結果、コンポヌネントアプロヌチを䜿甚しおWebアプリケヌションの構築を開始したした。これにより、HTMLたたはJSXを䜿甚しお䜜成されたテンプレヌトなどを䜿甚しお、コンポヌネントを宣蚀的にモデル化できたした。

これにより、すべおのコンポヌネントに同じUI曎新ロゞックが䜿甚されるようになり、独自の呜什型コヌドよりもはるかに優れおいたす。

コンポヌネントに粟通しおいる人は、なじみのないアプリケヌションに぀いお話しおいる堎合でも、その動䜜を簡単に理解できたす。 , , , , , , , , .

, , , , .

: ,


ES6 2015-, , , . , , , , , . — 
 , , . , — . , , ES6 , ES5. .

, , . , :


, , , :


, :


, , , , . . , , , , , , .

, , .

, . , . , ES6, , , , , « » . , , , -, JS, .

芪愛なる読者 ES6 ?

Source: https://habr.com/ru/post/J329152/


All Articles