JSPスクリプトレットが悪いのに、なぜJSXが良いのですか?


21

React.jsは、コンポーネントと要素のツリーを構築するためのXHTMLのような構文としてJSXを提供します。JSXはJavascriptにコンパイルされ、JSX固有のループまたは条件を提供する代わりに、Javascriptを直接使用します。

<ul>
  {list.map((item) =>
    <li>{item}</li>
  )}
</ul>

まだ説明できていないのは、JSPで類似のコンストラクトが悪いと考えられる場合、なぜこれが良いと考えられるのですか?

JSPのこのようなもの

<ul>
   <% for (item in list) { %>
     <li>${item}</li>
   <% } %>
</ul>

はのようなタグで解決される読みやすさの問題と見なされます<c:forEach>。JSTLタグの背後にある理由は、JSXにも適用できるようです。

  • XHTMLのような構文(山括弧、ネスト)とJava / Javascript(中括弧、コンマ、括弧)を切り替えていない場合は、読みやすくなります。
  • レンダリング関数内で使用可能な完全な言語とプラットフォームがある場合、そこに属さないロジックを入れることを思いとどまらせることはほとんどありません。

JSXが異なる理由を考えることができる唯一の理由は次のとおりです。

  • Javaでは、間違ったことをするインセンティブがありました。JSPはホットリロードされるので、JSPにコードを入れて再構築/再起動のサイクルを避けようとしました。保守性は、即時の生産性のために犠牲になりました。スクリプトレットを廃止し、テンプレート構成体の固定セットに制限することは、実質的に保守性を強化する方法でした。JSの世界にはそのような歪みはありません。

  • JSPとJavaの構文は、<% ... %>Javaコードと要素の生成を区別するための余分な要素や、foreach概念やファーストクラスの機能を持たないJavaのネイティブな構文(最近まで)に不格好です。JSXでループと条件にネイティブJavascriptを使用する構文のペナルティはゼロではありませんが(私の意見では)、JSPほど悪くはなく、ループと条件にJSX固有の要素を導入することを保証するのに十分なほど悪くはありません。

私が見逃している何か他のものがありますか?


1
JSP自体にループがあることは悪いことではないと思います。問題は、スクリプトレットタグにコードを埋め込むことです。これらを破棄してJSTLを使用すると、JSPを単純化する必要があります。また、あなたが指摘するように、追加のボーナスは、JSTL構文がスクリプトレット構文よりも少し不快感が少ないことです。私はJSXに精通していませんが、たぶん、あなたはJSXフラグメントを、推奨されないが防ぐことのできない多くの複雑なロジックで乱用する可能性があると思います。
PhilDin

回答:


11

主に、JSXを作成した人々は、JSPを嫌う人々とは反対しました。こちらの議論をご覧ください:なぜReactを構築したのですか?データの表示と同様に

テンプレートは、ページのロジックと表示を分割するという考えに基づいています。この理論では、javascript(またはjava)コードは表示されるマークアップに関係するべきではなく、マークアップは関係するロジックに関係するべきではありません。基本的に、この区分が、コードをテンプレート(PHP / JSP / ASP)と混合することを容易にするさまざまなテンプレート言語を人々が批判する理由です。

Reactはコンポーネントに基づいています。反応の著者は、コンポーネントのロジックとプレゼンテーションは密接に関連していると主張しており、それらを分割しようとしても意味がありません。代わりに、ページを論理的な断片で分割する必要があります。そのため、ヘッダーバー、コメント、投稿、関連する質問などを個別のコンポーネントに分割できます。しかし、プレゼンテーションから関連する質問のロジックを分けてみても意味がありません。

JSXのようなものとJSPのようなものの主な違いは、JSPがロジック用のJavaを少し含むテンプレート言語であることです。JSXは、htmlのフラグメントを簡単に作成できるようにする構文拡張機能を備えたjavascriptです。強調は異なります。JSXはこのアプローチを採用しているため、最終的にはJSPまたは友人が行うより優れた、よりクリーンなアプローチを作成します。

しかし、最終的には、反応した人がテンプレートを好まなかったという事実に帰着します。彼らは悪い考えだと思い、マークアップとプレゼンテーションのロジックを同じ場所に置くべきだと考えています。


render他のコンポーネントロジックと同じ場所に関数をカプセル化することについて文句を言っているわけではありません。要素生成と他の種類のコードの混合の読みやすさを厳密に懸念しています。
wrschneider

