Tại sao JSX tốt, khi các scriptlets của JSP là xấu?


21

React.js cung cấp JSX như một cú pháp giống XHTML để xây dựng một cây các thành phần và thành phần. JSX biên dịch thành Javascript và thay vì cung cấp các vòng lặp hoặc các điều kiện trong JSX thích hợp, bạn sử dụng Javascript trực tiếp:

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

Điều mà tôi chưa thể giải thích được là tại sao điều này được coi là tốt nếu các cấu trúc tương tự được coi là xấu trong JSP?

Một cái gì đó như thế này trong JSP

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

được coi là một vấn đề dễ đọc được giải quyết với các thẻ như <c:forEach>. Lý do đằng sau các thẻ JSTL cũng có vẻ như chúng có thể áp dụng cho JSX:

  • nó dễ đọc hơn một chút khi bạn không chuyển đổi giữa cú pháp giống XHTML (dấu ngoặc góc, lồng nhau) và Java / Javascript (curlies, dấu phẩy, parens)
  • khi bạn có sẵn ngôn ngữ và nền tảng đầy đủ để sử dụng bên trong chức năng kết xuất, sẽ ít khiến bạn nản lòng khi đưa logic vào đó không thuộc về nơi đó.

Những lý do duy nhất tôi có thể nghĩ về lý do tại sao JSX khác biệt là:

  • trong Java, bạn đã có động cơ để làm điều sai trái - JSP sẽ được tải lại nóng, do đó, việc đưa mã vào các tệp JSP để tránh chu kỳ xây dựng lại / khởi động lại là rất hấp dẫn. Bảo trì đã được hy sinh cho năng suất ngay lập tức. Xua đuổi các tập lệnh và giới hạn trong một tập hợp các cấu trúc mẫu cố định thực sự là một cách để thực thi khả năng bảo trì. Không có sự biến dạng như vậy tồn tại trong thế giới JS.

  • Cú pháp của Java và Java rất khó hiểu khi có thêm <% ... %>phân biệt mã Java với việc tạo phần tử và với cú pháp gốc của Java thiếu một foreachkhái niệm hoặc các hàm hạng nhất (cho đến gần đây). Hình phạt cú pháp của việc sử dụng Javascript gốc cho các vòng lặp và các điều kiện trong JSX là khác không (theo ý kiến ​​của tôi) nhưng không tệ như JSP và được cho là không đủ tệ để đảm bảo giới thiệu các phần tử đặc thù của JSX cho các vòng lặp và điều kiện.

Có cái gì khác tôi đang thiếu?


1
Tôi không nghĩ rằng thật tệ khi có các vòng lặp trong tệp JSP của bạn, vấn đề là ở chỗ nhúng mã trong các thẻ scriptlet. Nếu bạn loại bỏ những thứ này và sử dụng JSTL thì bạn sẽ buộc phải đơn giản hóa các tệp JSP của mình. Ngoài ra, như bạn chỉ ra, một phần thưởng bổ sung là cú pháp JSTL ít chói tai hơn cú pháp scriptlet. Mặc dù tôi không quen thuộc với JSX, nhưng tôi đoán là bạn có thể lạm dụng các đoạn JSX với rất nhiều logic phức tạp không được khuyến nghị nhưng điều đó sẽ không ngăn chặn được.
PhilDin

Câu trả lời:


11

Chủ yếu, những người tạo ra JSX không đồng ý với những người không thích JSP. Xem cuộc thảo luận của họ ở đây: Tại sao chúng tôi xây dựng React? cũng như hiển thị dữ liệu

Mẫu dựa trên ý tưởng tạo ra sự phân chia giữa logic và cách trình bày của một trang. Theo lý thuyết này, mã javascript (hoặc java) của bạn không nên quan tâm đến việc đánh dấu nào được hiển thị và đánh dấu của bạn không nên quan tâm đến bất kỳ logic nào liên quan. Sự phân chia này về cơ bản là lý do tại sao mọi người chỉ trích các ngôn ngữ mẫu khác nhau cho phép trộn mã với mẫu của bạn (PHP / JSP / ASP).

