Ưu và nhược điểm của việc triển khai máy chủ javascript? Các plugin và tiện ích mở rộng của trình duyệt. Mô hình kiến ​​trúc mờ

Từ tác giả: chuyển từ React sang Vue, hai năm sau. Việc lựa chọn các framework và thư viện mới là một quá trình thú vị nhưng cũng đầy căng thẳng. Ngay cả sau một số nghiên cứu, bạn cũng không bao giờ biết mình sẽ tìm thấy bộ xương nào trong tủ quần áo của mình.

Tuần trăng mật của tôi kéo dài rất lâu. Sau khoảng 2 năm sử dụng Vue gần như hàng ngày, cuối cùng tôi cũng có thể viết về vấn đề này với một số góc nhìn. Hãy cùng nhìn vào những ưu điểm vốn có của Vue js và đừng quên những nhược điểm. LƯU Ý: Ý kiến ​​cá nhân.

Tốt

khả năng phản ứng

Liên kết dữ liệu là một điều tuyệt vời trong thế giới giao diện. Thay vì quản lý vi mô DOM như chúng tôi đã làm với jQuery, giờ đây chúng tôi tập trung vào dữ liệu. Vue xử lý chúng một cách gọn gàng bằng hệ thống liên kết dữ liệu phản ứng hai chiều.

Để đạt được khả năng phản ứng này, Vue thêm một số getters và setters vào từng biến trạng thái để nó có thể theo dõi các thay đổi và tự động cập nhật DOM (khụ khụ, this.setState()). Cách tiếp cận này không hoàn hảo, như chúng ta sẽ thấy sau.

Bao gồm pin

Với Vue, chúng ta không cần sử dụng các gói không chính thức như MobX hoặc React Router cho các phần quan trọng của ứng dụng. Vue cung cấp Vue Router và Vuex, một công cụ phản ứng giống Redux để quản lý trạng thái. Đây là những thư viện tuyệt vời theo đúng nghĩa của chúng, nhưng thực tế là chúng được thiết kế riêng cho Vue khiến chúng thậm chí còn tốt hơn.

Tốc độ

Vũ rất nhanh. Nó có thể không phải là nhanh nhất nhưng hiệu suất của nó đủ cho phần lớn các dự án web. Lần cuối cùng bạn cần hiển thị và cập nhật hàng nghìn phần tử DOM mỗi giây là khi nào?

mẫu HTML

Đây là một trong những chủ đề gây tranh cãi giữa các nhà phát triển JavaScript. Bất kể sở thích của bạn là gì, các mẫu HTML đã được chứng minh qua nhiều thập kỷ sử dụng bằng nhiều ngôn ngữ và là lựa chọn chính để viết đánh dấu động trong Vue.

Nhưng này, Vue cũng hỗ trợ JSX.

Những điều tốt đẹp khác:

Tách các thành phần tệp bằng HTML, CSS và JavaScript.

Dễ. Khoảng 20 KB (rút gọn + gzip).

Khả năng mở rộng cao (mixins, plugin, v.v.).

Tài liệu xuất sắc (với một số trường hợp ngoại lệ được ghi chú bên dưới).

Có thể được áp dụng dần dần, thậm chí được sử dụng để thay thế cho jQuery.

Chỉ cần bắt đầu sử dụng nó.

Mơ hồ

Mẫu thành phần

Chuyển từ React sang Vue giống như một luồng gió mới. Không còn ràng buộc (cái này) hoặc setState() nữa. Hoan hô! Nhưng sau một thời gian, bạn sẽ bắt đầu đặt câu hỏi về cú pháp chính xác của các thành phần Vue. Các thành phần Vue được tạo bằng cách sử dụng các đối tượng và đây là một ví dụ về việc xác định hàm thành phần:

xuất mặc định ( các phương thức: ( tăng () ( this.count++; ) ) )

