Làm thế nào để một lập trình viên sử dụng ngôn ngữ tĩnh đối phó với việc thiếu công cụ Javascript


28

Tôi đã lập trình khá nhiều độc quyền bằng các ngôn ngữ được biên dịch, đặc biệt là Java, trong phần lớn sự nghiệp của tôi. Một trong những điều yêu thích của tôi về Java là bạn có thể làm việc hiệu quả đến mức nào và bạn thực sự phải viết ít mã như thế nào khi sử dụng các công cụ như Eclipse.

Bạn có thể:

  • Dễ dàng và tự động cấu trúc lại các phương thức và lớp của bạn
  • Xem ngay tất cả các vị trí nơi một phương thức được gọi hoặc hằng số được sử dụng (Phân cấp cuộc gọi mở / Hiển thị tài liệu tham khảo)
  • Gõ tĩnh nghĩa là bạn có thể sử dụng hoàn tất mã để hiển thị tất cả các tham số / hàm có sẵn trên một đối tượng
  • Nhấp chuột điều khiển vào tên hàm / thành viên / lớp để đi thẳng đến định nghĩa của nó

Tất cả các cơ sở này làm cho tôi cảm thấy như IDE là người bạn tốt nhất của tôi. Viết mã Java và đặc biệt hiểu các chương trình của người khác trở nên dễ dàng hơn nhiều.

Tuy nhiên, tôi đang được kêu gọi ngày càng nhiều hơn để sử dụng Javascript và trải nghiệm của tôi cho đến nay vẫn khá tiêu cực.

Đặc biệt:

  • Không có cách nào ngay lập tức tìm điểm nhập của hàm (ngoài tìm kiếm văn bản đơn giản, sau đó có thể dẫn đến các tìm kiếm tiếp theo cho các phương thức tiếp tục phân cấp cuộc gọi, sau hai hoặc ba trong số đó bạn đã quên nơi bạn bắt đầu)

  • Các tham số được truyền vào các hàm, không có cách nào biết các thuộc tính và hàm nào có sẵn trên tham số đó (ngoài việc thực sự chạy chương trình, điều hướng đến điểm mà hàm được gọi và sử dụng console.logs để xuất tất cả các thuộc tính có sẵn)

  • Việc sử dụng phổ biến các hàm ẩn danh như các cuộc gọi lại, thường dẫn đến một chuỗi các đường dẫn mã khó hiểu, mà bạn không thể điều hướng nhanh chóng.

  • Và chắc chắn, JSLint đã bắt được một số lỗi trước khi chạy, nhưng thậm chí điều đó không hữu ích bằng việc có các đường lượn sóng màu đỏ dưới mã của bạn trực tiếp trong trình duyệt.

Kết quả cuối cùng là bạn cần phải có toàn bộ chương trình trong đầu mọi lúc. Điều này ồ ạt làm tăng tải nhận thức để viết các chương trình phức tạp. Và tất cả những thứ dư thừa này để lo lắng về việc để lại ít chỗ hơn trong não tôi cho sự sáng tạo và giải quyết vấn đề thực sự.

Chắc chắn, sẽ nhanh hơn khi chỉ ném một đối tượng lại với nhau thay vì viết toàn bộ định nghĩa lớp chính thức. Nhưng trong khi các chương trình có thể dễ dàng hơn một chút và viết nhanh hơn, theo kinh nghiệm của tôi, chúng khó đọc và gỡ lỗi hơn nhiều.

Câu hỏi của tôi là, làm thế nào để các lập trình viên khác đối phó với những vấn đề này? Javascript rõ ràng đang ngày càng phổ biến và các blog tôi đọc là về cách mọi người làm việc hiệu quả với nó, thay vì tuyệt vọng cố gắng tìm giải pháp cho những vấn đề này.

Thay vào đó, GWT cho phép bạn viết mã cho môi trường Javascript bằng Java, nhưng dường như không được sử dụng rộng rãi như tôi mong đợi; mọi người thực sự dường như thích Javascript cho các chương trình phức tạp.

Tôi đang thiếu gì?


8
Lời khuyên của tôi cho tất cả các nhà phát triển Java gặp khó khăn với JS là học một ngôn ngữ khác không có cú pháp dựa trên C. Nó sẽ giúp bạn vượt qua sự tương tự cú pháp khi bạn quay lại với JS và nó có thể giúp bạn bắt đầu xem xét các công cụ về sự đánh đổi của thiết kế ngôn ngữ thay vì nhìn mọi thứ theo một cách thực sự để viết tất cả mã và cách mọi người khác đều hiểu sai Và nếu bạn có ý tưởng để viết một khung công tác UI, vui lòng tìm hiểu JavaScript trước khi làm phiền chúng tôi với một loại rác xếp tầng khác, dễ dàng tiếp thị với các CTO không biết gì.
Erik Reppen

5
Người đàn ông làm tôi hợm hĩnh 2 năm trước. Bây giờ tôi sẽ cố gắng trở nên hữu ích hơn một chút vì tôi đã gặp Java khó hơn gần đây. Ý tưởng? Hãy xem Jetbrains Webstorm (Tôi vẫn sử dụng Scite chủ yếu nhưng WS không tệ), nhưng đối với web phía máy khách, các công cụ dev của Chrome thực hiện rất tốt việc che chở bạn khi gỡ lỗi và nó thực sự tự động hoàn thành khi viết đoạn trích mã trong bàn điều khiển. Ngoài ra, dành nhiều thời gian suy nghĩ về OOP. IMO, các lớp và IDE không tùy chọn thay thế cho tính dễ đọc của con người đã giết chết hoàn toàn toàn bộ quan điểm của OOP trong rất nhiều Java ngoài kia.
Erik Reppen

2
Tôi cảm nhận được nỗi đau của bạn. Thả xuống javascript là phiên bản web thả xuống ngôn ngữ lắp ráp ở phía máy khách. Nó chắc chắn có thể thú vị, nhưng các bộ công cụ yếu và năng suất chắc chắn giảm với tất cả các công việc phụ bạn phải làm. Đó là cuộc sống trong lập trình mặc dù. Không phải mọi thứ đều được thực hiện ở mức độ trừu tượng cao nhất. :-)
Brian Knoblauch

2
@ErikReppen Tôi bắt đầu là một nhà phát triển Java nhưng tôi thông thạo Obj-C, được lập trình bằng Ruby, Delphi, C ++, C #, Prolog, PHP, bash và tôi vẫn thấy javascript là thứ tồi tệ nhất để đọc và bảo mật.
Sulthan