Phản ứng dựa trên các thành phần. Các tác giả của phản ứng lập luận rằng logic và cách trình bày của một thành phần được kết nối chặt chẽ và cố gắng phân chia chúng không có ý nghĩa gì. Thay vào đó, một trang nên được phá vỡ bởi các mảnh hợp lý. Vì vậy, bạn có thể chia thanh tiêu đề, bình luận, bài đăng, câu hỏi liên quan, vv thành các thành phần riêng biệt. Nhưng nó không có ý nghĩa để thử và phân chia logic cho các câu hỏi liên quan từ bài thuyết trình.

Sự khác biệt chính giữa một cái gì đó như JSX và một cái gì đó giống như JSP là JSP là một ngôn ngữ mẫu bao gồm một chút java cho logic. JSX là javascript với phần mở rộng cú pháp để giúp dễ dàng xây dựng các đoạn html. Sự nhấn mạnh là khác nhau. Vì JSX chấp nhận cách tiếp cận này, nên cuối cùng nó tạo ra một cách tiếp cận gọn gàng hơn, đẹp hơn sau đó được thực hiện bởi JSP hoặc bạn bè.

Nhưng cuối cùng, thực tế là những người thực hiện phản ứng không thích mẫu. Họ nghĩ rằng đó là một ý tưởng tồi, và rằng bạn nên đặt đánh dấu và logic trình bày của bạn ở cùng một nơi.


Tôi không phàn nàn về việc đóng gói renderchức năng ở cùng một nơi với logic thành phần khác. Tôi thực sự quan tâm đến khả năng đọc phần tử trộn với các loại mã khác.
wrschneider

@wrschneider, một renderhàm phản ứng khác nhau như thế nào trong các loại mã được trộn lẫn với ngôn ngữ mẫu điển hình của bạn?
Winston Ewert

3

Là một người ngoài cuộc với React, tôi đã xem JSX như là một "mùi khung" khác trong vườn thú rất đông đúc của mùi hôi thối. Tôi vẫn không tin rằng đây không phải là trường hợp.

Tôi nghĩ rằng một định nghĩa khả thi của "hữu ích" là một thư viện / khung / mẫu giải quyết được nhiều vấn đề hơn nó gây ra. Tôi vẫn chưa tin rằng JSX phù hợp với định nghĩa đó. Đó là câu thành ngữ "bóp bóng bay" ... bạn có một vấn đề ở đây, nó xuất hiện ở đó. Đối với tôi, JSX không giải quyết bất kỳ vấn đề cụ thể nào ... nó chỉ là "khác biệt".

Khái niệm giới thiệu một ngữ nghĩa có thể biên dịch cần một quy trình xây dựng chính thức là hữu ích trong một số trường hợp: ví dụ, biên dịch LESS của các tệp .css cung cấp một số cấu trúc rất cần thiết xung quanh css, do đó là cấu trúc phân cấp với nhập và ghi đè, do đó rất dễ bị "giải pháp spaghetti." Nhưng trình biên dịch trước Javascript ... không quá nhiều.


"Một định nghĩa khả thi về hữu ích là ..." đó là điểm tuyệt vời. Và vâng, JSX giải quyết được nhiều vấn đề hơn chúng ta nghĩ. Thành phần khung nhìn React đơn giản và biểu cảm hơn với JSX. nó có thể là đơn vị thử nghiệm với kết xuất nông. Nếu bạn nói mùi thì JSP có thể có mùi và nó có nhiều khả năng xảy ra lỗi hơn. Và tôi không phải là jsp nhanh nhất.
Sagar

Xin lỗi, nhưng tôi không thấy cách này trả lời câu hỏi.
sleske