xuất khẩu mặc định(

phương pháp: (

tăng() (

cái này. đếm++;

Bạn sẽ thêm một mẫu tương tự cho các thuộc tính được tính toán, trạng thái thành phần, trình quan sát, v.v. Hầu hết mọi thứ trong Vue đều có cú pháp đặc biệt riêng với nhiều mẫu. Và đây là điều tương tự đối với Marco, nhưng nó rõ ràng hơn nhiều:

lớp ( tăng() ( this.state.count++; ) )

lớp học(

tăng() (

cái này. tình trạng. đếm++;

Bây giờ tôi không nói về việc sử dụng hay không sử dụng các lớp, mà nói về thực tế là Vue sử dụng các cấu trúc đối tượng tùy ý thay vì các hàm ngôn ngữ.

Tôi sẽ không trách bạn nếu bạn cảm thấy hơi lộn xộn khi tạo ra những đồ vật khó chịu này. Vue cũng cung cấp cú pháp dựa trên lớp, nhưng sẽ nói thêm về điều đó sau.

Cộng đồng trò chuyện

Cộng đồng Vue giao lưu trên Discord, một phòng trò chuyện dành riêng cho cộng đồng game thủ. Nếu bạn thấy mình đang trong tình huống khó khăn, trò chuyện có thể sẽ là của bạn giải pháp tốt nhất, bởi vì các diễn đàn chính thức là vùng đất sa mạc và bạn không muốn đặt câu hỏi trên Github.

Trò chuyện bẩn, nhưng vấn đề chính là nội dung trò chuyện không thể lập chỉ mục công cụ tìm kiếm. Những câu hỏi tương tự (và các cuộc thảo luận liên quan) chắc chắn sẽ được lặp đi lặp lại nhiều lần.

Xu hướng sử dụng phòng trò chuyện để đặt câu hỏi này có liên quan đến các dự án nguồn mở và tôi nghĩ nó cần được giải quyết. Chúng không tạo cơ hội cho việc học tập tập thể.

Không quá huyền diệu

Miễn là bạn tránh xa con đường quen thuộc thì bạn sẽ ổn thôi, nhưng sau một thời gian, bạn có thể sẽ tìm thấy rất nhiều điều nếu và nhưng nhỏ liên quan đến Vue. Vài ví dụ:

Hệ thống phản ứng chỉ theo dõi những thay đổi trong những điều kiện nhất định. Đừng mong đợi rằng bạn có thể nhập bất cứ điều gì bạn muốn. Rất thường xuyên, bạn có thể muốn đơn giản hóa dữ liệu của mình nhiều nhất có thể để tránh đau đầu. Tất nhiên, tất cả điều này đều được giải thích trong bản in đẹp trong tài liệu.

Hệ thống chuyển tiếp không hoạt động đối với danh sách. Bạn thực sự cần phải sử dụng , hoạt động hơi khác một chút và đưa các phần tử mới vào DOM. Ngoài ra, bạn mong đợi rằng phải có một giải pháp tuyệt vời cho việc này, nhưng bạn sẽ phải tự mình thực hiện nó.

Nếu bạn yêu cầu trạng thái không phản ứng trong một phiên bản thành phần, thì bạn đang bước vào lãnh thổ chưa được khám phá.

Và như thế. Đừng hiểu sai ý tôi, đó không phải là vấn đề lớn, nhưng có vẻ như mỗi khi bạn bắt đầu tìm ra một vấn đề, một điều khó chịu khác lại xuất hiện.

độc ác

Mô hình kiến ​​trúc mờ

Đây là một ví dụ: Xử lý các yêu cầu API trong thành phần hay trong Vuex tốt hơn? Tài liệu này cung cấp các ví dụ về cách xử lý logic API trong Vuex. Thậm chí còn có một sơ đồ đẹp và đầy màu sắc:

Điều này có nghĩa là logic xác thực cũng được đưa vào Vuex? Trình quản lý trạng thái có bắt đầu chặn tất cả logic ứng dụng không?

Đây không phải là những điều hiển nhiên. Hầu hết mọi người sẽ bắt đầu đưa logic không trạng thái vào các hành động của Vuex hoặc tệ hơn là trực tiếp vào các thành phần vì có một video trên trang chủ Vue:

Để trả lời câu hỏi ban đầu: Không nên viết logic API bằng Vuex hoặc các thành phần. Thậm chí còn có ví dụ tốt về cách thực hiện việc này trong các ví dụ về mã chính thức.

Phần kết luận

Ngày càng có nhiều người chuyển sang Vue và tôi nghi ngờ xu hướng này sẽ sớm dừng lại. Nó vẫn chưa được chấp nhận như React (ít nhất là bên ngoài Trung Quốc) và liên tục tranh giành vị trí thứ hai với Angular.

Trước đây, tôi đã lập luận rằng Vue là một thư viện thực dụng, trái ngược với React, điều này có vẻ lý tưởng hơn (“Chúng tôi là JavaScript thuần túy!”). Tôi vẫn nghĩ đó là một phép ẩn dụ hay. Mặt khác, bây giờ tôi cảm thấy rằng chủ nghĩa thực dụng làm tất cả của Vue cần sự tinh tế, sang trọng và đơn giản hơn rất nhiều ở cấp độ người dùng.

Trong 2 năm, trải nghiệm của tôi với Vue rất tích cực. Tôi vẫn chắc chắn đó là quyết định tốt di chuyển nhóm của tôi từ React sang Vue. Không phải vì Vue tốt hơn mà vì nó hoạt động tốt hơn cho chúng ta.

Vue chắc chắn thực hiện những điều nó được thiết kế để làm và thành công trong những lĩnh vực mà những người khác thất bại, nhưng hôm nay tôi không nghĩ về mặt khách quan thì Vue tốt hơn hay tệ hơn những người khác những lựa chọn khả thi. Đó là tất cả.

Tôi mới bắt đầu thử nghiệm với Aptana Jaxer bên cạnh máy chủ javascript cho dự án tiếp theo của tôi. Và tôi có vài câu hỏi về những gì

    Bằng cách sử dụng JS phía máy chủ, chúng ta có thể triển khai toàn bộ ứng dụng web mà không cần sử dụng bất kỳ ngôn ngữ máy chủ(ví dụ: C#, java, v.v.). Hoặc JS phía máy chủ nằm giữa máy chủ web và ngăn xếp ngôn ngữ khác.

    Đây có thực sự là cách tiếp cận tốt nhất?

    Những ưu điểm và nhược điểm là gì?

    Làm thế nào điều này hoạt động tốt về mặt hiệu suất?

    Có bất kỳ triển khai thời gian thực nào (trang web công cộng) chỉ sử dụng JS phía máy chủ (không có ngôn ngữ khác) không?

    Các lựa chọn thay thế có sẵn cho Aptana jaxer (mã nguồn mở) là gì?

    Chúng tôi có thể triển khai các giao dịch và giao dịch maitain db tốt đến mức nào? chúng ta có thể làm điều này trên máy chủ JS không..?

    Có thể tạo các dịch vụ RESTFul và SOAP trên máy chủ JS không..?

Tôi biết điều này quá dài (và những câu hỏi ngây thơ). Tôi chỉ hy vọng ai đó đã tình cờ gặp phải tất cả những điều này khi triển khai JS phía máy chủ.

Đó là điều tôi định hỏi.

Đây có thực sự là một cách tiếp cận tốt hơn so với việc sử dụng các ngôn ngữ phía máy chủ (giả sử là C#), làm cách nào chúng ta có thể so sánh điều này với việc triển khai C# trên một trang web (hiệu suất, tính năng ngôn ngữ)? Và cái nào tốt hơn, chỉ sử dụng JS trên máy chủ hay JS ở lớp giữa giữa ngăn xếp ngôn ngữ khác và máy chủ web?

3 câu trả lời

    Công cụ. Các ngôn ngữ được gõ tĩnh như C# và Java có các công cụ phát triển và thiết kế tuyệt vời. Các ngôn ngữ động như JS vẫn chưa có công cụ hỗ trợ. Cá nhân tôi cho rằng việc giảm đáng kể mã soạn sẵn và mã kiểu phức tạp là quan trọng đối với việc này, nhưng nó vẫn là một nhược điểm lớn nếu bạn đã thực hiện nhiều quá trình phát triển trong IDE. Nếu bạn đang sử dụng IDE, hãy cân nhắc sử dụng jedit cho ngôn ngữ động

    Sự trưởng thành/tiêu chuẩn hóa: Serverside JS vẫn là một mô hình mới và có nhiều người chơi nhưng không có người chiến thắng rõ ràng. ECMA không có tiêu chuẩn cho JS phía máy chủ. Như đã đề cập trong câu trả lời của Brandon, nhóm CommonJS đang cố gắng hình thành các máy chủ JS tiêu chuẩn và Myna có hỗ trợ CommonJS thử nghiệm thông qua Narwhal

Ở tốc độ tính toán thô, một số ngôn ngữ động có thể phù hợp với các ngôn ngữ được biên dịch kiểu tĩnh như C# và Java. Nói như vậy, thật sự không có gì quan trọng. Bất kỳ phần tính toán chuyên sâu nào trong ứng dụng của bạn có thể phải được viết bằng Java hoặc sử dụng thư viện Java hiện có. Ví dụ: tôi sẽ không đề nghị bất kỳ ai viết cơ sở dữ liệu bằng JS. Đối với các ứng dụng web/dịch vụ SOA thực tế, nguyên nhân chính dẫn đến tình trạng chậm lại không phải là tốc độ tính toán thô mà là do mã không hiệu quả, đặc biệt là khả năng truy cập cơ sở dữ liệu. Myna giúp giải quyết vấn đề này bằng cách thực hiện những việc như:

  • bộ nhớ đệm nội bộ của các tập lệnh JS đã biên dịch
  • Sử dụng nội bộ các báo cáo giao dịch cơ sở dữ liệu được chuẩn bị trong bộ nhớ đệm
  • Các đoạn truy vấn và đầu ra trong bộ nhớ đệm
  • Nhóm kết nối cơ sở dữ liệu
  • Hỗ trợ băm ETag tự động
  • Công cụ lập hồ sơ

Nếu ý bạn là một giao dịch như trong "đặt câu lệnh SQL có thể được khôi phục hoặc cam kết" thì Myna chưa hỗ trợ giao dịch. Tôi sẵn sàng triển khai điều này nếu có đủ sự quan tâm.

Nếu bạn muốn nói "JS phía máy chủ có hỗ trợ cơ sở dữ liệu gì?" thì câu trả lời phụ thuộc vào nền tảng. Nền tảng Myna cung cấp các tính năng cơ sở dữ liệu sau:

  • Một ứng dụng quản trị web nơi bạn có thể xác định "nguồn dữ liệu", tức là thông tin kết nối cơ sở dữ liệu. Sau đó, bạn có thể truy vấn các nguồn dữ liệu này theo tên. Myna bao gồm trình điều khiển JDBC cho H2, MySQL, Microsoft SQL Server và Postgresql, nhưng có thể sử dụng bất kỳ nguồn dữ liệu JDBC hoặc ODBC nào
  • Myna.Database và Myna.Table cung cấp quyền truy cập vào cơ sở dữ liệu mà không cần siêu dữ liệu cũng như tạo và sửa đổi bảng.
  • Đối tượng Myna Query hỗ trợ maxRows, phân trang, tham số SQL, trình xử lý hàng tùy chỉnh, truy vấn truy vấn, bộ đệm và hơn thế nữa
  • Đối tượng Myna DataManager hỗ trợ tạo đối tượng ORM.

có thể tạo các dịch vụ RESTFul và SOAP trên máy chủ JS..

Hỗ trợ REST và SOAP là các tính năng dành riêng cho nền tảng. Myna WebService hỗ trợ các giao thức sau:

  • XML-RPC
  • JSON-RPC
  • Ext trực tiếp
  • JSON-Mine (một giao thức đơn giản sử dụng các thông báo dạng thông thường và trả về JSON. Dễ sử dụng từ trình duyệt)

Myna cũng hiểu các phương thức yêu cầu PUT và DELETE, đồng thời cung cấp quyền truy cập vào nội dung của nội dung yêu cầu ở cả dạng văn bản và dạng nhị phân để bạn có thể xử lý các phương thức RESTful này theo cách đặc biệt.

Gỡ lỗi

Gỡ lỗi điểm dừng truyền thống là một cuộc gọi thực sự từ phía máy chủ. Mặc dù Rhino hỗ trợ các móc gỡ lỗi, nhưng việc sử dụng các tiện ích này từ một ứng dụng web không trạng thái là khá hấp dẫn. Cá nhân tôi thậm chí không sử dụng trình gỡ lỗi điểm dừng, ngay cả khi chúng có sẵn (như firebug). Thay vào đó tôi thích viết nhật ký hơn.

Myna.log(loại,nhãn,chi tiết)

sẽ tạo một chuỗi có mức độ ưu tiên thấp để viết thông điệp nhật ký HTML vào cơ sở dữ liệu nhật ký Myna. Những nhật ký này sau đó có thể được tìm thấy thông qua quản trị viên Myna. Nhật ký cũng ghi lại dấu thời gian và mili giây trôi qua để lập hồ sơ. Myna.dump(obj) cũng có thể được sử dụng để thể hiện chế độ xem bảng HTML của bất kỳ đối tượng nào. Myna cũng ghi lại tất cả các trường hợp ngoại lệ chưa được xử lý bằng dấu vết ngăn xếp, bối cảnh mã nguồn và yêu cầu. Giữa dump(), log() và trình xử lý lỗi mặc định, tôi không gặp nhiều khó khăn khi gỡ lỗi mã Myna

Bằng cách sử dụng JS ở phía máy chủ, chúng ta có thể triển khai toàn bộ ứng dụng web mà không cần sử dụng bất kỳ ngôn ngữ phía máy chủ nào (như C#, java, v.v.).

Không cần phải viết mã bằng bất kỳ ngôn ngữ nào khác, mặc dù nhiều máy chủ JavaScript phía máy chủ sử dụng công cụ Rhino, cho phép bạn gọi bất kỳ mã Java nào.

Đây có thực sự là cách tiếp cận tốt nhất?

Tôi không nghĩ JavaScript (với tư cách là một ngôn ngữ) thực sự tốt hơn hay tệ hơn các ngôn ngữ phía máy chủ truyền thống. Nó có những ưu điểm (cùng với các ngôn ngữ động khác như Ruby và Python) như tính linh hoạt, tạo mẫu nhanh (không có ý định chơi chữ), tính linh hoạt, v.v. Mặt khác, nó không có hỗ trợ thư viện như Java và C# hoặc kiểu gõ tĩnh (tôi sẽ không tranh luận về cái nào tốt hơn ở đây; tôi thích cả hai vì những lý do khác nhau).

Nếu muốn tận dụng tốt nhất cả hai thế giới, bạn có thể sử dụng JavaScript làm ngôn ngữ kịch bản được tích hợp trong ứng dụng của mình. Rhino cho Java và JScript.NET giúp thao tác với các đối tượng gốc trong JavaScript dễ dàng hơn. Ví dụ: bạn có thể viết các lớp miền của mình bằng Java hoặc C# và tập lệnh bằng sử dụng JavaScript nơi bạn muốn linh hoạt hơn. Tuy nhiên, nếu bạn đủ thoải mái với JavaScript thì việc viết bằng một ngôn ngữ có thể dễ dàng hơn.

Tôi chưa bao giờ viết "thật" ứng dụng máy chủ sử dụng JavaScript nên tôi không thể đánh giá nó tốt hơn hay kém hơn .NET (Tôi cũng chưa bao giờ sử dụng JScript.NET). Tôi đã chơi thử một vài framework cho vui, mặc dù hiện tại tôi đang viết lại trang web cá nhân của mình bằng Helma NG. Cho đến nay nó đã được kinh nghiệm tốt(tốt hơn nhiều so với PHP, thứ mà tôi chưa bao giờ thích).

Những ưu điểm và nhược điểm là gì?

  • Chỉ cần một ngôn ngữ để lập trình máy chủ và máy khách.
  • Khả năng chia sẻ mã cho những việc như xác thực biểu mẫu. Jaxer cho phép bạn chạy các tập lệnh trên máy khách, máy chủ hoặc cả hai.
  • Bạn nhận được một chương trình JavaScript (giả sử bạn thích ngôn ngữ này).

Sai sót:

  • Nhiều khung đang thử nghiệm/chưa hoàn thiện lắm.
  • Bạn cần lập trình bằng JavaScript (trừ khi bạn thích ngôn ngữ đó).

nó hoạt động như thế nào về mặt hiệu suất?

Hiệu suất gần như tương đương với các ngôn ngữ kịch bản khác.

Có triển khai theo thời gian thực (trang web công cộng) chỉ sử dụng JS ở phía máy chủ (không có ngôn ngữ khác) không?

Tôi không biết bất kỳ trang web lớn nào sử dụng JavaScript, nhưng có thể có một số trang web.

những lựa chọn thay thế nào có sẵn cho Aptana jaxer (mã nguồn mở)

Như lời nói đầu, tôi sử dụng SSJS trong công việc hàng ngày của mình. Chúng tôi đang điều hành một trang web khá lớn (về độ phức tạp cũng như lượt xem trang) trên SpiderMonkey. Tôi sẽ thêm vào câu trả lời xuất sắc của Matthew nơi tôi có kinh nghiệm.

Đây có thực sự là một cách tiếp cận tốt hơn so với việc sử dụng các ngôn ngữ phía máy chủ (giả sử là C#)

"Tốt hơn" thực sự phụ thuộc vào những gì bạn muốn làm với nó. Bản thân JavaScript có một số tính năng tuyệt vời nhưng cũng có một số tính năng khá tệ. Nếu bạn nghiêm túc về việc phát triển JS (máy khách hoặc máy chủ), tôi không thể khuyên bạn nên xem bài thuyết trình của Douglas Crockford. Javascript: Những phần hay nếu bạn chưa làm như vậy. Anh ấy đã thực hiện một công việc tuyệt vời trong việc sắp xếp sự ngầu và anh ấy là một diễn giả tuyệt vời.

Điều lớn nhất tôi thấy còn thiếu trong thế giới SSJS lúc này là sự trưởng thành. Tôi không quen với C#, nhưng JavaScript không có thư viện chuẩn hoàn thiện và không có công cụ phân phối gói hoàn thiện. Đây là một mảnh ghép lớn đối với tôi.

Tuy nhiên, hãy xem nhóm CommonJS. Họ đang làm việc để xác định những điều chính xác này. Ngoài ra, tài liệu Jaxer Api liệt kê các mô-đun tích hợp có trong khung này.

nó hoạt động như thế nào về mặt hiệu suất?

Bản thân JavaScript không phải là ngôn ngữ chậm và cũng không đặc biệt nhanh. Như Matthew đã lưu ý, nó có thể so sánh được với bất kỳ ngôn ngữ kịch bản nào khác mà bạn sẽ sử dụng. Cuộc chiến giữa các nhà cung cấp trình duyệt để xem ai có thể xây dựng nhiều nhất trình duyệt nhanh, cũng sẽ mang lại lợi ích cho đám đông SSJS.

Bộ sưu tập rác tập thể mà nhóm V8 xây dựng trong động cơ của họ là một ví dụ điển hình về điều này. Chấm dứt máy ảo Việc giải phóng các đối tượng không thể truy cập khỏi vùng nhớ heap và lấy lại bộ nhớ của chúng có thể hơi chậm, nhưng họ đã giảm thiểu điều này bằng cách giảm số lượng đối tượng cần kiểm tra khi trình thu gom rác chạy.

chúng tôi có thể triển khai và hỗ trợ các giao dịch db tốt đến mức nào? chúng ta có thể làm điều này trong máy chủ JS không..?

Jaxer có API cơ sở dữ liệu MySQL và SQLite. Như Matthew đã lưu ý, nếu bạn đang sử dụng Rhino, bạn có thể sử dụng api JDBC.

Bây giờ chúng ta đã hoàn thành cú pháp, cuối cùng chúng ta hãy chuyển sang phần thú vị: tìm hiểu những ưu điểm và nhược điểm của việc sử dụng các kiểu tĩnh.

Lợi ích #1: Bạn có thể sớm tìm ra lỗi và lỗi

Kiểm tra kiểu tĩnh cho phép chúng ta kiểm tra xem một bất biến mà chúng ta xác định có đánh giá là đúng mà không cần chạy chương trình hay không. Và nếu có bất kỳ vi phạm nào đối với những bất biến này, nó sẽ được phát hiện trước khi chương trình bắt đầu chứ không phải khi chương trình đang chạy.

Một ví dụ nhanh: giả sử chúng ta có một hàm nhỏ lấy bán kính và tính diện tích:

Const tính Diện tích = (bán kính) => 3,14 * bán kính * bán kính; diện tích var = diện tích tính toán (3); // 28.26
Bây giờ nếu chúng ta muốn truyền bán kính cho một hàm không phải là số (như "kẻ xâm nhập")...

Var diện tích = tính Diện tích("tôi ác"); // NaN
Chúng ta sẽ lấy lại NaN. Nếu một số chức năng dựa trên hàm CalculateArea luôn trả về một số thì điều này sẽ dẫn đến lỗ hổng hoặc sự cố. Không đẹp lắm phải không?

Nếu chúng ta đang sử dụng kiểu tĩnh, chúng ta sẽ định nghĩa loại cụ thể các tham số đã truyền và giá trị trả về cho hàm này:

Const tính Diện tích = (bán kính: số): số => 3,14 * bán kính * bán kính;
Bây giờ hãy thử chuyển một giá trị nào đó không phải là số vào hàm CalculateArea - và Flow sẽ trả về một thông báo tiện lợi và hay:

Tính Khu vực("Tôi là ác quỷ"); ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ gọi hàm tính toánArea("Tôi là ác quỷ"); ^^ ^^^ ^^ ^^ chuỗi. Loại này không tương thích với const CalculateArea = (bán kính: số): số => 3,14 * bán kính * bán kính; ^^ ^^ ^^ số
Bây giờ chúng tôi đảm bảo rằng hàm sẽ chỉ chấp nhận các số hợp lệ làm đầu vào và chỉ trả về kết quả dưới dạng số hợp lệ.

Bởi vì trình kiểm tra loại sẽ cho bạn biết về các lỗi khi bạn viết mã, nên việc này thuận tiện hơn nhiều (và rẻ hơn nhiều) so với việc tìm kiếm lỗi sau khi mã đã được chuyển đến khách hàng.

Lợi ích #2: Bạn có giấy tờ chứng minh cuộc sống

Các loại hoạt động như tài liệu sống động cho cả bạn và những người khác.

Để hiểu cách thực hiện, hãy xem xét một phương thức mà tôi từng tìm thấy trong một cơ sở mã lớn mà tôi đang làm việc:

Hàm tính toánPayoutDate(báo giá, số tiền, phương thức thanh toán) ( let payoutDate; /* business logic */ return payoutDate; )
Thoạt nhìn (cả thứ hai và thứ ba), hoàn toàn không rõ cách sử dụng chức năng này.

Trích dẫn có phải là một con số không? Hoặc một giá trị logic? Phương thức thanh toán có phải là một đối tượng không? Hoặc nó có thể là một chuỗi đại diện cho loại phương thức thanh toán? Hàm có trả về ngày dưới dạng chuỗi không? Hay nó là một đối tượng Date?

Không ý kiến.

Vào thời điểm đó, tôi quyết định đánh giá tất cả logic nghiệp vụ và grep cơ sở mã cho đến khi tôi tìm ra mọi thứ. Nhưng sẽ tốn quá nhiều công sức chỉ để hiểu cách hoạt động của một chức năng đơn giản.

Mặt khác, nếu bạn viết một cái gì đó như thế này:

Hàm tính toánPayoutDate(quote: boolean, money: number, PaymentMethod: string): Ngày ( let payoutDate; /* business logic */ return payoutDate; )
ngay lập tức sẽ thấy rõ loại dữ liệu nào mà hàm chấp nhận và loại dữ liệu mà nó trả về. Đây là một ví dụ về cách sử dụng các kiểu tĩnh để truyền đạt nội dung của một hàm dự định LÀM. Chúng tôi có thể cho các nhà phát triển khác biết những gì chúng tôi mong đợi ở họ và chúng tôi có thể thấy những gì họ mong đợi ở chúng tôi. Lần sau nếu có người sử dụng chức năng này sẽ không còn thắc mắc gì nữa.

Bạn có thể chắc chắn rằng vấn đề này sẽ được giải quyết bằng cách thêm nhận xét vào mã hoặc tài liệu:

/* @function Xác định ngày thanh toán cho báo giá @param (boolean) mua hàng - Đây có phải là báo giá không? Số tiền @param (boolean) - Số tiền mua @param (chuỗi) PaymentMethod - Loại phương thức thanh toán được sử dụng cho giao dịch mua này */ hàm tínhPayoutDate(báo giá, số tiền, phương thức thanh toán) ( let payoutDate; /* .... Logic nghiệp vụ ... . */ trả lại Ngày thanh toán ;
Nó hoạt động. Nhưng ở đây có nhiều nhiều từ ngữ hơn. Ngoài việc dài dòng, những nhận xét như vậy trong mã còn khó duy trì vì chúng không đáng tin cậy và thiếu cấu trúc - một số nhà phát triển viết ý kiến ​​tốt, trong khi những người khác có thể viết điều gì đó khó hiểu và một số thậm chí có thể quên để lại nhận xét.

Đặc biệt rất dễ quên cập nhật nhận xét sau khi tái cấu trúc. Mặt khác, chú thích kiểu có cú pháp và cấu trúc được xác định rõ ràng và chúng sẽ không bao giờ trở nên lỗi thời vì chúng được mã hóa trong chính mã đó.

Lợi ích #3: Loại bỏ việc xử lý lỗi khó hiểu

Các loại giúp loại bỏ việc xử lý lỗi khó hiểu trong mã của bạn. Hãy quay lại hàm tính toán của chúng ta và xem điều này xảy ra như thế nào.

Lần này tôi sẽ chuyển cho nó một mảng bán kính để tính diện tích cho mỗi bán kính:

Const tính Diện tích = (bán kính) => ( var diện tích = ; for (let i = 0; i< radii.length; i++) { areas[i] = PI * (radii[i] * radii[i]); } return areas; };
Hàm này hoạt động nhưng không xử lý đúng cách các đối số đầu vào không hợp lệ. Nếu chúng ta muốn đảm bảo rằng hàm xử lý chính xác các tình huống trong đó các đối số đầu vào không phải là mảng số hợp lệ, thì chúng ta sẽ tạo ra một hàm giống như thế này:

Const tính Diện tích = (bán kính) =>< radii.length; i++) { if (typeof radii[i] !== "number") { throw new Error("Array must contain valid numbers only"); } else { areas[i] = 3.14 * (radii[i] * radii[i]); } } return areas; };
Ồ. Có rất nhiều mã cho một phần chức năng nhỏ như vậy.

Và với các kiểu tĩnh, chúng ta chỉ cần viết:

): Mảng => < radii.length; i++) { areas[i] = 3.14 * (radii[i] * radii[i]); } return areas; };
Bây giờ, chức năng này thực sự trông giống như trước khi thêm tất cả rác trực quan do xử lý lỗi.

Thật dễ dàng để hiểu được lợi ích của kiểu tĩnh phải không?

Lợi ích #4: Bạn có thể tái cấu trúc một cách tự tin hơn

Hãy để tôi giải thích điều này bằng một câu chuyện từ cuộc đời tôi. Một ngày nọ, tôi đang làm việc với một cơ sở mã rất lớn và cần cập nhật một bộ phương thức trong lớp Người dùng. Cụ thể, thay đổi một trong các tham số của hàm từ chuỗi thành đối tượng.

Tôi đã thực hiện thay đổi, nhưng tôi ngại thực hiện - có quá nhiều lệnh gọi hàm này nằm rải rác trong mã nên tôi không chắc mình đã cập nhật chính xác tất cả các phiên bản. Điều gì sẽ xảy ra nếu một cuộc gọi nào đó bị bỏ lại ở đâu đó sâu trong một tệp phụ trợ chưa được kiểm tra?

Cách duy nhất để kiểm tra là gửi mã và cầu nguyện nó không phát sinh một loạt lỗi.

Khi sử dụng kiểu tĩnh, vấn đề này sẽ không phát sinh. Ở đó, tôi sẽ yên tâm rằng nếu tôi cập nhật định nghĩa hàm và kiểu, trình kiểm tra kiểu sẽ ở đó để phát hiện bất kỳ lỗi nào mà tôi có thể đã bỏ sót. Tất cả những gì còn lại là xem xét các loại lỗi này và sửa chúng.

Lợi ích #5: Dữ liệu và hành vi riêng biệt

Một lợi ích hiếm khi được đề cập của kiểu tĩnh là chúng giúp tách dữ liệu khỏi hành vi.

Hãy cùng xem lại hàm CalculateArea của chúng ta với các kiểu tĩnh:

Const tính Diện tích = (bán kính: Mảng ): Mảng => ( var khu vực = ; for (var i = 0; i< radii.length; i++) { areas[i] = 3.14 * (radii[i] * radii[i]); } return areas; };
Hãy xem xét cách chúng ta tiếp cận việc soạn hàm này. Vì chúng ta chỉ định các kiểu dữ liệu nên chúng ta buộc phải suy nghĩ về các kiểu dữ liệu mà chúng ta sẽ sử dụng trước tiên để có thể đặt kiểu của các tham số được truyền và trả về các giá trị cho phù hợp.

Chỉ sau này chúng tôi thực hiện logic:

Khả năng thể hiện chính xác dữ liệu tách biệt với hành vi cho phép chúng tôi đưa ra các giả định rõ ràng và truyền đạt ý định chính xác hơn, điều này giúp giảm bớt gánh nặng tinh thần và mang lại cho người lập trình sự rõ ràng về tinh thần. Nếu không, bạn chỉ cần giữ mọi thứ trong tâm trí bằng cách nào đó.

Lợi ích #6: Loại bỏ toàn bộ danh mục lỗi

Lỗi loại thời gian chạy là một trong những lỗi hoặc lỗi phổ biến nhất mà các nhà phát triển JavaScript gặp phải.

Ví dụ: giả sử trạng thái ban đầu của ứng dụng được đặt thành:

Var appState = ( isFetching: false, messages: , );
Và giả sử sau đó chúng tôi thực hiện lệnh gọi API để tìm nạp tin nhắn và điền vào appState của mình. Tiếp theo, ứng dụng của chúng tôi có một thành phần trình xem được đơn giản hóa quá mức, nhận các tin nhắn (được liệt kê ở trạng thái trên) và hiển thị số lượng tin nhắn chưa đọc và mỗi tin nhắn dưới dạng một mục danh sách:

Nhập tin nhắn từ "./Message"; const MyComponent = (( tin nhắn )) => ( return (

( tin nhắn.map(tin nhắn => )}
); };
Nếu lệnh gọi API để tìm nạp tin nhắn không thành công hoặc trả về không xác định thì bạn sẽ gặp phải lỗi loại trong quá trình sản xuất:

TypeError: Không thể đọc thuộc tính 'độ dài' không xác định
...và chương trình của bạn sẽ bị lỗi. Bạn sẽ mất một khách hàng. Một bức màn.

Hãy xem các loại tĩnh có thể giúp ích như thế nào. Hãy bắt đầu bằng cách thêm các loại Flow vào trạng thái ứng dụng. Tôi đang sử dụng bí danh loại AppState để xác định trạng thái:

Nhập AppState = ( isFetching: boolean, messages: ?Array ); var appState: AppState = ( isFetching: false, messages: null, );
Vì đã biết rằng các API để tìm nạp tin nhắn hoạt động không đáng tin cậy nên chúng tôi sẽ chỉ định loại có thể cho giá trị tin nhắn cho một mảng chuỗi.

Cũng giống như lần trước, chúng tôi lấy tin nhắn qua API không đáng tin cậy và sử dụng chúng trong thành phần chế độ xem:

Nhập tin nhắn từ "./Message"; const MyComponent = (( tin nhắn )) => ( return (

Bạn có ( messages.length ) tin nhắn chưa đọc

( tin nhắn.map(tin nhắn => )}
); };
Nhưng lúc này Flow sẽ phát hiện lỗi và khiếu nại:

^^ ^^ ^^ Thuộc tính `độ dài`. Không thể truy cập thuộc tính trên giá trị null

Bạn có (messages.length) tin nhắn chưa đọc

^^ ^^ ^^ ^^ không có

Bạn có (messages.length) tin nhắn chưa đọc

^^ ^^ ^^ Thuộc tính `độ dài`. Không thể truy cập thuộc tính trên giá trị có thể không xác định

Bạn có (messages.length) tin nhắn chưa đọc

^^ ^^ ^^ ^^ không xác định ( messages.map(message => )) ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ gọi của phương thức `map`. Phương thức không thể được gọi với giá trị có thể là null ( messages.map(message => )) ^^ ^^ ^^ ^^ null ( messages.map(message => )) ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ gọi của phương thức `map`. Phương thức không thể được gọi trên giá trị có thể không xác định ( messages.map(message => )) ^^ ^^ ^^ ^^ không xác định
Đợi một chút, anh bạn!

Vì chúng tôi đã xác định các thông báo thuộc loại có thể nên chúng tôi cho phép nó có giá trị rỗng hoặc không xác định. Nhưng điều này không cho chúng ta quyền thực hiện các thao tác trên nó (như .length hoặc .map) mà không kiểm tra null, vì nếu giá trị của thông báo thực sự là null hoặc không xác định thì sẽ xảy ra lỗi loại khi chúng ta thử thao tác trên Nó.

Vì vậy, hãy quay lại và cập nhật chức năng xem của chúng ta thành một cái gì đó như thế này:

Const MyComponent = (( tin nhắn, isFetching ): AppState) => ( if (isFetching) ( return ) else if (tin nhắn === null || tin nhắn === không xác định) ( return

Không thể tải tin nhắn. Thử lại.
) khác ( trả lại (

Bạn có ( messages.length ) tin nhắn chưa đọc

( tin nhắn.map(tin nhắn => )}
); } };
Bây giờ, Flow biết rằng chúng tôi đã tính đến tất cả các tình huống trong đó thông báo là null hoặc không xác định, do đó việc kiểm tra loại mã không thành công với 0 lỗi. Tạm biệt lỗi thời gian chạy!

Lợi ích #7: Giảm số lượng bài kiểm tra đơn vị

Trước đây chúng ta đã thấy cách các kiểu tĩnh có thể giúp loại bỏ việc phân tích cú pháp lỗi khó hiểu vì chúng đảm bảo các kiểu tham số được truyền cho hàm và trả về các giá trị. Do đó, các kiểu tĩnh cũng làm giảm số lượng bài kiểm tra đơn vị.

Ví dụ: hãy quay lại hàm CalculateAreas của chúng ta với các kiểu động và cách xử lý lỗi.

Const CalculateAreas = (radii) => ( // Xử lý đầu vào không xác định hoặc null if (!radii) ( ném new Error("Thiếu đối số"); ) // Xử lý đầu vào không phải mảng if (!Array.isArray(radii) ) ( ném Lỗi mới("Đối số phải là một mảng"); ) var khu vực = ; for (var i = 0; i< radii.length; i++) { if (typeof radii[i] !== "number") { throw new Error("Array must contain valid numbers only"); } else { areas[i] = 3.14 * (radii[i] * radii[i]); } } return areas; };
Nếu chúng tôi là những lập trình viên siêng năng, chúng tôi có thể xem xét việc kiểm tra các tham số được truyền không hợp lệ để xác minh rằng chúng được chương trình của chúng tôi xử lý chính xác:

It("không hoạt động - trường hợp 1", () => ( Expect(() => CalculateAreas()).to.throw(Error); )); it("không hoạt động - trường hợp 2", () => ( mong đợi(() => tínhAreas(không xác định).to.throw(Error); )); it("không hoạt động - trường hợp 2", () => ( mong đợi(() => CalculateAreas("xin chào")).to.throw(Error); ));
… và như thế. Nhưng rất có thể chúng tôi sẽ quên kiểm tra một số trường hợp nguy hiểm - và khách hàng của chúng tôi sẽ là người phát hiện ra vấn đề. :(

Vì các thử nghiệm chỉ dựa trên các tình huống mà chúng tôi nghĩ ra để thử nghiệm nên chúng mang tính tồn tại và trên thực tế, chúng rất dễ bị bỏ qua.

Mặt khác, khi chúng ta cần đặt loại:

Const tính Diện tích = (bán kính: Mảng ): Mảng => ( var khu vực = ; for (var i = 0; i< radii.length; i++) { areas[i] = 3.14 * (radii[i] * radii[i]); } return areas; };
... chúng tôi không chỉ nhận được sự đảm bảo rằng mục tiêu của chúng tôi phù hợp với thực tế, mà những thử nghiệm như vậy còn đáng tin cậy hơn. Không giống như các bài kiểm tra theo quy tắc ngón tay cái, các loại đều phổ biến và khó đánh bại hơn.

Nếu bạn nhìn nó một cách tổng thể, thì bức tranh là thế này: các bài kiểm tra rất tốt để kiểm tra logic và các loại rất tốt để kiểm tra các loại dữ liệu. Khi chúng được kết hợp lại, tổng của các bộ phận sẽ tạo ra hiệu ứng thậm chí còn lớn hơn.

Lợi ích #8: Công cụ tạo mô hình miền

Một trong những ví dụ yêu thích của tôi về việc sử dụng kiểu tĩnh là lập mô hình miền. Trong trường hợp này, một mô hình được tạo bao gồm cả dữ liệu và hành vi của chương trình dựa trên dữ liệu này. TRONG trong trường hợp này Tốt nhất nên hiểu bằng một ví dụ về cách sử dụng các loại.

Giả sử ứng dụng cung cấp cho người dùng một hoặc nhiều phương thức thanh toán để mua hàng trên nền tảng. Người dùng được phép chọn một trong ba phương thức thanh toán (Paypal, thẻ tín dụng, Tài khoản ngân hàng).

Vì vậy, trước tiên chúng tôi sẽ áp dụng bí danh loại cho ba phương thức thanh toán:

Gõ Paypal = ( id: số, gõ: "Paypal" ); gõ CreditCard = ( id: số, gõ: "CreditCard" ); gõ Ngân hàng = ( id: số, gõ: "Ngân hàng" );
Bây giờ bạn có thể đặt loại PaymentMethod thành một tập hợp rời rạc với ba trường hợp:

Nhập Phương thức thanh toán = Paypal | Thẻ Tín Dụng | Ngân hàng;
Bây giờ hãy tạo một mô hình trạng thái cho ứng dụng của chúng ta. Để đơn giản, hãy giả sử rằng các ứng dụng này chỉ bao gồm các phương thức thanh toán có sẵn cho người dùng.

Kiểu Model = ( PaymentMethods: Array };
Nó có thể chấp nhận được không? Chà, chúng tôi biết rằng để có được phương thức thanh toán của người dùng, bạn cần đưa ra yêu cầu tới API và tùy thuộc vào kết quả cũng như giai đoạn của quy trình, ứng dụng có thể chấp nhận tiểu bang khác nhau. Trong thực tế, có thể có bốn trạng thái:

1) Chúng tôi chưa nhận được phương thức thanh toán.
2) Chúng tôi đang trong quá trình thu thập các phương thức thanh toán.
3) Chúng tôi đã nhận được phương thức thanh toán thành công.
4) Chúng tôi đã cố gắng lấy phương thức thanh toán nhưng đã xảy ra lỗi.

Nhưng loại Mô hình đơn giản của chúng tôi với phương thức thanh toán không bao gồm tất cả các trường hợp này. Thay vào đó, nó giả định rằng PaymentMethods luôn tồn tại.

Ừmmm. Có cách nào để xây dựng một mô hình sao cho trạng thái ứng dụng lấy một trong bốn giá trị này và chỉ chúng không? Chúng ta hãy xem:

Nhập trạng thái ứng dụng = (loại: "Không được tìm nạp" ) | ( gõ: "Đang tìm nạp" ) | ( gõ: "Thất bại", lỗi: E) | ( gõ: "Thành công", phương thức thanh toán: Mảng };
Chúng tôi đã sử dụng loại tập hợp rời rạc để đặt AppState thành một trong bốn trạng thái được mô tả ở trên. Lưu ý cách tôi sử dụng thuộc tính type để xác định ứng dụng đang ở trạng thái nào trong bốn trạng thái. Chính thuộc tính kiểu này sẽ tạo ra một tập hợp rời rạc. Bằng cách sử dụng nó, chúng tôi có thể phân tích và xác định khi nào chúng tôi có phương thức thanh toán và khi nào không.

Bạn cũng sẽ nhận thấy rằng tôi đang chuyển loại tham số E và D sang trạng thái ứng dụng. Loại D sẽ đại diện cho phương thức thanh toán của người dùng (PaymentMethod được xác định ở trên). Chúng ta chưa đặt loại E làm loại lỗi, vì vậy hãy thực hiện điều đó ngay bây giờ:

Gõ HttpError = ( id: string, message: string );
Bây giờ bạn có thể lập mô hình miền ứng dụng:

Loại Model = AppState ;
Nói chung, chữ ký cho trạng thái ứng dụng hiện là AppState trong đó E có dạng HttpError và D là PaymentMethod . Và AppState có bốn (và chỉ bốn) trạng thái có thể xảy ra: Không tìm nạp, Đang tìm nạp, Thất bại và Thành công.

Tôi thấy các mô hình miền như vậy hữu ích cho việc suy nghĩ và thiết kế giao diện người dùng theo các quy tắc kinh doanh nhất định. Các quy tắc kinh doanh cho chúng tôi biết rằng một ứng dụng chỉ có thể ở một trong những trạng thái này và điều này cho phép chúng tôi hiển thị rõ ràng AppState và đảm bảo rằng ứng dụng đó sẽ chỉ ở một trong những trạng thái được xác định trước này. Và khi chúng ta phát triển theo mô hình này (ví dụ: tạo thành phần khung nhìn), điều hiển nhiên là chúng ta cần phải xử lý tất cả bốn trạng thái có thể có.

Hơn nữa, bản thân các tài liệu mã - chỉ cần nhìn vào các tập hợp rời rạc và sẽ ngay lập tức hiểu rõ AppState được cấu trúc như thế nào.

Nhược điểm của việc sử dụng các loại tĩnh

Giống như mọi thứ khác trong cuộc sống và lập trình, việc kiểm tra kiểu tĩnh đòi hỏi một số sự đánh đổi.

Điều quan trọng là phải hiểu và thừa nhận những thiếu sót này để chúng ta có thể đưa ra quyết định sáng suốt khi sử dụng các loại tĩnh là hợp lý và khi chúng đơn giản là không có giá trị.

Dưới đây là một số cân nhắc sau:

Nhược điểm #1: Các kiểu tĩnh yêu cầu phải học trước

Một lý do tại sao JavaScript là một ngôn ngữ tuyệt vời cho người mới bắt đầu là vì người mới bắt đầu không cần phải học toàn bộ hệ thống kiểu trước khi làm việc hiệu quả.

Khi tôi lần đầu học Elm (một ngôn ngữ chức năng được gõ tĩnh), các loại thường gây cản trở. Tôi liên tục gặp phải lỗi trình biên dịch do định nghĩa kiểu của mình.

Học cách sử dụng các loại hình một cách hiệu quả đã là một nửa cuộc chiến trong việc học ngôn ngữ. Kết quả là, đường cong học tập của Elm dốc hơn JavaScript do các kiểu tĩnh của nó.

Điều này đặc biệt quan trọng đối với những người mới bắt đầu, những người có khả năng nhận thức cao nhất từ ​​việc học cú pháp. Việc thêm cú pháp vào hỗn hợp này có thể gây choáng ngợp cho người mới.

Nhược điểm #2: Có thể bị sa lầy vào sự dài dòng

Các kiểu tĩnh thường làm cho chương trình có vẻ dài dòng và lộn xộn hơn.

Ví dụ: thay vào đó:

Hàm không đồng bộ moneyExceedsPurchaseLimit(amount, getPurchaseLimit)( var limit = wait getPurchaseLimit(); return limit > money; )
Chúng ta phải viết:

Hàm không đồng bộ moneyExceedsPurchaseLimit(amount: number, getPurchaseLimit: () => Promise ): Hứa ( var limit = chờ getPurchaseLimit(); giới hạn trả lại > số tiền; )
Và thay vào đó:

Người dùng Var = ( id: 123456, tên: "Preethi", thành phố: "San Francisco", );
Bạn phải viết điều này:

Gõ Người dùng = ( id: số, tên: chuỗi, thành phố: chuỗi, ); var user: User = ( id: 123456, name: "Preethi", city: "San Francisco", );
Rõ ràng, các dòng mã bổ sung được thêm vào. Nhưng có một số lập luận phản đối việc coi đây là một bất lợi.

Đầu tiên, như chúng tôi đã đề cập trước đó, các kiểu tĩnh đang loại bỏ toàn bộ danh mục thử nghiệm. Một số nhà phát triển có thể coi đây là một sự thỏa hiệp hoàn toàn hợp lý.

Thứ hai, như chúng ta đã thấy trước đó, các kiểu tĩnh đôi khi có thể loại bỏ nhu cầu xử lý lỗi phức tạp và điều này giúp giảm đáng kể sự lộn xộn của mã.

Thật khó để nói liệu tính dài dòng có phải là lý lẽ thực sự chống lại các loại hay không, nhưng điều đó đáng để ghi nhớ.

Nhược điểm #3: Cần có thời gian để sử dụng thành thạo các loại.

Phải mất rất nhiều thời gian và thực hành để tìm hiểu cách chọn loại tốt nhất trong một chương trình. Hơn nữa, việc phát triển ý thức tốt về những gì đáng theo dõi một cách tĩnh tại và những gì nên để động tốt nhất cũng đòi hỏi cách tiếp cận, thực hành và kinh nghiệm cẩn thận.

Ví dụ: một cách tiếp cận là mã hóa logic nghiệp vụ quan trọng bằng các kiểu tĩnh, nhưng để lại các phần logic động ngắn hạn hoặc không quan trọng để tránh sự phức tạp không cần thiết.

Biết được sự khác biệt có thể khó khăn, đặc biệt nếu một nhà phát triển ít kinh nghiệm phải đưa ra quyết định nhanh chóng.

Nhược điểm #4: Kiểu tĩnh có thể trì hoãn sự phát triển nhanh chóng

Như tôi đã đề cập trước đó, tôi gặp chút khó khăn với các loại khi học Elm - đặc biệt là khi thêm mã hoặc thực hiện các thay đổi đối với nó. Thường xuyên bị phân tâm bởi các lỗi biên dịch khiến bạn khó hoàn thành công việc và cảm thấy tiến bộ.

Lập luận ở đây là việc kiểm tra kiểu tĩnh có thể khiến lập trình viên mất tập trung quá thường xuyên - và bạn biết đấy, sự tập trung là yếu tố chínhđể viết một chương trình tốt.

Nó không chỉ có vậy. Bộ điều khiển kiểu tĩnh cũng không phải lúc nào cũng lý tưởng. Đôi khi một tình huống phát sinh khi bạn biết phải làm gì, nhưng việc kiểm tra kiểu lại cản trở và cản trở.

Tôi chắc chắn rằng tôi đã bỏ sót một số sai sót khác, nhưng đây là những sai sót quan trọng nhất đối với tôi.

Tôi có nên sử dụng các loại tĩnh trong JavaScript hay không?


Ngôn ngữ lập trình đầu tiên tôi học là JavaScript và Python, cả hai đều là ngôn ngữ được gõ động.

Nhưng việc nắm vững các kiểu tĩnh đã bổ sung thêm một khía cạnh mới vào cách tôi nghĩ về lập trình. Ví dụ, mặc dù ban đầu tôi nhận thấy các thông báo lỗi trình biên dịch liên tục của Elm khiến tôi choáng ngợp, nhưng việc tìm ra các loại và làm hài lòng trình biên dịch đã trở thành bản chất thứ hai và thực sự đã cải thiện kỹ năng lập trình của tôi. Ngoài ra, không có gì thoải mái hơn việc một robot thông minh cho tôi biết tôi đang làm gì sai và cách khắc phục.

Đúng, có những sự đánh đổi không thể tránh khỏi với các kiểu tĩnh, chẳng hạn như quá dài dòng và phải dành thời gian tìm hiểu chúng. Nhưng các loại tăng thêm tính bảo mật và tính chính xác cho các chương trình, điều này loại bỏ tầm quan trọng của những "nhược điểm" này đối với cá nhân tôi.

Các kiểu động có vẻ nhanh hơn và đơn giản hơn nhưng chúng có thể bị lỗi khi bạn thực sự đưa chương trình vào hoạt động. Đồng thời, bạn có thể nói chuyện với bất kỳ nhà phát triển Java nào xử lý các loại tham số phức tạp hơn và họ sẽ cho bạn biết họ ghét chúng đến mức nào.

Cuối cùng, không có giải pháp nào phù hợp cho tất cả ở đây. Cá nhân tôi thích sử dụng các kiểu tĩnh trong các điều kiện sau:

  1. Chương trình này rất quan trọng đối với doanh nghiệp của bạn.
  2. Chương trình có thể sẽ được tái cấu trúc để phù hợp với nhu cầu mới.
  3. Chương trình này phức tạp và có nhiều phần chuyển động.
  4. Chương trình được hỗ trợ bởi một nhóm lớn các nhà phát triển, những người cần hiểu mã nhanh chóng và chính xác.
Mặt khác, tôi sẽ từ chối các loại tĩnh trong các điều kiện sau:
  1. Mã này tồn tại trong thời gian ngắn và không có nhiệm vụ quan trọng.
  2. Bạn tạo một nguyên mẫu và cố gắng tiến về phía trước càng nhanh càng tốt.
  3. Chương trình này nhỏ và/hoặc đơn giản.
  4. Bạn là nhà phát triển duy nhất.
Cái hay của việc phát triển JavaScript ngày nay là nhờ các công cụ như Flow và TypeScript, cuối cùng chúng ta cũng có thể lựa chọn sử dụng các loại tĩnh hoặc JavaScript cũ tốt.

Phần kết luận

Tôi hy vọng những bài viết này đã giúp bạn hiểu được tầm quan trọng của các loại, cách sử dụng chúng và quan trọng nhất là... *Khi* sử dụng chúng.

Khả năng chuyển đổi giữa các loại động và tĩnh là một công cụ mạnh mẽ cho cộng đồng JavaScript và là một công cụ thú vị :)

24/11/14 15.6K

Lập trình không chỉ là một cách để kiếm được số tiền lớn và thậm chí không hoàn toàn là công việc trí óc. Đây là cơ hội để hiểu thế giới xung quanh chúng ta bao gồm những gì, phân tách nó thành các hạt nhỏ và sau đó tập hợp lại nó, được hướng dẫn bởi logic và kiến ​​​​thức của chính chúng ta.

Ngôn ngữ lập trình chỉ là một công cụ để con người xây dựng các quy tắc trong các hệ thống được tạo ra.

Internet mang đến vô số cơ hội mà những bộ óc thông minh và dám nghĩ dám làm đang nắm bắt. Tất nhiên, phát triển web cũng có những công cụ riêng để biến ý tưởng thành hiện thực. Một trong số đó là ngôn ngữ lập trình JavaScript, sẽ được thảo luận trong bài viết này:

thông tin chung

Nhiều người, kể cả những người không liên quan gì đến lĩnh vực CNTT, đều đã nghe đến từ Java. Một ngôn ngữ độc lập với nền tảng mang tính cách mạng trong đó các ứng dụng dành cho hệ thống di động được viết tích cực. Nó được phát triển bởi công ty đầy triển vọng Sun, công ty sau đó thuộc quyền quản lý của Oracle. Nhưng cả hai công ty đều không liên quan gì đến JavaScript:

Tất cả những gì Sun yêu cầu là sự cho phép sử dụng một phần tên. Điều đáng ngạc nhiên là JavaScript hoàn toàn không thuộc sở hữu của bất kỳ công ty nào.

Khi viết ứng dụng web, lập trình JavaScript được sử dụng thường xuyên nhất. Nếu chúng ta liệt kê ngắn gọn các tính năng chính của ngôn ngữ này, chúng ta nên nhấn mạnh những điều sau:

  • Định hướng đối tượng. Việc thực thi chương trình thể hiện sự tương tác của các đối tượng;
  • Việc chuyển đổi kiểu dữ liệu được thực hiện tự động;
  • Hàm đóng vai trò là đối tượng lớp cơ sở. Tính năng này làm cho JavaScript giống với nhiều ngôn ngữ lập trình chức năng như Lisp và Haskell;
  • Tự động xóa bộ nhớ. Cái gọi là thu thập rác làm cho JavaScript tương tự như C# hoặc Java.

Nếu chúng ta nói về bản chất của việc sử dụng JavaScript, thì ngôn ngữ này cho phép bạn “hồi sinh” các trang web bất động bằng cách sử dụng mã có thể được thực thi ( cái gọi là kịch bản). Tức là, chúng ta có thể so sánh với phim hoạt hình, trong đó html và css là các ký tự được vẽ và JavaScript là thứ khiến chúng chuyển động.

Nếu nói về Cú pháp JavaScript, thì nó có các tính năng sau:

  • Đăng ký là quan trọng. Các hàm được gọi là func() và Func() hoàn toàn khác nhau;
  • Sau các toán tử phải có dấu chấm phẩy;
  • Các đối tượng và hoạt động tích hợp;
  • Khoảng trống không được tính. Bạn có thể sử dụng bao nhiêu thụt lề tùy thích cũng như ngắt dòng để định dạng mã của mình.

Mã JavaScript đơn giản nhất trông như thế này:

Phạm vi ứng dụng

Để hiểu tại sao cần có JavaScript và mức độ cần thiết của việc học nó, chúng ta nên nêu bật một số lĩnh vực sử dụng nó ngôn ngữ nhất định lập trình.

  • Phát triển ứng dụng web. Bạn có muốn cài đặt một bộ đếm đơn giản, tổ chức truyền dữ liệu giữa các biểu mẫu hoặc đặt trò chơi trên trang web của mình không? Sau đó JavaScript sẽ tiếp quản trợ lý trung thành trong trường hợp này;
  • "Tham gia tích cực" vào AJAX. Công nghệ này giúp tăng tốc đáng kể hoạt động của ứng dụng bằng cách trao đổi dữ liệu với máy chủ ở chế độ “nền”:

  • hệ điều hành. Một số người có thể chưa biết, nhưng Windows, Linux và Mac có những đối thủ trình duyệt riêng, phần lớn trong số đó được viết bằng JavaScript;
  • Ứng dụng di động;
  • Chuyên ngành. Bất kỳ chuyên ngành lập trình nào ở trường đại học đều bao gồm việc nghiên cứu JavaScript ở mức độ này hay mức độ khác. Điều này là do ngôn ngữ này ban đầu được phát triển dành cho những lập trình viên không giỏi lắm. Các bài học về JavaScript được lồng ghép một cách hợp lý vào khóa học HTML cơ bản nên việc học khá đơn giản.

Ưu điểm và nhược điểm

Đừng nghĩ rằng JavaScript là một loại thuốc chữa bách bệnh cho mọi vấn đề và mọi lập trình viên đều sử dụng ngôn ngữ này với nụ cười trên môi. Mọi thứ trên đời đều có mặt tích cực và Mặt tiêu cực. Đầu tiên, chúng ta hãy lưu ý những thiếu sót.

  • Sự cần thiết phải cung cấp khả năng tương thích giữa nhiều trình duyệt. Vì JavaScript hoạt động như một công nghệ Internet nên bạn phải tuân theo các quy tắc mà nó đặt ra. Mạng toàn cầu. Mã phải chạy chính xác trong tất cả hoặc ít nhất là các trình duyệt phổ biến nhất;
  • Hệ thống kế thừa trong một ngôn ngữ khiến cho việc hiểu chuyện gì đang xảy ra trở nên khó khăn. JavaScript triển khai tính kế thừa dựa trên nguyên mẫu. Những người đã học các ngôn ngữ lập trình hướng đối tượng khác đều quen với " lớp con kế thừa lớp cha " Nhưng trong JavaScript, những thứ như vậy được xử lý trực tiếp bởi các đối tượng và điều này nằm ngoài tầm hiểu biết của bạn;
  • Không có thư viện tiêu chuẩn. JavaScript không cung cấp bất kỳ khả năng nào để làm việc với tệp, luồng I/O hoặc những thứ hữu ích khác;
  • Cú pháp nói chung làm cho nó khó hiểu. Vẻ đẹp của code rõ ràng không phải là điểm mạnh của JavaScript, nhưng nguyên tắc chính của các lập trình viên được tuân thủ: “ Làm? Đừng chạm vào!».

Bây giờ điều đáng chú ý là một số lợi thế

  • JavaScript cung cấp một số lượng lớn cơ hội để giải quyết nhiều vấn đề khác nhau. Tính linh hoạt của ngôn ngữ cho phép sử dụng nhiều mẫu lập trình liên quan đến các điều kiện cụ thể. Trí óc sáng tạo sẽ có được niềm vui thực sự;
  • Sự phổ biến của JavaScript mở ra một số lượng đáng kể các thư viện được tạo sẵn cho lập trình viên, có thể đơn giản hóa đáng kể việc viết mã và loại bỏ các khiếm khuyết về cú pháp;
  • Ứng dụng trong nhiều lĩnh vực. Rộng Khả năng JavaScript mang đến cho các lập trình viên cơ hội thử sức mình với tư cách là nhà phát triển nhiều loại ứng dụng và điều này tất nhiên sẽ thúc đẩy sự quan tâm đến các hoạt động nghề nghiệp.

Đừng chú ý đến thực tế là có nhiều điểm trừ hơn điểm cộng. JavaScript đã cố thủ vững chắc trong thị trường ngách của nó và không có lời chỉ trích nào có thể đánh bật nó ra khỏi đó vào lúc này.

Dành cho những ai muốn học

Phức tạp và một cách lâu dài dành cho những người quyết định nghiên cứu kỹ lưỡng về JavaScript. Đối với người mới bắt đầu, có những khuyến nghị cơ bản, theo đó bạn có thể đơn giản hóa đáng kể việc học của mình.

  • Trước hết, HTML. Bạn không thể bắt đầu làm bất cứ điều gì cho Internet nếu không có kiến ​​thức cơ bản. Cascading Style Sheets (CSS) cũng sẽ rất hữu ích;
  • Sử dụng văn học mới. Lập trình không phải là vật lý, các quy luật của nó là không thể phá vỡ, và các sách giáo khoa mới là những sách cũ đã được lược bỏ. Công nghệ CNTT không ngừng phát triển và không nên bỏ qua những cập nhật hữu ích;
  • Cố gắng tự viết tất cả các phần của chương trình. Nếu có điều gì đó không ổn, bạn có thể mượn mã của người khác, nhưng chỉ sau khi bạn đã hiểu rõ từng dòng trước tiên;
  • Gỡ lỗi là người bạn tốt nhất của bạn. Việc phát hiện lỗi nhanh chóng là một trong những những khoảnh khắc quan trọng nhất trong lập trình;
  • Đừng bỏ qua các quy tắc định dạng. Tất nhiên, mã sẽ không trở nên tốt hơn hay tệ hơn từ số lượng khác nhau thụt lề và khoảng trắng, nhưng người lập trình dễ đọc và hiểu cũng là một điểm quan trọng. Mã dưới đây? rất khó nhận biết, đặc biệt nếu bạn không phải là anh ấy

  • Tên biến phải có ý nghĩa từ vựng. Trong quá trình viết các chương trình đơn giản, điều này tưởng chừng như không quan trọng chút nào, nhưng khi số dòng mã vượt quá một nghìn dòng thì lũ quỷ dữ đều gãy chân;

phát triển web

Vue.JS: tính năng, ưu điểm và nhược điểm

Vue.JS là tên của framework front-end này mà chúng ta nghe thấy ngày càng thường xuyên hơn. Nói một cách khoa trương thì hiện tại anh ấy đang ở đỉnh cao của sự nổi tiếng. Thực tế này không thể thoát khỏi đội ngũ front-end của chúng tôi. Chúng tôi quyết định tìm hiểu kỹ lý do Vue.JS xuất hiện và nó giải quyết được những vấn đề gì.

Giới thiệu

Việc triển khai giao diện người dùng web phải đối mặt với những thách thức ngày càng phức tạp đòi hỏi phải sử dụng các công cụ ngày càng phức tạp. Hãy thêm vào đây xu hướng rời xa kiến ​​trúc ứng dụng MVC và chúng ta nhận được một xu hướng khá thú vị. Các nhà phát triển hiện đại có xu hướng sử dụng các thư viện riêng biệt cho từng lớp nhiệm vụ. Trong bối cảnh của những thay đổi này, khung Vue.JS đã xuất hiện và bắt đầu trở nên phổ biến.

Về mặt lý thuyết, nó là một giải pháp thay thế cho jQuery. Nhưng trên thực tế, Vue.JS cạnh tranh khá thành công với React.JS, người dẫn đầu rõ ràng trong không gian View. Trong số các công nghệ phổ biến hiện đại giải quyết các vấn đề tương tự, chúng ta cũng có thể nêu bật Angular và Ember. Mỗi người trong số họ đều có những ưu điểm và nhược điểm riêng. Tuy nhiên, tất cả các khuôn khổ này có thể quy về một mẫu số chung - độ phức tạp tương đối của quá trình phát triển.

Tính năng của Vue.JS

Vue.JS được tạo ra dựa trên những phương pháp thực hành tốt nhất của các công nghệ được liệt kê. Nhóm Vue đã mượn ý tưởng về DOM ảo từ React.JS. Cách tiếp cận này loại bỏ sự tương tác trực tiếp với các nút giao diện. Công việc ban đầu được thực hiện với bản sao nhẹ (DOM ảo). Và chỉ sau khi thay đổi này được áp dụng cho các nút giao diện thực tế. Đồng thời, xảy ra sự so sánh giữa cây DOM thực và bản sao ảo của nó. Bằng cách này, sự khác biệt được xác định và chỉ những gì đã thay đổi mới được vẽ lại.

Tôi đã mượn liên kết dữ liệu hai chiều từ Angular Vue.JS. Điều này cho phép bạn thiết kế các giao diện: đầu tiên, mang tính khai báo; thứ hai, sử dụng Vue trong công cụ tạo mẫu. Chẳng hạn như Haml hoặc Pug. Tuy nhiên, chúng tôi lưu ý rằng phương pháp này đã được thực hiện trước đây. Ví dụ: trong khung Knockout.JS.

Cốt lõi của Vue.JS, giống như React, chỉ chứa các chức năng cần thiết để hoạt động với giao diện. Do đó, nó nhỏ gọn, dễ dàng tích hợp với các công nghệ khác, bao gồm cả jQuery và thậm chí có thể được sử dụng thay thế (để phát triển các giao diện đơn giản).

Ngoài ra, Vue còn có sẵn một số plugin triển khai cách tiếp cận hiện đại để phát triển ứng dụng web. Chúng ta đang nói về điều gì vậy? Ví dụ: hầu hết tất cả các ứng dụng React đều được thiết kế song song với công nghệ kiểm soát trạng thái Redux, đây là một thư viện riêng biệt và triển khai kiến ​​trúc thông lượng. Cách tiếp cận của thư viện Redux hóa ra khá thuận tiện và thành công. Vì vậy, Vue.JS đã phát triển công nghệ giám sát trạng thái ứng dụng của riêng mình - Vuex. Vuex hoàn toàn mượn ý tưởng từ Redux, nhưng mức độ tích hợp của thư viện này với Vue cao hơn nhiều so với trường hợp của React và Redux. Và điều này chuyển thành tốc độ và sự tiện lợi.

Chúng ta không nên quên rằng sự thành công của một công nghệ phụ thuộc trực tiếp vào hoạt động của người dùng nó. Đó là cộng đồng nhà phát triển. Vì vậy, React, có lẽ là công nghệ phổ biến nhất, có số lượng lớn các tiện ích mở rộng cho chức năng chính. Chúng được tạo bởi các thành viên cộng đồng và các nhà phát triển React có bộ công cụ cho mọi trường hợp. Vue.JS hoạt động không tốt về mặt này. Ít nhất là bây giờ. Tuy nhiên, công nghệ này đang phát triển và đã có nhiều thư viện hữu ích giúp giải quyết hầu hết các vấn đề cấp bách của các nhà phát triển.

Kinh nghiệm sử dụng trên một dự án thực tế

Chúng tôi phải đối mặt với nhiệm vụ phát triển một giao diện chứa bản đồ, bộ lọc, kết quả lọc và một số yếu tố tương tác trên một trang. Chúng tôi biết rõ rằng việc sử dụng Vanilla JavaScript hoặc jQuery đơn giản có thể gây ra khó khăn trong quá trình phát triển. Tại sao không phải là React.js? Bởi vì Vue.JS đơn giản và nhẹ nhàng hơn. Tại sao phải bận tâm đến một framework nặng hơn để phát triển một giao diện duy nhất?

Chúng tôi đã xem xét kỹ Vue.JS trong một thời gian dài và nhận ra rằng những ưu điểm của nó có thể mang lại cho chúng tôi lợi nhuận thực sự. Kết quả là, một quyết định cơ bản đã được đưa ra là “thử nghiệm” công nghệ này trong thực tế.

Đây là một ví dụ nhỏ về khởi tạo ứng dụng Vue.

Trong app.js, biến ứng dụng được tạo dưới dạng đối tượng Vue. Hàm tạo duyệt qua mẫu template.haml và tạo các liên kết cần thiết.

Việc khai báo trong Vue dễ dàng đến mức nó cho phép chúng tôi tích hợp nó vào một ứng dụng web nguyên khối bằng cách sử dụng công cụ tạo khuôn mẫu Haml.

Ở đây, tùy thuộc vào tính trung thực của cờ 'filtersOpen', lớp 'rentbuy__filters—open' được thêm hoặc xóa khỏi phần tử

Vue.JS ngoài việc thực hiện mọi thứ cách tiếp cận hiện đại trong phát triển giao diện người dùng web, là một khung cực kỳ dễ học, linh hoạt và tích hợp cao với các công nghệ của bên thứ ba. Việc tạo khuôn mẫu của Vue đã cho chúng tôi khả năng liên kết các thành phần trường bộ lọc với các trường của một đối tượng. Điều này giúp bạn luôn có sẵn các tùy chọn lựa chọn cập nhật và giúp việc xác thực và làm sạch bộ lọc trở nên dễ dàng hơn.

Ở đây, các giá trị của các trường đầu vào được liên kết với các trường của đối tượng “dữ liệu” bằng cách sử dụng liên kết hai chiều. Điều này khiến trường đối tượng thay đổi khi giá trị trong trường đầu vào thay đổi và ngược lại.

Nhờ khả năng phản ứng của Vue.JS, chúng tôi đã loại bỏ được tình trạng trùng lặp mã. Làm sao chuyện này lại xảy ra? Trong một số trường hợp, tập hợp các trường bộ lọc trùng khớp một phần (tùy thuộc vào trạng thái của ứng dụng). Có một mối đe dọa thực sự về việc sao chép mã lớn. Tuy nhiên, bằng cách sử dụng các vị từ đơn giản được xác định trong mẫu, bạn có thể chuyển đổi nhanh chóng và thuận tiện giữa các nhóm trường.

Ở đây khối có trường đầu vào hiển thị trên trang khi điều kiện được đáp ứng

Ngoài ra, nhờ tính linh hoạt của Vue.JS, chúng tôi có thể tận dụng sự phát triển dựa trên thành phần trong các thành phần danh sách kết quả lọc. Như bạn còn nhớ, framework của chúng tôi sử dụng công nghệ DOM ảo. Theo đó, với sự xuất hiện của các kết quả mới, các thành phần hiện tại sẽ không được vẽ lại. Điều này chuyển thành tốc độ và sự thoải mái cho người dùng.

Các phần tử từ mảng 'thuộc tính' được hiển thị dưới dạng 'đề xuất' thành phần Vue. Tập hợp các phần tử trên trang sẽ tự động thay đổi theo những thay đổi trong mảng. Thành phần 'đề xuất' là một thành phần thông thường mẫu HTML, mã của nó được đặt trong thẻ script có loại 'text/x-template'

Cũng lưu ý rằng Vue theo dõi vòng đời các thành phần. Nghĩa là, bạn có thể áp dụng bất kỳ phương thức nào cho chúng (thay đổi, xóa, v.v.) sau khi khởi tạo và đính kèm vào cây DOM. Đặc biệt, chúng ta có thể dễ dàng khởi tạo ứng dụng khi tải trang trên trình duyệt. Ví dụ: yêu cầu lựa chọn phần tử ban đầu, tùy thuộc vào kích thước hiện tại của bản đồ trên trang của người dùng.

Kiến trúc ứng dụng Vue cung cấp sự phân tách đơn giản và rõ ràng giữa các phương thức, thành phần và dữ liệu. Mã trở nên dễ đọc hơn, dễ mở rộng hơn và cho phép bạn tích hợp trực tiếp các công nghệ của bên thứ ba vào các phương thức ứng dụng Vue. Kết quả là việc phát triển giao diện mất tương đối ít thời gian. Mã hóa ra nhỏ gọn và dễ dàng mở rộng. Và tính linh hoạt của Vue.JS đã góp phần tạo nên sự kết hợp của nó với các công nghệ khác.

Lợi ích của Vue.JS

Sau khi nghiên cứu các tính năng chính của công nghệ và thử nghiệm chúng trong thực tế, chúng ta có thể liệt kê những ưu điểm chính của Vue framework:

  • Thư viện khá đơn giản và đầy đủ chức năng. Để hiểu được nó, bạn cần có một lượng kiến ​​​​thức tối thiểu.
  • Không có yêu cầu về ngăn xếp, vì vậy Vue.JS có thể được sử dụng trên bất kỳ dự án nào.
  • Khung nặng khá nhiều. Chúng tôi tiết kiệm thời gian tải trang và nhận được rất nhiều lợi ích: cộng với chuyển đổi, cộng với UX, cộng với xếp hạng tìm kiếm, v.v.
  • Tốc độ phát triển khá nhanh. Nhờ sử dụng bất kỳ mẫu nào và sự sẵn có của tài liệu, hầu hết các vấn đề phát sinh đều được giải quyết khá nhanh chóng. Bao gồm so với React, vì trong hầu hết các ứng dụng không có giao diện phức tạp, tất cả sức mạnh của khung này hơi dư thừa.
  • Khả năng tìm kiếm và kết nối với dự án của hầu hết mọi nhà phát triển ít nhất có chút quen thuộc với việc phát triển front-end. Rào cản gia nhập thấp cho phép cả nhà phát triển front-end và back-end làm việc với framework.

Vue cho phép bạn tạo ứng dụng chức năng, phù hợp với tất cả tiêu chuẩn hiện đại, với sự kết nối tối thiểu của các tài nguyên mới và trên thực tế, rẻ hơn.

Nhược điểm của Vue.JS

Cũng có những nhược điểm. Đặc biệt so với React.JS.

  • Hoạt động trên trạng thái ứng dụng diễn ra “dưới mui xe”. TRONG dự án quy mô lớnĐiều này có thể dẫn đến hoạt động của các thành phần không rõ ràng, điều này thường tạo ra các vấn đề về gỡ lỗi và phát triển hiệu quả.
  • Cách tiếp cận thành phần trong Vue.JS không linh hoạt và rõ ràng như trong React.
  • Hệ thống kết xuất React có nhiều chức năng hơn. Nó cung cấp nhiều tùy chọn gỡ lỗi hơn.
  • Tạo khuôn mẫu phản ứng linh hoạt hơn nhiều (JS so với DSL).

Phần kết luận

Vue.JS triển khai tất cả các phương pháp tiếp cận hiện đại để phát triển giao diện người dùng web và là một framework dễ học, linh hoạt và tích hợp cao với các công nghệ của bên thứ ba. Tất nhiên, về mặt tạo giao diện phức tạp (ví dụ: đối với trang web công ty), React vượt trội hơn. Nhưng để giải quyết các vấn đề tương đối đơn giản, việc sử dụng Vue dường như không chỉ hợp lý mà còn thích hợp hơn.

Đã chuẩn bị bài viết

Phòng phát triển web

Phát triển chuyên nghiệp các trang web và ứng dụng trên phía máy chủ và phía máy khách. Thiết kế thiết kế, bố cục trang và BẢO TRÌ các dự án đã triển khai.