2
Hãy xem TypeScript. Khi tôi bắt đầu sử dụng, tôi thấy mã hóa phía máy khách hiệu quả và thú vị hơn rất nhiều. Khó để đánh bại cảnh báo intellisense thích hợp và trình biên dịch sớm.
Evgeni

Câu trả lời:


22

Các niceties dựa trên IDE không có sẵn * trong một ngôn ngữ động như javascript. Bạn phải học cách làm mà không có chúng. Bạn sẽ phải thay thế công cụ hỗ trợ với thiết kế tốt hơn.

Sử dụng một mô-đun mô-đun - bằng tay hoặc với một công cụ như requestjs . Giữ các mô-đun nhỏ, để bạn có thể lý do về chúng dễ dàng.

Không xác định nhiều loại - sử dụng các đối tượng ẩn danh được tạo gần với điểm gọi. Sau đó, bạn có thể nhìn vào người gọi và callee và biết những gì đang xảy ra.

Cố gắng tránh ghép mã của bạn với DOM - Cố gắng hết sức để hạn chế số lượng thao tác DOM bạn thực hiện trong mã của mình. Nếu bạn có thể chuyển qua các bộ chọn hoặc bộ sưu tập jQuery, hãy làm điều đó thay vì để mã của bạn biết về cấu trúc trang.

* Nếu bạn đang sử dụng một thư viện phổ biến, bạn có thể nhận được tự động hoàn thành giả, nhưng nó giống như "hiển thị tất cả các phương thức jquery" hơn là "đối tượng này có thuộc tính gì". Nó tiết kiệm gõ, nhưng không đảm bảo tính chính xác.


Chấp nhận điều này cho lời khuyên mang tính xây dựng về cách đối phó với việc thiếu công cụ.
funkybro

3
"Bạn phải học cách làm mà không có họ." HOẶC loại bỏ nó HOẶC sử dụng ngôn ngữ cấp cao hơn tạo javascript và có các công cụ thích hợp.
Den

@Den: Bạn có gợi ý cho một ngôn ngữ cấp cao hơn với các công cụ nâng cao không? Theo kinh nghiệm của tôi, các công cụ tiên tiến được tạo ra cho các ngôn ngữ phổ biến. Ngôn ngữ cấp cao nào biên dịch thành javascript đủ phổ biến để có các công cụ như vậy?
Sean McMillan