Sleske, những người chỉ trích văn học sẽ gọi nó là "đọc bên trong" của câu hỏi. Câu hỏi trên bề mặt yêu cầu so sánh, nhưng bên trong nó hỏi về khung. Câu trả lời của tôi đề cập đến khái niệm "khung giải quyết nhiều vấn đề hơn những gì chúng gây ra." OP sau đó có thể lấy nhận xét của tôi, áp dụng sự tín nhiệm đó vào tình huống cụ thể, duy nhất của anh ấy và quyết định xem JSX là trợ giúp hay cản trở. Người ta có thể nói rằng tuyên bố của bạn đặt ra câu hỏi liệu có sự thiếu hụt trong câu trả lời hay sự thiếu hụt trong sự hiểu biết của mình, là một trong hai vấn đề có thể gây ra kết quả chính xác của bạn
dwoz

1

Nói ngắn gọn:

  • Các nhà phát triển front-end dự kiến ​​sẽ biết kịch bản và tạo khuôn mẫu
  • JSX và JSP đều là ngôn ngữ tạo khuôn mẫu
  • JavaScript là ngôn ngữ kịch bản
  • Java không phải là ngôn ngữ kịch bản

Tài liệu tham khảo


0

Mặc dù tôi không sử dụng JSX, dựa trên mô tả của bạn, công việc của đoạn JSX là trình bày dữ liệu, nghĩa là, đó là một thành phần xem trong cách nói của MVC. Đoạn mã JSX có lẽ không biết hoặc không quan tâm dữ liệu đến từ đâu là thứ bạn muốn.

Một trang JSP có cấu trúc tốt sẽ chỉ chứa các chỉ thị JSTL như bạn đề cập. Các chỉ thị của JSTL chỉ đơn giản hóa các tệp JSP của bạn để chúng không bị lộn xộn với việc tìm nạp từ phạm vi, kiểm tra null, v.v.

Cũng giống như đoạn JSX; công việc duy nhất của JSP phải là tìm ra cách trình bày dữ liệu mà nó đã nhận được mà không phải lo lắng về việc nó đến từ đâu.

Tóm lại, cho dù chế độ xem của bạn là JSX hay JSP, nếu bạn thực hiện đúng thì chế độ xem của bạn sẽ chỉ hiển thị dữ liệu.

Về lý do tại sao bạn có thể chuyển bản trình bày sang máy khách thay vì thực hiện trên máy chủ, điều này mang lại cho bạn sự linh hoạt hơn. Trang web của bạn có thể lấy dữ liệu của mình thông qua các dịch vụ web (ví dụ ReST) và chỉ là một khách hàng khác. Nếu sau này bạn quyết định rằng bạn muốn có một ứng dụng Android hoặc iOS gốc, họ có thể sử dụng cùng một bộ dịch vụ web như trang web của bạn.


Lưu ý rằng JSX có thể được sử dụng phía máy khách hoặc phía máy chủ. Cách ưa thích để sử dụng JSX là hiển thị các điều khiển ban đầu trên máy chủ và sau đó thực hiện các cập nhật DOM (để đáp ứng các cuộc gọi dịch vụ) phía máy khách. Dù sao đi nữa, bạn đã đúng rằng React là lớp view ( trích dẫn Facebook : "Rất nhiều người sử dụng React như V trong MVC").
Brian

Câu hỏi cụ thể là tại sao React / JSX coi đó là một điều tốt khi sử dụng cú pháp Javascript gốc cho các vòng lặp / điều kiện trong khi JSP loại bỏ cú pháp Java gốc (scriptlets).
wrschneider

Xin lỗi, tôi đã bỏ lỡ điểm đó. Tôi bắt đầu soạn một câu trả lời nhưng rồi nhận ra đó chỉ đơn giản là một trường hợp "dự đoán của bạn cũng tốt như của tôi". Một cú pháp lớp trình bày đẹp cho JSX có thể hữu ích, tôi chỉ có thể phỏng đoán rằng điều này quan trọng đối với các nhà thiết kế Java chứ không phải đối với các nhà thiết kế JSX.
PhilDin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.