@wrschneider、反応するrender関数は、典型的なテンプレート言語と混合されるコードのタイプでどのように異なりますか?
ウィンストンユワート

3

Reactの部外者として、私はJSXをフレームワークの悪臭の非常に混雑した動物園でのもう1つの「フレームワークの匂い」と見なしました。私はまだそうではないとは確信していません。

「有用」の実行可能な定義は、ライブラリ/フレームワーク/パターンが引き起こすよりも多くの問題を解決することだと思います。JSXがその定義に適合するとはまだ確信していません。それは「風船を絞る」ということわざです...ここで問題をつぶすと、そこから飛び出します。私にとって、JSXは特定の問題を解決しているのではなく、単に「異なる」だけです。

正式なビルドプロセスを必要とするコンパイル可能なセマンティクスを導入するという概念は、状況によっては役立ちます。たとえば、.cssファイルのLESSコンパイルは、cssの周囲に非常に必要な構造を提供します。 「スパゲッティソリューション」に陥りやすい。しかし、Javascriptプリコンパイラは...それほどではありません。


「実用的な実用的な定義は...」というのが大きなポイントです。はい、JSXは私たちが考えているよりも多くの問題を解決します。JSXを使用すると、Reactビューコンポーネントがよりシンプルで表現力豊かになります。浅いレンダリングで単体テストが可能です。匂いがJSPに匂いがあると言うと、エラーの可能性が高くなります。そして、私はjspに甘くはありません。
サガル

申し訳ありませんが、これが質問にどのように答えるかはわかりません。
sleske

スレスケ、文学批評家はそれを質問の「内部読解」と呼ぶでしょう。表面の質問は比較を求めていますが、内部ではフレームワークについて尋ねています。私の答えは、「フレームワークが引き起こす問題よりも多くの問題を解決する」という概念に取り組んでいます。その後、OPは私のコメントを受け取り、その信条を彼の特定のユニークな状況に適用し、JSXが助けか妨害かを判断することができます。一つは、あなたの文はどちらかの問題があなたの正確な結果を引き起こす可能性があるとして、答えやご理解の欠乏の欠乏は、ありますか疑問頼むことを言うことができる
dwoz

1

要するに:

  • フロントエンド開発者は、スクリプトとテンプレートを知っていることが求められます
  • JSXとJSPは両方ともテンプレート言語です
  • JavaScriptはスクリプト言語です
  • Javaはスクリプト言語ではありません

参照資料


0

あなたの説明に基づいてJSXを使用していませんが、JSXフラグメントの仕事はデータを表示することです。つまり、MVCの用語ではビューコンポーネントです。JSXフラグメントは、おそらくデータがどこから来たのかを知りませんし、気にしません。

よく構造化されたJSPページには、ご指摘のようにJSTLディレクティブのみが含まれます。JSTLディレクティブはJSPを単純化するだけなので、スコープからのフェッチ、nullのチェックなどで煩雑になりません。

JSXフラグメントと同じです。JSPの唯一の仕事は、送信元を気にせずに受信したデータをどのように表示するかを把握することです。

要約すると、ビューがJSXであるかJSPであるかにかかわらず、適切に実行している場合、ビューはデータを表示するだけです。

プレゼンテーションをサーバー上ではなくクライアントに移行する理由については、これにより柔軟性が高まります。Webサイトは、Webサービス(たとえば、ReST)を介してデータを取得し、別のクライアントになることができます。後でAndroidまたはiOSのネイティブアプリが必要だと判断した場合、それらはWebサイトと同じWebサービスのセットを使用できます。


JSXはクライアント側でもサーバー側でも使用できることに注意してください。JSXを使用する便利な方法は、サーバー上で初期コントロールをレンダリングし、(サービス呼び出しに応じて)クライアント側でDOM更新を実行することです。とにかく、Reactがビューレイヤーであることは正しいです(Facebookを引用:「多くの人がReactをMVCのVとして使用している」)。
ブライアン

具体的な質問は、React / JSXがループ/条件にネイティブJavascript構文を使用するのが良いことであるのに、JSPがネイティブJava構文(スクリプトレット)を排除した理由です。
wrschneider

すみません、私はその点を逃しました。私は答えを書き始めましたが、それは単に「あなたの推測は私のものと同じくらい良い」場合であることに気付きました。JSXの優れたプレゼンテーションレイヤー構文が役立つ場合がありますが、これはJavaデザイナーにとって重要であり、JSXデザイナーにとっては重要ではないと推測できます。
フィルディン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.