1
@SeanMcMillan: một số .NET (C # / F #) ví dụ là jsil.org , projects.nikhilk.net/ScriptSharp , sharpkit.net , websharper.com
Den

1
@SeanMcMillan Java cũng, xem GWT developers.google.com/web-toolkit
funkybro

24

Tôi muốn thêm một câu trả lời cho câu hỏi này vì tôi đã lướt qua một số Java tốt, xấu nhưng chủ yếu là xấu gần đây và tôi có một khối lượng hoàn toàn mới về sự khái quát quá mức về các nhà phát triển Java và Java so với JS và Các nhà phát triển JS thực sự có thể dựa trên một cái gì đó mơ hồ giống với sự thật hữu ích.

Có những IDE nhưng nó có thể hữu ích để hiểu tại sao không có nhiều

Bây giờ tôi đã dùng thử Webstorm và thấy mình bị cuốn hút vào sự phát triển của Node và nó không tệ đến mức tôi thực sự đã mua nó nhưng tôi vẫn có xu hướng mở các tệp js trong Scite thường xuyên hơn WS. Lý do cho điều này là vì bạn có thể làm được nhiều hơn với rất ít trong JS nhưng cũng vì công việc UI mang lại phản hồi ngay lập tức, các công cụ phát triển trình duyệt (đặc biệt là Chrome và Firebird) thực sự khá xuất sắc và (chiếm các bối cảnh không phải trình duyệt ) chạy lại mã đã thay đổi là nhanh chóng và dễ dàng mà không cần một bước biên dịch.

Một điều nữa tôi khá bị thuyết phục là các IDE về cơ bản tạo ra nhu cầu của riêng chúng bằng cách kích hoạt mã cẩu thả mà bạn thực sự không thể mua được trong JavaScript. Bạn muốn tìm hiểu cách chúng tôi quản lý trong JS? Có thể giúp bắt đầu bằng cách cố gắng viết một cái gì đó không tầm thường trong Java mà không cần IDE và chú ý đến những điều bạn phải bắt đầu làm và suy nghĩ để thực sự có thể duy trì / sửa đổi mã mà không cần IDE di chuyển phía trước. IMO, những điều tương tự vẫn rất quan trọng để viết mã có thể duy trì cho dù bạn có IDE hay không. Nếu tôi phải viết một chương trình giảng dạy lập trình 4 năm, nó sẽ không cho phép bạn chạm vào IDE trong hai năm đầu tiên vì không muốn các công cụ và phụ thuộc bị xoắn.

Kết cấu

Các nhà phát triển JS có kinh nghiệm xử lý các ứng dụng phức tạp có thể và thực hiện cấu trúc mã của họ. Trên thực tế, có một điều chúng ta có xu hướng phải trở nên tốt hơn với một lịch sử ban đầu thiếu IDE để đọc mã cho chúng ta nhưng cũng bởi vì các ngôn ngữ biểu cảm mạnh mẽ có thể diễn đạt mạnh mẽ các mã hóa thảm họa hoàn toàn không thể nhận ra rất nhanh nếu bạn không mã hóa một cách chu đáo.

Tôi thực sự đã có một đường cong học tập khá dốc để hiểu cơ sở mã Java của chúng tôi gần đây cho đến khi cuối cùng tôi nhận ra rằng không có cái nào là OOP thích hợp. Các lớp học không có gì khác ngoài các gói phương pháp liên quan lỏng lẻo làm thay đổi dữ liệu có sẵn trên toàn cầu trong các hạt đậu hoặc DTO hoặc getters / setters tĩnh. Về cơ bản, đó chính là con thú cũ mà OOP phải thay thế. Vì vậy, tôi ngừng tìm kiếm và suy nghĩ về mã về cơ bản. Tôi chỉ học các phím tắt và lần theo các mớ hỗn độn và mọi thứ diễn ra suôn sẻ hơn nhiều. Vì vậy, nếu bạn chưa có thói quen này, hãy suy nghĩ nhiều hơn về OOD.

Một ứng dụng JS có cấu trúc tốt ở mức cao nhất sẽ có xu hướng bao gồm các hàm phức tạp (ví dụ jQuery) và các đối tượng tương tác với nhau. Tôi sẽ lập luận rằng dấu hiệu của một ứng dụng có cấu trúc tốt, dễ bảo trì trong bất kỳ ngôn ngữ nào là nó hoàn toàn dễ đọc cho dù bạn đang xem nó với IDE hay Notepad ++. Đó là một trong những lý do chính khiến tôi hết sức phê phán việc tiêm phụ thuộc và TDD thử nghiệm đầu tiên được đưa ra đến mức cực đoan.

Và cuối cùng, buông bỏ các lớp học. Tìm hiểu thừa kế nguyên mẫu. Nó thực sự khá thanh lịch dễ thực hiện khi bạn thực sự cần thừa kế. Tuy nhiên, tôi thấy các cách tiếp cận tổng hợp có xu hướng hoạt động tốt hơn nhiều trong JS, và cá nhân tôi bắt đầu bị bệnh và mắc chứng sợ hãi đêm EXTJS bất cứ khi nào tôi thấy nhiều hơn một hoặc hai cấp độ kế thừa diễn ra trong bất kỳ ngôn ngữ nào.

Nguyên tắc cốt lõi đầu tiên

Tôi đang nói về những thứ cốt lõi mà tất cả các thực tiễn tốt khác nên xuất phát từ: DRY, YAGNI, nguyên tắc ít ngạc nhiên nhất, tách biệt các miền vấn đề, viết lên giao diện và viết mã rõ ràng của con người là cốt lõi cá nhân của tôi. Bất cứ điều gì phức tạp hơn một chút ủng hộ việc từ bỏ các thực tiễn đó đều phải được coi là Kool Aid trong bất kỳ ngôn ngữ nào, nhưng đặc biệt là một ngôn ngữ như JavaScript, nơi rất dễ để lại một di sản mã rất khó hiểu cho người tiếp theo. Chẳng hạn, khớp nối lỏng lẻo là một thứ tuyệt vời cho đến khi bạn mang nó đi xa đến mức bạn thậm chí không thể biết được sự tương tác giữa các vật thể đang diễn ra ở đâu.

Đừng sợ gõ động

Không có nhiều loại cốt lõi trong JavaScript. Đối với hầu hết các phần, các quy tắc truyền động là thực tế và đơn giản nhưng nó trả tiền để tìm hiểu chúng để bạn có thể học tốt hơn để quản lý luồng dữ liệu mà không cần phôi và các thói quen xác thực vô nghĩa. Tin tôi đi Các loại nghiêm ngặt rất tốt cho hiệu năng và phát hiện các vấn đề khi biên dịch nhưng chúng không bảo vệ bạn khỏi mọi thứ.

Tìm hiểu các crap ra khỏi các hàm và đóng của JS

Các chức năng hạng nhất của JS được cho là lý do chính khiến JS giành giải "Ngôn ngữ duy nhất đáng để chạm vào web phía khách hàng với giải thưởng." Và vâng, thực sự đã có sự cạnh tranh. Chúng cũng là một tính năng trung tâm của JS. Chúng tôi xây dựng các đối tượng với chúng. Tất cả mọi thứ là phạm vi chức năng. Và chúng có các tính năng tiện dụng. Chúng ta có thể kiểm tra params thông qua từ khóa argument. Chúng ta có thể tạm thời gắn và bắn chúng trong bối cảnh là phương thức của các đối tượng khác. Và họ làm cho các cách tiếp cận theo hướng sự kiện đến những thứ khó hiểu dễ thực hiện. Nói tóm lại, họ đã biến JS thành một con thú tuyệt đối trong việc giảm độ phức tạp và điều chỉnh các cách triển khai khác nhau của chính JS (nhưng chủ yếu là API DOM) ngay tại nguồn.

Đánh giá lại các mô hình / thực tiễn trước khi áp dụng

Các hàm hạng nhất và các kiểu động tạo ra rất nhiều các mẫu thiết kế phức tạp hơn hoàn toàn vô nghĩa và cồng kềnh trong JS. Tuy nhiên, một số mẫu đơn giản hơn lại cực kỳ hữu ích và dễ thực hiện do tính chất rất linh hoạt của JS. Bộ điều hợp và trang trí đặc biệt hữu ích và tôi đã tìm thấy các singletons hữu ích cho các nhà máy phụ tùng ui phức tạp cũng đóng vai trò là người quản lý sự kiện cho các yếu tố ui mà họ xây dựng.

Theo dõi sự dẫn dắt của ngôn ngữ và làm nhiều hơn với ít hơn

Tôi tin rằng một trong những honchos đứng đầu Java đưa ra lập luận ở đâu đó rằng tính dài dòng thực sự là một tính năng tích cực giúp mã dễ hiểu hơn cho tất cả các bên. Chuyện nhảm. Nếu đó là sự thật, hợp pháp sẽ dễ đọc hơn. Chỉ người viết mới có thể làm cho những gì họ viết dễ hiểu hơn và bạn chỉ có thể làm điều đó bằng cách thỉnh thoảng đặt mình vào vị trí của người kia. Vì vậy, hãy nắm lấy hai quy tắc này. 1. Càng trực tiếp và rõ ràng càng tốt. 2. Đến điểm chết tiệt rồi. Chiến thắng là mã rõ ràng, súc tích là những mệnh lệnh có độ lớn dễ hiểu và duy trì hơn so với thứ mà bạn phải đi qua hai mươi lăm lớp để có được từ trình kích hoạt đến hành động mong muốn thực tế. Hầu hết các mẫu ủng hộ loại điều đó trong các ngôn ngữ chặt chẽ hơn trên thực tế là cách giải quyết cho những hạn chế mà JavaScript không có.

Mọi thứ đều dễ uốn và được rồi

JS có lẽ là một trong những ngôn ngữ bảo hộ ít được sử dụng phổ biến nhất. Ôm lấy đó. Nó hoạt động tốt. Chẳng hạn, bạn có thể viết các đối tượng với các vars "private" liên tục không thể truy cập bằng cách khai báo các vars thông thường trong hàm constructor và tôi thường xuyên làm điều này. Nhưng đó không phải là để bảo vệ mã của tôi hoặc người dùng mã "khỏi chính họ" (họ chỉ có thể thay thế nó bằng phiên bản của chính họ trong thời gian chạy). Nhưng đúng hơn là để báo hiệu ý định bởi vì giả định rằng anh chàng kia đủ khả năng để không muốn thu thập bất kỳ sự phụ thuộc nào và sẽ thấy rằng bạn không có ý định trực tiếp có lẽ vì lý do chính đáng.

Không có giới hạn kích thước, chỉ có miền vấn đề

Vấn đề lớn nhất mà tôi gặp phải với tất cả các cơ sở mã Java mà tôi đã thấy là sự dư thừa các tệp lớp. Trước hết RẮN chỉ là một sự lặp lại khó hiểu về những gì bạn nên biết về OOP. Một lớp nên xử lý một tập hợp cụ thể các vấn đề liên quan. Không một vấn đề với một phương pháp. Đó chỉ là việc sử dụng mã func-spaghetti C chuỗi cũ xấu chỉ với việc thêm tất cả cú pháp lớp vô nghĩa để khởi động. Không có giới hạn kích thước hoặc phương pháp. Nếu nó có ý nghĩa để thêm một cái gì đó vào một hàm hoặc lớp hoặc hàm tạo đã dài, thì nó có ý nghĩa. Lấy jQuery. Đó là toàn bộ bộ công cụ có độ dài thư viện trong một hàm duy nhất và không có gì sai với điều đó. Việc chúng ta có cần jQuery hay không là tranh luận hợp lý nhưng về mặt thiết kế,

Nếu Java là tất cả những gì bạn biết, hãy tìm hiểu một cái gì đó với một cú pháp không dựa trên C

Khi tôi bắt đầu nhắn tin với Python vì tôi thích những gì tôi nghe về Django, tôi đã học cách bắt đầu tách cú pháp khỏi thiết kế ngôn ngữ. Kết quả là, việc hiểu Java và C trở nên dễ dàng hơn khi là một phần của các phần thiết kế ngôn ngữ của họ thay vì tổng của những điều họ làm khác nhau với cùng một cú pháp. Một tác dụng phụ tuyệt vời là bạn càng hiểu các ngôn ngữ khác về mặt thiết kế, bạn sẽ càng hiểu rõ hơn về điểm mạnh / điểm yếu của ngôn ngữ mà bạn biết rõ nhất qua sự tương phản.

Phần kết luận

Bây giờ, xem xét tất cả điều đó, hãy nhấn tất cả các điểm vấn đề của bạn:

  • Không có cách nào ngay lập tức tìm điểm nhập của hàm (ngoài tìm kiếm văn bản đơn giản, sau đó có thể dẫn đến các tìm kiếm tiếp theo cho các phương thức tiếp tục phân cấp cuộc gọi, sau hai hoặc ba trong số đó bạn đã quên nơi bạn bắt đầu)

Chrome và Fireorms thực sự có tính năng theo dõi cuộc gọi. Nhưng cũng thấy quan điểm của tôi về cấu trúc và giữ cho mọi thứ ngắn gọn và trực tiếp. Bạn càng có thể nghĩ về ứng dụng của mình khi các cấu trúc được đóng gói tốt hơn tương tác với nhau, thì càng dễ dàng nhận ra lỗi của nó là gì khi gặp sự cố. Tôi cũng nói điều này đúng với Java. Chúng tôi có các hàm tạo giống như lớp hoàn toàn có thể phục vụ cho các mối quan tâm OOP truyền thống.

function ObjectConstructor(){
    //No need for an init method.
    //Just pass in params and do stuff inside for instantiation behavior

    var privateAndPersistent = true;

    //I like to take advantage of function hoisting for a nice concise interface listing
    this.publicAndPointlessEncapsulationMurderingGetterSetter
    = publicAndPointlessEncapsulationMurderingGetterSetter;
    //Seriously though Java/C# folks, stop with the pointless getter/setters already

    function publicAndPointlessEncapsulationMurderingGetterSetter(arg){
        if(arg === undefined){
            return privateAndPersistent;
        }
        privateAndPersistent = arg;
    }

}

ObjectConstructor.staticLikeNonInstanceProperty = true;

var instance = new ObjectConstructor();//Convention is to  capitalize constructors

Trong mã của tôi, tôi gần như không bao giờ sử dụng các đối tượng bằng chữ {}như các thành phần ứng dụng cấu trúc vì chúng không thể có các vars nội bộ (riêng tư) và thay vào đó thích dành chúng để sử dụng làm cấu trúc dữ liệu. Điều đó giúp đặt ra một kỳ vọng duy trì sự rõ ràng của ý định. (nếu bạn thấy curlies, đó là dữ liệu, không phải là một thành phần của kiến ​​trúc ứng dụng).

  • Các tham số được truyền vào các hàm, không có cách nào biết các thuộc tính và hàm nào có sẵn trên tham số đó (ngoài việc thực sự chạy chương trình, điều hướng đến điểm mà hàm được gọi và sử dụng console.logs để xuất tất cả các thuộc tính có sẵn)

Một lần nữa, xem các công cụ trình duyệt hiện đại. Nhưng ngoài ra, tại sao lại chạy chương trình như vậy? Tải lại là thứ mà một nhà phát triển web phía khách hàng thường truy cập cứ sau vài phút bởi vì bạn hoàn toàn không mất gì để làm điều đó. Đây là một lần nữa, một điểm khác mà cấu trúc ứng dụng có thể hữu ích nhưng đó là một sự đánh đổi ngược lại của JS mà bạn phải chạy xác thực của riêng mình khi thực thi các hợp đồng là rất quan trọng (điều mà tôi chỉ làm ở các điểm cuối tiếp xúc với những điều khác mà cơ sở mã hóa của tôi không làm được kiểm soát). IMO, sự đánh đổi là giá trị lợi ích.

  • Việc sử dụng phổ biến các hàm ẩn danh như các cuộc gọi lại, thường dẫn đến một chuỗi các đường dẫn mã khó hiểu, mà bạn không thể điều hướng nhanh chóng.

Vâng, đó là xấu trên bất cứ điều gì không tầm thường. Đừng làm vậy. Đặt tên cho các chức năng của bạn trẻ em. Nó cũng dễ dàng hơn để theo dõi mọi thứ. Bạn có thể xác định, đánh giá (bắt buộc phải gán) và gán một hàm tầm thường đơn giản phù hợp với:

doSomethingWithCallback( (function callBack(){}) );

Bây giờ Chrome sẽ có tên cho bạn khi bạn truy tìm các cuộc gọi. Đối với func không tầm thường, tôi sẽ xác định nó bên ngoài cuộc gọi. Cũng lưu ý rằng các hàm anonoymous được gán cho một biến vẫn ẩn danh.

  • Và chắc chắn, JSLint đã bắt được một số lỗi trước khi chạy, nhưng thậm chí điều đó không hữu ích bằng việc có các đường lượn sóng màu đỏ dưới mã của bạn trực tiếp trong trình duyệt.

Tôi không bao giờ chạm vào những thứ. Crockford đã đưa ra một số điều tốt cho cộng đồng nhưng JSLint vượt qua các ưu tiên về phong cách và đề xuất các yếu tố nhất định của JavaScript là những phần không tốt vì lý do đặc biệt tốt, IMO. Chắc chắn bỏ qua rằng một điều về các lớp regEx và phủ định theo sau là * hoặc +. Ký tự đại diện hoạt động kém hơn và bạn có thể dễ dàng hạn chế sự lặp lại với {}. Ngoài ra, bỏ qua bất cứ điều gì ông nói về các nhà xây dựng chức năng. Bạn có thể dễ dàng gói chúng trong một func của nhà máy nếu từ khóa mới làm phiền bạn. CSSLint (không phải của Crockford) thậm chí còn tồi tệ hơn trên mặt trận tư vấn tồi. Luôn luôn lấy những người tham gia nói nhiều với một hạt muối. Đôi khi tôi thề rằng họ chỉ tìm cách thiết lập quyền lực hoặc tạo ra tài liệu mới.

Và một lần nữa, bạn phải học những gì bạn đã học được với mối quan tâm thời gian chạy này mà bạn có. (đó là một lỗi phổ biến mà tôi đã thấy với rất nhiều nhà phát triển Java / C #) Nếu thấy lỗi trong thời gian chạy vẫn làm phiền bạn 2 năm sau, tôi muốn bạn ngồi xuống và spam tải lại trong trình duyệt cho đến khi nó chìm vào. không phải là phân chia thời gian biên dịch / thời gian chạy (dù sao cũng không thể nhìn thấy được - JS hiện đang chạy trên JIT). Không chỉ ổn khi phát hiện ra lỗi trong thời gian chạy, nó cực kỳ có lợi để tải lại spam dễ dàng và rẻ tiền và phát hiện ra lỗi tại mọi điểm dừng bạn gặp phải.

Và tải crack trên các công cụ phát triển Chrome đó. Chúng được tích hợp trực tiếp vào webkit. Nhấp chuột phải vào Chrome. Kiểm tra nguyên tố. Khám phá các tab. Có rất nhiều sức mạnh gỡ lỗi ở đó với khả năng thay đổi mã trong bảng điều khiển trong thời gian chạy là một trong những tùy chọn mạnh mẽ nhất nhưng ít rõ ràng nhất. Tuyệt vời để thử nghiệm quá.

Trên một lưu ý liên quan, lỗi là bạn bè của bạn. Đừng bao giờ viết một tuyên bố bắt trống. Trong JS, chúng tôi không che giấu hoặc chôn vùi lỗi (hoặc ít nhất là chúng tôi không nên ho YUI / ho ). Chúng tôi tham dự với họ. Bất cứ điều gì ít hơn sẽ dẫn đến đau gỡ lỗi. Và nếu bạn viết một câu lệnh bắt để ẩn các lỗi tiềm ẩn trong sản xuất thì ít nhất hãy âm thầm ghi lại lỗi và ghi lại cách truy cập nhật ký.


3
Nâng cao kích thước của câu trả lời ...
Florian Margaine

5

Những gì bạn đang nói chỉ là sự kìm kẹp chung của một người có đầu óc Java khi nhìn vào JavaScript.

Trước tiên hãy trả lời câu hỏi của bạn ...

... câu hỏi của tôi là, làm thế nào để các lập trình viên khác đối phó với những vấn đề này ...

Trả lời: Họ KHÔNG. Họ học triết lý JavaScript bằng cách đầu tiên từ bỏ giáo phái Java.

Bạn phải hiểu tiền đề này ... JavaScript KHÔNG phải là Java. Đó không chỉ là về cú pháp - đó là về triết lý.

Bây giờ chúng ta hãy lấy một số trong số họ ...

  • Xem ngay tất cả các vị trí nơi một phương thức được gọi hoặc hằng số được sử dụng (Phân cấp cuộc gọi mở / Hiển thị tài liệu tham khảo)

    Nhấp chuột điều khiển vào tên hàm / thành viên / lớp để đi thẳng đến định nghĩa của nó

    Tất cả những thứ này đều có sẵn - chỉ cần chọn một IDE tốt.

  • Gõ tĩnh nghĩa là bạn có thể sử dụng hoàn tất mã để hiển thị tất cả các tham số / hàm có sẵn trên một đối tượng

    Đây không phải là một vấn đề bạn đối phó với. Đây là một cái gì đó yêu cầu thay đổi quan điểm của bạn về lập trình. Hệ thống loại lỏng lẻo là một trong những thế mạnh của JavaScript. Hiểu đánh máy lỏng lẻo - và học cách đánh giá cao nó. Bên cạnh đó, hoàn thành mã hoạt động rất tốt với JS.

  • Và chắc chắn, JSLint đã bắt được một số lỗi trước khi chạy, nhưng thậm chí điều đó không hữu ích bằng việc có các đường lượn sóng màu đỏ dưới mã của bạn trực tiếp trong trình duyệt.

    Bảng điều khiển Fireorms, Chrome / Safari và thậm chí IDE làm tất cả những điều đó và THÊM.

    Có JSHint có thể thực hiện phân tích tĩnh tiện lợi mà các lập trình viên Java đã sử dụng.

  • Kết quả cuối cùng là bạn cần phải có toàn bộ chương trình trong đầu mọi lúc. Điều này ồ ạt làm tăng tải nhận thức để viết các chương trình phức tạp.

    Sai rồi! Ngược lại, JavaScript là ngôn ngữ lập trình "nhẹ" - và khuyến khích bạn có các chương trình đơn giản hơn. Như Doug Crockford nói ... nó sẽ "trừng phạt" bạn nếu bạn cố viết nhiều chương trình dựa trên mô hình bằng JavaScript.

  • trong khi các chương trình có thể dễ dàng hơn một chút và viết nhanh hơn, theo kinh nghiệm của tôi, chúng khó đọc và gỡ lỗi hơn nhiều.

    Hoàn toàn sai! Làm thế nào để bạn quyết định khả năng đọc dựa trên ngôn ngữ lập trình? Các chương trình có thể đọc được (hoặc không) - KHÔNG phải ngôn ngữ. Thêm vào đó, JavaScript có trình gỡ lỗi tuyệt vời.

Xin lỗi nếu tôi nghe có vẻ hơi thô lỗ - nhưng sự thật là bạn phải thay đổi khuynh hướng Java để hiểu JavaScript.

Chỉ những lập trình viên Java "trưởng thành" mới có thể đánh giá cao JavaScript - và bạn không thể thành thạo những thứ mà bạn không đánh giá cao. Một lần nữa, xin lỗi vì đã hoàn toàn thẳng thừng.


2
Bạn có một exmple của một IDE JavaScript nơi tôi có thể "điều khiển nhấp chuột vào tên hàm / thành viên / lớp để đi thẳng vào định nghĩa của nó" không? Tôi sử dụng Eclipse cho Java và Scala nhưng thiếu IDE / Editor tốt cho JavaScript.
Jonas

11
Chuẩn bị nhận một số lời chỉ trích, nhưng một số điều ở đây là khá sai. Nếu tôi tạo một đối tượng, và sau đó chuyển nó vào một hàm, tôi có thể nhấp ctrl vào tham số và xem thuộc tính của nó không? Không tôi không thể, bởi vì đối tượng có thể là bất cứ điều gì. Nếu tôi viết sai một trong các tên thuộc tính đối tượng, nó có cảnh báo tôi không? Không, nó sẽ không, bởi vì đó không phải là lỗi trong JS, mặc dù có lẽ nó không bao giờ là thứ bạn muốn. Hoàn thành mã hữu ích là không thể. Tìm hiểu các thuộc tính mà tham số của hàm sở hữu liên quan đến việc chơi trò chơi thông qua mã được gọi hàm, để tìm ra nơi đối tượng được tạo.
funkybro

3
Bạn có thể phàn nàn rằng cách xây dựng JS khiến cho IDE khó mã hóa hơn cho bạn. Tôi sẽ phàn nàn rằng trong Java tôi không thể chỉ gắn các thuộc tính động với bất kỳ thứ gì tôi muốn hoặc thực hiện nội quan trên các đối tượng trong suốt thời gian chạy. Hai ngôn ngữ rất khác nhau trong triết học. Tôi nghĩ theo những cách tạo ra sự ngắt kết nối lớn hơn giữa các nhà phát triển Java và JS so với giữa các ngôn ngữ JS và hầu hết các ngôn ngữ khác. Cá nhân tôi thấy C dễ thích nghi hơn Java và tôi ghét làm việc với IDE cồng kềnh.
Erik Reppen

2
Ngay cả các nhà phát triển Java của Google dường như không thể thoát khỏi Java khi viết JS. sitepoint.com/google-clenses-how-not-to-write-javascript
Erik Reppen

3
Bạn viết: JavaScript không phải là Javabạn phải thay đổi cách sử dụng Java để hiểu JavaScript theo sau: Chỉ những lập trình viên Java "trưởng thành" mới có thể đánh giá cao JavaScript ... Vì vậy, để hiểu Javascript, trước tiên tôi phải nắm vững Java nó không
Caleb

3

Nói chung, thật khó để có các công cụ bạn đã đề cập cho một ngôn ngữ động (trừ khi IDE là một phần của thời gian chạy - tức là Smalltalk). Phải nói rằng, một khi bạn học một trình soạn thảo văn bản thực sự tốt, hầu hết các IDE trông kém hấp dẫn hơn - đó ít nhất là kinh nghiệm của tôi.


2

Đó là cái giá chúng ta phải trả cho việc sử dụng các ngôn ngữ được đánh máy kém. Người ta chỉ có thể tự hỏi tại sao sự ghê tởm này đã trở nên phổ biến. Những nhược điểm vượt xa những lợi thế của ngôn ngữ gõ kém.

Có lẽ chúng ta nên áp dụng nguyên tắc Không hợp tác cho rác này để biến nó đi.


3
"Ngôn ngữ được gõ kém" - Nhiều lập trình viên sẽ không đồng ý với bạn.
Sean McMillan

7
+1, Lý do duy nhất Javascript phổ biến là vì nó ở đúng nơi vào đúng thời điểm.
maple_shaft

2
Aw, các bạn thật buồn khi Node.js có các ràng buộc với C ++ thay vì Java phải không?
Erik Reppen

1
Tôi không chắc ý nghĩa của "ngôn ngữ gõ kém" là gì. JavaScript không phải là "gõ kém". Nó được gõ một cách linh hoạt và các hoạt động có thể gây ra sự ép buộc kiểu. Đừng đổ lỗi cho ngôn ngữ vì trình soạn thảo / IDE của bạn không biết loại biến - dù sao bạn cũng nên biết ngôn ngữ đó.
Ryan Kinal

3
@RyanKinal Thật sao? Bạn nên biết tất cả các thuộc tính và phương thức của tất cả các đối tượng và lớp trong toàn bộ ứng dụng và API của ngôn ngữ của bạn và của bất kỳ thư viện nào bạn đang sử dụng, theo bộ nhớ ? Bạn từ chối khái niệm hoàn thành mã IDE một cách ồ ạt cải thiện năng suất bằng cách giảm tải nhận thức và cho bạn ít suy nghĩ hơn?
funkybro

2

Tôi đã từng không thích javascript (và cách gõ động của nó) nhưng tôi đã phát triển để đánh giá cao định hướng đối tượng, đónglập trình chức năng của nó . Ngoài ra, các đối tượng toàn cầu của nó và loại bỏ chuyển đổi loại im lặng là một luồng không khí trong lành khi tôi lần đầu tiên tìm thấy chúng.

Ide ưa thích của tôi cho javascript là webstorm vì nó dễ dàng để jQuery intocatext hoạt động (xấu hổ vì nó không miễn phí).

Ngoài ra, tôi sẽ không nói nó đang phát triển - nó có mặt khắp nơi.

Điểm cụ thể của bạn:

Không có cách nào ngay lập tức để tìm điểm vào của hàm

Tôi không hiểu điều này, làm thế nào nó có thể đơn giản hơn?

Các tham số được truyền vào các hàm, không có cách nào biết các thuộc tính và hàm nào có sẵn trên tham số đó

Nếu bạn thiết lập ide của mình để bao gồm các định nghĩa đối tượng, các thuộc tính của đối tượng sẽ có sẵn thông qua int Vệxt (nhưng tôi có thể đã bỏ lỡ điểm của bạn ở đây).

Việc sử dụng phổ biến các hàm ẩn danh như các cuộc gọi lại, thường dẫn đến một chuỗi các đường dẫn mã khó hiểu, mà bạn không thể điều hướng nhanh chóng.

Sử dụng phổ biến? Nếu bạn không thích các chức năng ẩn danh, đừng sử dụng chúng. Hay bạn đang đề cập đến jQuery sử dụng chúng một cách đáng kể? jQuery có lẽ được hầu hết các nhà phát triển web coi là trình tiết kiệm thời gian lớn nhất trong lịch sử phát triển web .

JSLint bắt một số lỗi trước khi chạy

Nó bắt tất cả chúng, bạn có thể đưa nó vào ide của bạn . Hoặc Webstorm bao gồm nó theo mặc định (tôi nghĩ).


Để công bằng có mặt khắp nơi và phổ biến không nhất thiết phải giống nhau! ;-) Dù sao, webstorm là một IDE tuyệt vời cho JavaScript (và mặc dù không miễn phí nhưng nó khá rẻ). Tôi đã không sử dụng nó nhưng tôi tin rằng IntelliJ (cũng từ Jetbrains) có chức năng tương tự có thể có liên quan nếu bạn đến từ nền Java và muốn sử dụng một IDE duy nhất.
FinnNk

Có lẽ tôi cần phải làm rõ ... Tôi có nghĩa là "ngày càng phổ biến" hơn trong bối cảnh phát triển vượt xa trình duyệt / DOM. Tức là, nó được sử dụng ở nơi khác có sẵn. Bởi "điểm vào của hàm" Tôi có nghĩa là xác định vị trí điểm trong mã mà hàm được gọi. Thuộc tính tham số: không có cách nào để IDE biết các thuộc tính của một đối tượng nhất định trước khi chạy! Các hàm ẩn danh: Tôi có thể không thích chúng, nhưng các hàm khác mà tôi cần duy trì mã. Chẳng hạn, JSLint không biết liệu tôi có nhập nhầm tên thuộc tính của một đối tượng cụ thể không.
funkybro

@funkybro "không có cách nào để IDE biết các thuộc tính của một đối tượng nhất định trước thời gian chạy" Có, chỉ bao gồm "anythingMyObjectIs.js" như một tập lệnh được tham chiếu trong ide và đối với các tên thuộc tính bị nhầm, hãy thử webstorm (nếu tôi nhớ chính xác).
NimChimpsky

3
Không có! Hãy xem xét mã này: var myFunc = function(param) { ... }; var myObj1 = { fooProp: fooVal, barProp: barVal}; var myObj2 = { catProp: catVal, dogProp: dogVal}; myFunc(myObj1); myFunc(myObj2); Làm thế nào có thể một lời đề nghị IDE mã hoàn thành trên myFunc's paramtham số? paramcó thể là bất kỳ đối tượng thuộc bất kỳ loại nào, với bất kỳ thuộc tính nào.
funkybro

Có, nhưng có lẽ các thông số bạn đi qua thực sự có sẵn trong bối cảnh đó. Một trình phân tích cú pháp có thể sắp xếp nó ra mà không phải là trình thông dịch JS đầy đủ của chính nó.
Erik Reppen

2

Tôi đang thiếu gì?

Bạn đang thiếu hai lợi thế to lớn mà Javascript có trên Java:

  • Mã Javascript có kích thước bằng một phần tư kích thước của mã Java tương đương.
  • Bạn không bao giờ phải chờ biên dịch và khởi động lại máy chủ.

Tôi làm việc khác nhau trong Javascript. Tôi thêm một ít mã mỗi lần, ít nhất có thể để kiểm tra, và làm mới trình duyệt và kiểm tra nó. Với jQuery, một vài dòng Javascript là tất cả những gì tôi cần hầu hết thời gian.

Tôi đã thấy lập trình Java tương đối không hiệu quả và hiện đang viết tất cả mã phía máy chủ của mình bằng Groovy, vì hai lý do tương tự.


5
"Mã Javascript có kích thước bằng một phần tư kích thước của mã Java tương đương" <- đây là vấn đề! Chắc chắn rằng thật nhanh chóng khi chỉ cần tạo các hàm ẩn danh và thêm các thuộc tính bổ sung cho các đối tượng và ném chúng xung quanh như confetti. Nhưng những gì về khi người khác truy cập mã của bạn và cố gắng tìm hiểu những gì đang xảy ra? Ngoài ra, nhiều mã hơn trong Java không nhất thiết phải gõ nhiều hơn ... Eclipse viết rất nhiều mã cho bạn.
funkybro

3
@funkybro: Eclipse viết nó ... sau đó tôi bị mắc kẹt khi nhìn qua nó cho vòng đời của dự án. Nếu nó là bắt buộc, nhưng một plugin tầm thường có thể tạo ra nó, đó là một mùi ngôn ngữ. Bạn đúng rằng các lớp Javascript yêu cầu thêm một chút tài liệu. Nhưng chỉ cần biết một chữ ký phương thức Java là không đủ.
kevin cline

1
Không bắt buộc! Bạn có thể mô phỏng Javascript trong Java bằng cách luôn gọi các phương thức với sự phản chiếu và không sử dụng gì ngoài các đối tượng, danh sách và bản đồ đơn giản nếu bạn thực sự muốn. Tuy nhiên, hầu hết các nhà phát triển IME (không phải tất cả những gì tôi thú nhận!) Chọn định nghĩa các loại dữ liệu có ý nghĩa, vì họ thấy nó giúp họ viết mã tự lưu trữ, có thể duy trì!
funkybro

1
Sự phản chiếu có cho phép Java sửa đổi các đối tượng trong thời gian chạy không? Làm thế nào về việc đóng cửa? Tìm hiểu ngôn ngữ trước khi bạn chỉ trích nó hoặc giả sử Java, ngôn ngữ mô hình khép kín nhất bên ngoài lắp ráp có khả năng mô phỏng nó.
Erik Reppen

1
Downvoters: đây không phải là một cuộc trưng cầu dân ý về Java so với Javascript. Thật thô lỗ khi downvote mà không có lý do.
kevin cline

0

Tôi biết câu hỏi này đã cũ nhưng với tư cách là một lập trình viên C ++ / C #, người có cùng cảm xúc nhưng hiện tại họ đã thực hiện rất nhiều JavaScript trong 10 năm qua, đề nghị đầu tiên của tôi là hãy thử dùng Visual Studio Code .

Tất nhiên, nó không thể cung cấp mọi tính năng có thể được thêm bằng ngôn ngữ được gõ mạnh nhưng nó lại khá gần.

Nó cũng có thể lấy thông tin loại từ bản thảo và áp dụng nó vào JavaScript. Ngay cả khi bạn không bao giờ sử dụng bản thảo, bạn vẫn có thể hoàn thành mã và tài liệu về hàng tấn API khi bạn nhập JavaScript.

Vì vậy, câu hỏi của bạn

  • Không có cách nào ngay lập tức tìm điểm nhập của hàm (ngoài tìm kiếm văn bản đơn giản, sau đó có thể dẫn đến các tìm kiếm tiếp theo cho các phương thức tiếp tục phân cấp cuộc gọi, sau hai hoặc ba trong số đó bạn đã quên nơi bạn bắt đầu)

Có vẻ như hầu hết được giải quyết trong VSCode?

  • Các tham số được truyền vào các hàm, không có cách nào biết các thuộc tính và hàm nào có sẵn trên tham số đó

Điều này được giải quyết cho nhiều IDE bằng cách ghi lại mã của bạn bằng các nhận xét hoặc bản thảo kiểu JSDoc. Các biên tập viên sẽ đọc các bình luận và cung cấp cho bạn sự hoàn thành giống như bạn đã từng

Việc sử dụng phổ biến các hàm ẩn danh như các cuộc gọi lại, thường dẫn đến một chuỗi các đường dẫn mã khó hiểu, mà bạn không thể điều hướng nhanh chóng.

Là một hàm ẩn danh lập trình viên C # cũng phổ biến ở đó và đã được thêm vào C ++. Tôi nghĩ rằng đây là thứ bạn chỉ cần làm quen.

Ngoài ra, mặc dù các cuộc gọi lại hầu như đã được thay thế bằng các lời hứa và với async / await và nếu bạn có một api sử dụng một cuộc gọi lại, bạn có thể nhanh chóng bọc nó để sử dụng một lời hứa và sau đó sử dụng async / await để vấn đề đó biến mất.

Và chắc chắn, JSLint đã bắt được một số lỗi trước khi chạy, nhưng thậm chí điều đó không hữu ích bằng việc có các đường lượn sóng màu đỏ dưới mã của bạn trực tiếp trong trình duyệt.

Bạn sẽ nhận được các đường lượn sóng trong Visual Studio Code. Không chỉ vậy mà nếu bạn bật tích hợp ESLint, bạn sẽ nhận được vô số cảnh báo đáng kinh ngạc và hoặc các lỗi được nêu bật trong trình chỉnh sửa của bạn. Nhiều hơn tôi đã thấy cho các ngôn ngữ khác thực sự. Kinh nghiệm của tôi là yếu tố cho C / C # / Java đã được mã hóa khá cứng trong khi ESLint vừa có thể cấu hình ồ ạt vừa có thể mở rộng ồ ạt và vì các thư viện phổ biến như vậy thậm chí có thể tích hợp để cung cấp cho bạn lời khuyên và cảnh báo về việc sử dụng thư viện cụ thể trong trình soạn thảo. Một cái gì đó cá nhân tôi chưa từng thấy trong các ngôn ngữ khác (mặc dù có lẽ giờ đây nó cũng phổ biến đối với các ngôn ngữ khác?)

Đó cũng là năm 2018 và ES7 là chuẩn mực mới để bạn có được class. Bạn luôn sử dụng chế độ nghiêm ngặt. Bạn không bao giờ sử dụng varvà luôn luôn sử dụng constletmột loạt những thứ mà các lập trình viên C ++ / C # / Java đã có một thời gian khó khăn để làm quen với việc biến mất. Bật no-undefquy tắc trong ESLint và thậm chí nhiều vấn đề biến mất

Điều đó nói rằng hãy học cách thisthực sự hoạt động và cách các hàm và phương thức thực sự hoạt động vì nó không giống với C ++ / C # / Java.

JavaScript 2-3 năm đầu tiên của tôi là tôi đã thất vọng. Tại một số điểm, nó nhấp vào mặc dù. Tôi đã ngừng cố gắng biến nó thành C ++ / C # / Java và bây giờ tôi cảm thấy thất vọng khi quay trở lại khi những thứ có 15 dòng trong JavaScript mất 150 trong các ngôn ngữ khác.


-1

Nếu bạn thích IDE và được sử dụng để nhật thực, hãy xem Aptana dưới dạng IDE cho JavaScript. Tôi nghĩ rằng nó có thể làm nhiều điều bạn muốn. (Cá nhân tôi ghét IDE nhưng đó là một cuộc trò chuyện khác).

Đối với các hàm ẩn danh, tôi thấy rằng chúng là tính năng mạnh nhất trong JavaScript và cố gắng làm việc trong một ngôn ngữ không có chúng là vào thời điểm này khá đau đớn.

Nếu bạn muốn một cái gì đó khác có thể biên dịch thành JavaScript, có một loạt các tùy chọn, CofffeeScript, Clojure và GWT đều nhảy vào tâm trí nhưng có những tùy chọn khác.


2
Tôi đã thử Aptana một lần và điều đó thực sự tồi tệ. Nó thậm chí không có thụt lề tự động và nó phá hủy tất cả các cài đặt dự án được thiết lập bởi các trình soạn thảo Eclipse khác, ví dụ như tô màu và các thứ nếu tôi sử dụng Eclipse và Aptana trong cùng một dự án.
Jonas

1
Tôi đã sử dụng nó một thời gian và ghét nó, nhưng như tôi đã nói tôi ghét IDE, tôi thực hiện định dạng bằng công cụ dòng lệnh và chỉnh sửa trong GVIM hoặc emacs (tùy thuộc vào những gì tôi đang làm)
Zachary K

Sự cố trong vài giờ đầu tiên và tôi không có gì mở ngoài một số ít các tập tin? Buh-bye.
Erik Reppen

Webstorm không phải là xấu. Tôi vẫn sử dụng Scite hầu hết thời gian nhưng tôi bắt đầu cảm thấy điều IDE nhiều hơn khi viết nội dung Node.js và tôi không có lợi ích của phản hồi trình duyệt và các công cụ dev.
Erik Reppen

-1

Tôi chưa sử dụng nó cho bản thân mình nhưng tôi đã thấy một số bản demo và tôi rất ấn tượng với Cloud 9 dưới dạng IDE JavaScript.

Bạn có thể sử dụng cho cả mô hình dịch vụ trực tuyến hoặc tải xuống từ GitHub.

Và như một bằng chứng về chất lượng của nó như một IDE, Cloud9 đã được viết bằng ... Cloud9!

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.