Thực thi JavaScript trên máy chủ IIS. Và nó là gì cả, asynchrony này? Sẵn sàng hoạt động cho máy chủ JavaScript

Sulminating, khét tiếng PHP! Xuống với Java! Một ông già, bạn vẫn phải nghỉ hưu. Và làm thế nào bạn đã nhận được, pop ruby \u200b\u200bvà python! Tất cả các công nghệ dài hạn này không còn theo dõi. Nhưng hôm nay chúng ta sẽ xem xét một cách tiếp cận cực kỳ tiến bộ khi mã máy chủ được sử dụng để viết ... JavaScript.

Có một ý tưởng để khởi động. Bây giờ câu hỏi là: Những gì để viết thư cho anh ta? Tất nhiên, có rất nhiều RNR yêu thích - những gì có thể dễ dàng hơn cho trang web! Nhưng hãy nói với tôi một cách trung thực, bằng cách nào đó không kéo, phải không? Rốt cuộc, để làm một cái gì đó đáng giá, RNR trần không có đủ. Ngay lập tức, bạn cũng sẽ phải làm hỏng AJAX để dữ liệu không thể chấp nhận được mà không cần cập nhật toàn bộ trang hoàn toàn và điều này sẽ không giải quyết được tất cả các vấn đề. Về thực tế rằng PHP không tốt lắm, bạn nghĩ vào lúc này khi có nhiều người sẽ bị phá vỡ với bạn. Và tất cả bởi vì PHR (cũng như đại đa số các ngôn ngữ khác trên đó các trang web được xây dựng) ngay cả trong thế kỷ, hai mươi mốt, làm việc theo chương trình "yêu cầu-Trả lời" cổ điển. Yêu cầu của trang khiến máy chủ Web tăng tập lệnh được chỉ định, hãy thực hiện nó (tuyến tính, dòng cho chuỗi là toàn bộ mã của bạn) và kết quả được trả về trình duyệt máy khách. Sau đó, tập lệnh "chết" và yêu cầu tiếp theo sẽ khởi chạy lại tất cả các máy Hello này. Và nếu các yêu cầu như vậy là đồng thời hàng ngàn? Một cách tiếp cận tốt cũ được gọi là CGI (Giao diện của Tương tác máy chủ Web và trình thông dịch ngôn ngữ mà trang được viết). Xóa các tiện ích bổ sung như FastCGI Mở rộng giao thức, cho phép bạn tránh dỡ tập lệnh sau yêu cầu đầu tiên. Do đó, khi người dùng thứ hai yêu cầu cùng một trang, nó sẽ sẵn sàng cho nó mọi thứ sẽ sẵn sàng, nó sẽ chỉ là một kịch bản với các tham số mới. Nhưng tất cả những mánh khóe này vẫn không giống nhau.

Điều gì là tốt và những gì là xấu

Nhiều nhà phát triển luôn coi JavaScript chỉ bằng cách "hàng" cho trình duyệt, dường như là một vùng đất, phù hợp để thao túng các hình thức và thao túng trang web DOM-Tree. Một số người vẫn nghĩ rằng "Java" trong tiêu đề một cái gì đó có nghĩa là nó có nghĩa! Thật vậy, ngôn ngữ rất đơn giản. Tuy nhiên, các lập trình viên thực sự đã học được từ lâu để tạo ra phép lạ với sự giúp đỡ của nó, mang lại cho chúng ta các dịch vụ trực tuyến thuận tiện đáng kinh ngạc mà chúng tôi sử dụng hàng ngày. Nhiều chuyên gia đã đi xa hơn và, tỉnh táo nhìn vào chính ngôn ngữ và khả năng của nó, đặc biệt là về công việc với các sự kiện, đã quyết định: Điều gì sẽ xảy ra nếu bạn viết một máy chủ trên JavaScript? Bạn có cơ hội viết bằng ngôn ngữ tương tự Tất cả các phần của trang web: Phần máy chủ là chính trang của khách hàng. Ngoài ra, JS là tốt, chỉ là hoàn hảo cho các trang web khác nhau xếp chồng lên nhau. Nó rất đơn giản và đồng thời linh hoạt, cho phép bạn viết mã trong các mô hình khác nhau: từ thủ tục thông thường đối với OOP trong hỗn hợp với một kiểu chức năng. Và quan trọng nhất, đây là tổng số không đồng bộ. Điều này có nghĩa là mã của bạn sẽ được thực thi không liên tục, như trong trường hợp các tập lệnh PHP / PERL, cụ thể là tại thời điểm này khi tất cả dữ liệu sẽ được chuẩn bị cho nó. Rốt cuộc, đối với Web là không cần thiết khả năng tính toán - Hầu hết thời gian máy chủ mong đợi các sự kiện như nhận dữ liệu biểu mẫu, mẫu từ cơ sở dữ liệu hoặc, thậm chí tệ hơn, phản hồi với yêu cầu đến một máy chủ khác. Kịch bản RNP thông thường không hoạt động tại thời điểm đó, điều đó có nghĩa là toàn bộ luồng không hoạt động, không cho phép máy chủ sử dụng nó cho những người dùng khác. Trong một tình huống như vậy, nó không tiết kiệm ngay cả nginx. Trong trường hợp JavaScript, bạn chỉ cần chỉ định chức năng nào bạn cần thực hiện khi xảy ra sự kiện cụ thể và đó là tất cả. Tại thời điểm này, một mã khác có thể được thực hiện một cách an toàn. Tính năng này được gọi là gọi lại hoặc trình xử lý sự kiện. Mặc dù việc viết một mã thực sự phức tạp theo phong cách như vậy là một chút khó chịu, đặc biệt nếu chức năng của bạn phụ thuộc vào một số sự kiện ngay lập tức, nhưng đối với điều này đã phát minh ra các khung của họ, thường mạnh mẽ và thanh lịch hơn nhiều so với tất cả các phr / ruby \u200b\u200b/ python này.

Và nó là gì cả, asynchrony này?

Ví dụ: các hạn chế của việc thực hiện tuần tự của mã sẽ xem xét hai mã mẫu điển hình trên PHP và JavaScript hoạt động giống nhau. Hãy bắt đầu với PHP yêu thích của bạn:

$ kết quả \u003d $ db-\u003e fetchone ("chọn user_name từ user_accounts trong đó id \u003d 1");
Echo "Tên tôi:". $ Kết quả. ";";

Trong dòng đầu tiên, chúng tôi gửi một truy vấn SQL đơn giản đến cơ sở dữ liệu để chọn tên người dùng, người có id \u003d 1. Tuân thủ chú ý: Ở nơi này, tập lệnh dừng và dòng tiếp theo sẽ không được thực thi cho đến khi cơ sở dữ liệu được xử lý và Kết quả sẽ không được trả về biến $ kết quả. Có, trong ví dụ của chúng tôi, đây là những phần nghìn giây, nhưng trong thực tế và yêu cầu khó khăn hơn nhiều và kích thước cơ sở thường là gigabyte và có thể có một vài ngàn như vậy. Bây giờ hãy thử viết mã trên JS bằng cách sử dụng kiểu không đồng bộ:

db.query ("chọn user_name từ user_accounts trong đó id \u003d 1", hàm (err, res)
{
if (! err) sys.log ("Tên tôi:" + res);
});
sys.log ("Tiếp tục thực hiện");

Ở đây một lần nữa, một yêu cầu cơ sở dữ liệu được tạo, nhưng ngoài chính biểu thức SQL, bộ xử lý (gọi lại) cũng được truyền trong truy vấn. Tính năng này sẽ được gọi chính xác khi phản hồi cơ sở dữ liệu và cho đến thời điểm này, việc thực hiện tập lệnh sẽ không bị dừng. Ví dụ: trong dòng tiếp theo, chúng tôi chỉ cần hiển thị một chuỗi vào bảng điều khiển để hiển thị rằng tập lệnh chạy ngay sau khi yêu cầu được tạo, mà không mong đợi sự hoàn thành của nó. Trên thực tế, ở trung tâm của bất kỳ phiên bản nào của máy chủ JavaScript, khái niệm các sự kiện và cuộc gọi lại được đặt, nghĩa là, xử lý sự kiện. Bạn có thể mô tả sự kiện riêng. Sau đó, ứng dụng đang chạy sẽ phụ thuộc vào các sự kiện xảy ra do kết quả của hoạt động của người dùng trên trang (biểu mẫu "được điền" hoặc "tin nhắn mới", v.v.) hoặc được tạo trong chính máy chủ (ví dụ: trong trường hợp truy cập cơ sở dữ liệu). Những hành động cần được thực hiện trong trường hợp các sự kiện được mô tả bên trong các chức năng của trình xử lý sự kiện.

Động cơ, đó là câu hỏi

Nói tóm lại, sử dụng JavaScript không chỉ cho phần máy khách, mà còn ở phía máy chủ là tốt và thậm chí tốt đẹp. Một câu hỏi khác - Làm thế nào nó có thể được thực hiện? Ngày nay có bốn động cơ chính được sử dụng trên máy chủ.

Tê giác. - Động cơ của Mozilla, được viết bằng Java và hỗ trợ phiên bản 1.7 mới nhất của tiêu chuẩn JS, cũng bổ sung cho ngôn ngữ của các phần mở rộng và đối tượng riêng. Ưu điểm chính của động cơ là hoạt động trên cùng của JVM tiêu chuẩn, và do đó nó có thể được sử dụng trong bất kỳ môi trường nào mà Java hoạt động. Nói cách khác, các máy chủ web loại Jetty hiện đại có thể được áp dụng, nhưng đồng thời viết trên JS yêu dấu. Nhân tiện, Rhino được áp dụng trên một đám mây lưu trữ từ Google! Nhưng với năng suất khó khăn hơn. Nó phụ thuộc vào một tay, từ động cơ và công nghệ được sử dụng ở đó, như biên dịch JIT và từ công việc của chính máy Java. Nhân tiện, nhiều người nói rằng Rhino rất chậm, quên rằng động cơ có hai chế độ hoạt động: diễn giải khi tập lệnh được chuyển đổi thành mã byte Java mỗi lần (tương tự như PHP) và biên dịch, khi một biến đổi như vậy xảy ra chỉ một lần, và sau đó nó được thực hiện nhiều lần. Chế độ đầu tiên có lợi khi bạn gỡ lỗi mã thay đổi mỗi phút, thứ hai phù hợp hơn cho phiên bản làm việc của dự án đang chạy trong Tải.

Khỉ nhện. - Một động cơ khác từ Mozilla, lần này trên C. Nhân tiện, nó thường là động cơ JS đầu tiên trên thế giới, được viết lại ở Netscape - Hôm nay nó đang mở và được sử dụng trong các sản phẩm phổ biến như Firefox, Adobe Acrobat. Và ngay cả trong một trong những trình giả lập các máy chủ trò chơi trực tuyến Ultima Online. Tiếp theo, các nhà phát triển đã sửa đổi mạnh mẽ bằng cách thêm JS biên dịch trực tiếp vào mã trình biên dịch và đổi tên thành Tracemonkey - Đây là động cơ này được sử dụng trong nhánh 3,6 Firefox. Chủ yếu là SpiderMonkey được sử dụng trong phần mềm được viết trên C / C ++ và cần một ngôn ngữ kịch bản. Từ các sản phẩm nổi tiếng: COMET-Server APE, NoQuery CouchDB, Nền tảng Jaxer Server và một mô-đun cho Apache Mod_js.

Futhark. "Đây là một động cơ Opera, ngoài trình duyệt, được sử dụng trong dịch vụ Unite sáng tạo của họ (loại máy chủ nhúng trong mỗi trình duyệt), cũng như trên máy chủ của họ phục vụ trình duyệt Opera Mini Mobile. Thật đáng tiếc khi động cơ bị đóng, và nó không được sử dụng cho đến nay ngoài chính Opera.

V8. - Google Engine, được sử dụng trong Chrome và là cơ sở của hệ điều hành Chrome trong tương lai. Hôm nay nó là sự tuyệt vời nhất, nhanh chóng và Động cơ mạnh mẽTrong đó mã JS được chuyển đổi trực tiếp thành một trình biên dịch của bộ xử lý mục tiêu, cho phép bạn bỏ qua tất cả các động cơ khác. Ngoài ra, Google sử dụng rất nhiều thủ thuật để tối ưu hóa, được lưu trữ trong mã biên dịch bộ nhớ, hãy tối ưu hóa nó trên con ruồi (ví dụ: các khối mã bị xóa, theo quyết định của trình biên dịch không thể được sử dụng ở tất cả, v.v.). Trên cơ sở động cơ này, nền tảng máy chủ phát triển nhanh và phổ biến nhất được xây dựng - Node.js..

Node.js.

Có lẽ, đó là sau khi thoát Nhà phát triển Chrome Họ cắt giảm rằng một động cơ nhanh như vậy có thể được sử dụng thành công trên máy chủ. Trải nghiệm đầu tiên là dự án V8CGI, chỉ đơn giản là được phép viết các kịch bản máy chủ hoạt động với bất kỳ máy chủ web nào theo giao thức CGI tiêu chuẩn. Các thí nghiệm tiếp theo dẫn đến sự ra đời của dự án Node.js. - Một nền tảng hoàn toàn độc lập, bao gồm cả động cơ, máy chủ nhúng (HTTP và TCP / UDP / UNIX-Soket) và một bộ thư viện cơ bản và cũng cung cấp hoạt động hoàn toàn không đồng bộ với các tệp và thiết bị mạng.

Dự án đang phát triển rất nhanh và tích cực rằng nó đã sẵn sàng để sử dụng công nghiệp. Đặc biệt, đặc biệt, chứng minh trải nghiệm của các chàng trai từ Plurk (Twitter tương tự châu Á), đã chuyển hoàn toàn máy chủ sao chổi của họ, ban đầu được viết bằng Java và Solid JBoss Netty, trên Node.js. Và, theo đánh giá, giảm tiêu thụ bộ nhớ theo nghĩa đen trên gigabyte. Và quy mô của họ vẫn còn hơn hàng trăm ngàn kết nối đồng thời.

Chạy máy chủ HTTP có khả năng xử lý hàng ngàn kết nối không đồng bộ là một vài dòng mã:

var sys \u003d yêu cầu ("sys"), http \u003d yêu cầu ("http");
http.createserver (hàm (req, res)
{
Res.writehead (200, ("loại nội dung": "văn bản / đơn giản"));
res.end ("xin chào worldn");
)). Nghe (80, "127.0.0.1");
Sys.puts ("Máy chủ chạy tại http://127.0.0.1:80/");

Để khởi động máy chủ, hãy sao chép mã vào tệp example.js và trỏ nó khi bạn khởi động nút:

% Node example.js.
Máy chủ chạy tại http://127.0.0.1:80/

Bài kiểm tra nhỏ rất đơn giản. Bạn có thể lấy chương trình băng ghế Apache - một công cụ rất đơn giản để thực hiện thử nghiệm tải và khởi động nó: chạy "ab ab -n 1000 -c 100 'http://127.0.0.1:80/". Do đó, điểm chuẩn sẽ "quyết định" máy chủ với hàng ngàn yêu cầu sử dụng 100 kết nối đồng thời. Trên máy tính xách tay của tôi, máy chủ đã tôn trọng hơn 3000 yêu cầu mỗi giây. Nó rất nhiều!

Bản thân máy chủ được viết bằng C ++ và khá nhiều trên trình biên dịch trình biên dịch viên, tuy nhiên hầu hết Thư viện từ phân phối được thiết kế cho JavaScript. Phần bộ cơ bản. Các máy chủ chỉ bao gồm các chức năng cơ bản, phần còn lại còn lại trên vai của các nhà phát triển đã viết hàng trăm thư viện và khung khác nhau. Tuy nhiên, tuổi trẻ của dự án làm cho nó cảm thấy: Nhiều mô-đun quen thuộc với các giải pháp khác vẫn chưa, nhưng ở nhiều thư viện phiên bản hiện tại - 0.0.1, không tự tin vào sự ổn định của chúng. Một số nhiệm vụ tầm thường có thể không có giải pháp sẵn sàng hoàn toàn, nhưng ngược lại - số lượng triển khai, thường là kiến \u200b\u200btrúc khác nhau hoàn toàn khác nhau, được tính bằng hàng chục (truy cập vào cơ sở MySQL, ví dụ). Mặc dù hầu hết các thư viện được viết trên JavaScript thuần túy, vì sao cho mô-đun được biên dịch đến máy chủ, hứa hẹn nhiều tốc độ - chúng chỉ đơn giản là mở rộng máy chủ API tiêu chuẩn.

Sẵn sàng hoạt động cho máy chủ JavaScript

Tất nhiên, bạn có thể viết mã với tấm tinh khiếtĐiều gì làm cho nhiều lập trình viên phù hợp thực hiện. Tuy nhiên, rất nhiều các lập trình viên thích hợp này được tạo ra cho mình các khung và ghi chú thoải mái, hiện đang liên tục được sử dụng và cung cấp cho tất cả mọi người dưới dạng khung và thông số kỹ thuật. Nếu bạn nghiêm túc quyết định sử dụng máy chủ JS, thì đây là một cách tuyệt vời để tạo điều kiện cho cuộc sống của bạn.

Narwhal - giải pháp mạnh mẽLàm việc trên đỉnh của nhiều động cơ JS. Do đó, các lập trình viên không cần hấp về sự khác biệt giữa các máy chủ khác nhau - chúng có thể chỉ cần viết mã.

Cộng đồng - một nỗ lực để chuẩn hóa nền tảng và đưa ra một API chung cho tất cả các động cơ bằng cách cung cấp API cấp thấp, cũng như API để kết nối các mô-đun hoàn thành khác nhau.

JVGI (Giao diện cổng JavaScript) - Giao thức truyền thông Demone Web đặc biệt đã được phát triển và các kịch bản máy chủ trên JavaScript. Than ôi, đặc điểm kỹ thuật chỉ được hỗ trợ đầy đủ bởi dự án tê giác được bao quanh bởi máy chủ Jetty.

Tính năng Node.js.

Tính năng chính của nút, ngoài việc hoàn thành không đồng bộ, là mô hình dòng chảy của nó. Nói cách khác, tất cả các thao tác được thực hiện trong cùng một luồng hệ điều hành, ngay cả khi máy chủ của bạn có một ngàn người dùng đồng thời. Đúng, có thể truy cập để tạo ra các quy trình con và quản lý các tập lệnh cấp thấp (đang tải, biên dịch, làm việc với mã trình biên dịch, thực thi). Để thực hiện đa luồng và sử dụng tất cả các lõi bộ xử lý hiện đại Bạn nên tải xuống nhiều bản sao của ứng dụng, nhưng bạn có thể sử dụng WebWorker từ tiêu chuẩn HTML5 và phân phối ứng dụng ứng dụng cho một số quy trình con. Đừng nghĩ rằng vì không có đa luồng - đó là một phanh và hút. Hãy nhớ rằng ứng dụng web làm công việc hữu ích rất nhanh, và hầu hết thời gian chỉ đơn giản là mong đợi một cái gì đó (dữ liệu từ cơ sở, từ memcached hoặc một cơ sở nosql-base nosql kiểu mới) hoặc đơn giản là giữ các kết nối mở để sao chổi trong bộ nhớ, vì vậy trong một luồng có thể được xử lý bằng Tết Hàng ngàn không dùng đến cụm.

Tính năng thứ hai của kiến \u200b\u200btrúc nút là sự kiện. Hầu như mọi hoạt động đều có Collbekki, tạo một sự kiện và người dùng có sẵn cho người dùng một đối tượng Eventemiter, thông qua đó bạn thực sự có thể tạo các sự kiện của mình (thật dễ dàng, vì sự kiện chỉ là một chuỗi với tiêu đề, cũng như Danh sách các tham số được truyền đến trình xử lý).

Node được xây dựng xung quanh sự kiện - một chu trình xử lý sự kiện toàn cầu đang kiểm tra mỗi đánh dấu vào dù dữ liệu đã sẵn sàng cho bất kỳ Collacks nào do người dùng xác định. Nếu dữ liệu là, thực thi mã bắt đầu. Nếu không có nhiều mã - chúng tôi mong đợi cuộc gọi tiếp theo. Chu trình được thực hiện bên ngoài JS và trong chính động cơ được viết bằng C, do kết quả của nó xảy ra rất, rất nhanh (khoảng hàng trăm nghìn lần mỗi giây). Một cái gì đó giống như một chu kỳ vô hạn. Ngoài ra, một trình thu gom rác rất hiệu quả (GC) được tích hợp vào máy chủ, vì vậy thậm chí hàng ngàn kết nối không gây ra tràn bộ nhớ và các giọt máy chủ. Node.js. Nó có một hệ thống làm việc gốc tích hợp với các sự kiện.

Máy chủ hấp đơn giản nhất

Chúng ta hãy cố gắng viết đơn giản, nhưng đồng thời là một ví dụ hữu ích, trong thời gian thực sẽ cung cấp cho người dùng thông tin hữu ích mà không cần khởi động lại trang. Dưới đây là một ý tưởng cho ứng dụng của chúng tôi - lấy dữ liệu mới được thêm vào nhật ký văn bản và để hiển thị chúng trong thời gian thực trên trang web:

var sys \u003d yêu cầu ("sys"), net \u003d yêu cầu ("mạng"), spawn \u003d yêu cầu ("child_process"). Sinh sản, http \u003d yêu cầu ("http");
sys.puts ("Quy trình NMY PID:" + Process.pid + "n");
var tail \u003d spawn ("đuôi", ["-f", "/var/log/nginx/access.log"]);
// chỉ ra tên của tệp nhật ký
Sys.puts ("bắt đầu đuôi");
tail.stdout.addlistener ("Dữ liệu", chức năng (dữ liệu)
(Sys.puts (dữ liệu);
// nhân đôi bản thân trên bàn điều khiển
});
http.createserver (hàm (req, res)
{
Res.sendheader (200, ("loại nội dung": "văn bản / đồng bằng")));
đuôi.stdout.addlistener ("Dữ liệu", chức năng (dữ liệu) (res.write (dữ liệu);));
)). Nghe (80);

Sử dụng hàm SPAWN (), chúng tôi tạo một tiện ích đuôi của công ty con, trên thực tế, được đọc bằng cách đọc dữ liệu mới xuất hiện trong logfile. Quá trình chỉ bắt đầu một lần trong quá trình khởi động máy chủ. Trên thực tế, nhiệm vụ của chúng tôi là bắt được những khoảnh khắc khi lệnh đuôi sẽ hiển thị dữ liệu mới từ logfight và phát đầu ra vào trang Web vào mỗi máy khách được kết nối. Để thực hiện việc này, chúng tôi sẽ làm theo sự xuất hiện của sự kiện dữ liệu (sự xuất hiện của dữ liệu mới) cho biến mà quy trình tiện ích đuôi đang chạy và hiển thị chúng vào trang bằng lệnh Write (). Do đó, kết nối sẽ vẫn mở cho mỗi yêu cầu HTTP. Đó là tất cả. Thực hiện theo hoạt động của quy trình không quá dễ dàng cho một ứng dụng web thông thường, nhưng không có gì đáng là không phải là kiến \u200b\u200btrúc không khối Node.js. và logic thực hiện dựa trên các sự kiện. Chúng ta chỉ phải chạy tập lệnh: "Node Tail.js error.log" và mở trong trình duyệt http: // localhost: 80. Trang sẽ hiển thị tất cả các tin nhắn xuất hiện trong error.log logfile.

Đây là một câu chuyện cổ tích

Bây giờ, chọn một cái gì đó như thế này để viết ứng dụng Web 2.0 tiếp theo, trong đó không chỉ một mã ứng dụng khách đẹp, mà một cái gì đó cần phải được thực hiện trên máy chủ, một suy nghĩ buồn sẽ tăng vọt rằng mọi thứ đã được phát minh và viết thư cho bạn. Các ngôn ngữ tương tự như mười năm trước, cùng một thư viện, giao thức và máy chủ. RNR Trong bao nhiêu tuổi, Perl nói chung là màu xám, Python có tất cả mọi người nghe, và Ruby đã cố gắng chán. Viết cho web là thói quen - xem bạn bè của bạn đang ngồi và suy nghĩ gì để làm gì với Zend-Framework 25 megabyte. Và bạn muốn một cái gì đó mới, để ở rìa của sự tiến bộ, tạo ra những gì mọi thứ sẽ viết trên, và bây giờ chỉ chỉ có tin tặc nhiệt tình và tìm kiếm chính mình lập trình viên zen bây giờ? Nhìn vào JavaScript trong máy chủ, nó được tạo đơn giản cho việc này. Rất đơn giản, mạnh mẽ, chưa được sa lầy trong tấn thư viện và khung. Các nhiệm vụ không được giải quyết trên RNR trên cơ sở trên cơ sở Node.js. Giải quyết hàng chục dòng. Và, có lẽ, đó là một chương trình đó cuối cùng sẽ mang lại cảm giác hân hạnh từ sự phát triển!

Www.

  • Vật liệu trên Nodejs: Groups.google.com/group/nodejs
  • Trang web và diễn đàn nói tiếng Nga: forum.nodejs.ru
  • Thông tin máy chủ JS: en.wikipedia.org/wiki/server-side_javascript
  • Hướng dẫn tốt cho người mới bắt đầu bằng Node.js: www.slideshare.net/the_undefined/nodejs-a-quick-tour
  • Trình bày Node.js: nodejs.org/jsconf.pdf

Thông tin

Hầu hết, nếu không phải tất cả, các thư viện và dự án trên Node.js tập trung vào GitHub, vì vậy nếu không có mô-đun bạn cần, hãy tìm nó ở đó.

  • chuyển khoản

Năm 2009, nền tảng Node.js đã thực hiện các bước đầu tiên khiêm tốn trong thế giới vô tận của sự phát triển của phụ trợ. Đó là nỗ lực đầu tiên để sử dụng JavaScript trong các ứng dụng máy chủ. Ngày nay sẽ cực kỳ khó tìm thấy một nhà phát triển web không nghe về nút. Nhưng không thể nói rằng sự tồn tại của nút không mây. Nền tảng này sống sót sau cộng đồng phân chia, là chủ đề của các cuộc chiến diễn đàn và mang lại nhiều người tuyệt vọng.

Bạn có thể nghĩ rằng những tuyên bố như vậy nghe có vẻ hào hoa. Tuy nhiên, hãy thử tìm kiếm Google và bạn sẽ phải đối mặt với một nguồn tranh chấp vô tận vô tận. Trong số các lý do không có lợi cho nút mà bạn có thể gặp, ví dụ, có những người, hỏi những gì đã xảy ra với tiên đề sử dụng công cụ tốt nhất để giải quyết một số tác vụ, cho biết JS và gần như đứng với các công cụ máy chủ phù hợp . Ghi chú quan trọng về JS, như "Gallback Địa ngục là có thật", kêu gọi tin vào thực tế của địa ngục của Callbaks, giống như những dòng từ bài thơ. Một số nút phê bình được thể hiện trực tiếp nhiều hơn và rõ ràng hơn: "Nút là một khối u ung thư."

Tôi cho rằng đã đến lúc khôi phục vị trí thực sự của sự vật, hãy đặt tất cả các điểm trên "i" về Node.js và nền tảng JavaScript như một ngôn ngữ phát triển máy chủ. Hôm nay chúng tôi sẽ nói về trạng thái hiện tại và sự phát triển của Node.js, về việc sử dụng thành công nhất của nền tảng này, về những hạn chế và công nghệ được tạo ra trên cơ sở của nó.

Trạng thái hiện đại của node.js như một nền tảng máy chủ

Trước khi nói về nền tảng máy chủ của nút trông như thế nào, hãy nhớ nó là gì.

Cụ thể, đây là một JavaScript Run, được xây dựng trên cơ sở của JS Engine V8, được phát triển bởi Google và được sử dụng trong Google Chrome.. Node.js sử dụng mô hình đầu ra đầu vào không chặn, được quản lý bởi các sự kiện làm cho nền tảng này đơn giản và hiệu quả.

Khi bắt đầu tài liệu này, nút được hiển thị như một cơn ác mộng của lập trình viên. Tuy nhiên, nền tảng này đã không vô tình trở nên rất phổ biến. Ở đây chúng tôi sẽ không dựa vào các tuyên bố vô căn cứ. Nhìn rõ hơn về sự thật. Cụ thể, nghiên cứu mới Ngăn xếp tràn. Cho thấy node.js, tại thời điểm này, công nghệ phổ biến nhất trong số các nhà phát triển.


Ngoài ra, JS là một ngôn ngữ có sự phổ biến trong năm năm qua đang phát triển nhanh hơn so với các ngôn ngữ khác, mặc dù thực tế là C # và PHP sẽ mất vị trí của họ. Tỷ lệ lưu hành JavaScript, nếu thậm chí không nói riêng về nút, tăng lên.


Làm cách nào tôi có thể giải thích JavaScript trong vai trò của ngôn ngữ máy chủ quá nhanh và được cộng đồng nhà phát triển chấp nhận rộng rãi và được chấp nhận rộng rãi? Nói một cách đơn giản, nút sống sót qua sân khấu mà anh ta được coi là một số niềm vui, và bước vào giai đoạn ổn định và trưởng thành. Một cộng đồng mạnh mẽ đã được hình thành xung quanh nó, kích thước của việc phát triển đều đặn. Hệ sinh thái nút cũng xứng đáng được đề cập, vì, ví dụ, trình quản lý gói NPM, trong hiện tại Trình bày sổ đăng ký lớn nhất trên Internet.

Node.js không chỉ thực hiện một cuộc cách mạng trong phát triển máy chủ, mà còn nhờ anh ta đóng góp cho việc thực hiện các ứng dụng khách hàng, vì các lực lượng nghiêm trọng đã tham gia vào việc phát triển động cơ V8. Ngoài ra, ông đóng vai trò nổi bật trong việc mở rộng toàn bộ hệ sinh thái JavaScript và cải thiện các khung JS hiện đại, chẳng hạn như Angular, React hoặc Vue.

Theo thời gian, nút đã có thể bác bỏ định kiến \u200b\u200bcủa những ngày đầu. Đây là một số trong số họ.

Mã JavaScript cho Node.js đáng buồn được biết đến trong sự phức tạp của việc gỡ lỗi.

Đối với các ứng dụng Gỡ lỗi máy chủ JS, bạn có thể sử dụng các kỹ thuật tương tự được sử dụng để gỡ lỗi mã máy khách bằng Trình kiểm tra Node, trong đó các công cụ dành cho nhà phát triển Chrome được thu thập.

Nút không thể được sử dụng để phát triển các ứng dụng máy chủ lớp công ty.

Tuyên bố này cũng không tương ứng với thực tế. Nút trên cơ sở bạn có thể tạo hệ thống công ty.. Khó khăn chỉ nói dối rằng nó không chứa nhiều công cụ tích hợp đơn giản hóa việc tạo ra các hệ thống đó. Tuy nhiên, những người chơi thị trường CNTT đáng chú ý sử dụng nút dưới dạng nền tảng web của công ty. Trong số đó - Netflix. Paypal, Yahoo!, Walmart.

JavaScript là. ngôn ngữ độngDo đó, làm việc với nó, không thể sử dụng một cái gì đó như kiểm tra tĩnh các loại khi biên dịch.

Đúng rồi. Tuy nhiên, hệ sinh thái JS xuất hiện như Typecript và Flow, nhằm mục đích làm việc với các loại trong JS, điều này có thể tăng độ ổn định và khả năng dự đoán các chương trình, đơn giản hóa gỡ lỗi. Trong lĩnh vực này, bạn có thể sử dụng các khả năng của trình biên dịch đóng từ Google.

Javascript không được tạo như một ngôn ngữ để phát triển máy chủ.

Tại đây, bạn chỉ có thể nói rằng JS đã có thể hoạt động trên các máy chủ, trong khi Netscape đã xây dựng sự hỗ trợ của ngôn ngữ này vào trình duyệt của bạn. Và nó đã ở trong những năm 1995. JS thường được gọi là ngôn ngữ phát triển web của khách hàng chỉ vì anh ta chiếm hoàn toàn quả cầu này.

Trong thực tế, danh sách này có thể được tiếp tục và tiếp tục.

Bây giờ hãy nói về các kịch bản của việc sử dụng Node.js và về các hạn chế của nó để hiểu rõ hơn về nơi này của công nghệ này trong thế giới hiện đại.

Kịch bản ứng dụng nút.

Vì vậy, tại sao đối xử với Node.js như một phương tiện phát triển máy chủ trong ngăn xếp công nghệ bạn sử dụng?

Tài sản và đặc điểm chung

Hãy để tôi một cách ngắn gọn để chỉ định điều quan trọng nhất:
  • Rất có khả năng các phần của khách hàng trong các ứng dụng web của bạn được viết bằng JavaScript. Trong trường hợp này, tính linh hoạt của mã trong ngăn xếp ứng dụng được sử dụng là một điểm cộng quan trọng của JS và trên máy chủ mà bạn nên nhớ.
  • Các công cụ như WebPack Trợ giúp để sử dụng lại mã và trên máy khách và trên máy chủ, dẫn đến tính đồng nhất của nó ở tất cả các cấp của hệ thống.
  • Sử dụng JS trên máy khách và trên máy chủ, bạn có thể tạo các ứng dụng web có thể được hiển thị trong trình duyệt và trên máy chủ. Trong trường hợp này, các hệ thống như vậy thường hoạt động rất rõ ràng và dễ hiểu. Tôi cho rằng nó chỉ là tuyệt vời.
  • Sự xuất hiện của thiết kế Async / đang chờ trong nút đã thay đổi hoàn toàn cách tiếp cận để viết mã không đồng bộ.. Bây giờ mã này giống như một mã đồng bộ thông thường và về ngoại hình và trên hành vi. Cơ chế Async / Await được hỗ trợ trong nút bắt đầu từ phiên bản 7.6. Ông, đặc biệt, là một giải pháp để buồn vấn đề nổi tiếng Địa ngục Callbanks.
Một số xem đồng hồ cơ sở mã khách hàng và các máy chủ trừ nút trừ, nói rằng anh ta buộc nhà phát triển sử dụng JavaScript. Tuy nhiên, điều này không hoàn toàn đúng. Nếu cần thiết, từ các ứng dụng nút có thể được chuyển đến các thư viện chuyên ngành của bên thứ ba.

Giả sử bạn cần các công cụ để mã hóa video. Để trang bị dự án của bạn, được viết bằng JavaScript, bạn sẽ không phải tìm kiếm một số thư viện bí ẩn lan truyền nhỏ cho nút. Bạn có thể dễ dàng sử dụng các công cụ đã được chứng minh bằng cách mô phỏng sự tương tác với chúng từ nút. Hoặc, ví dụ, nếu có một thư viện nhất định trên Python, điều này khiến bạn phải tính toán phức tạp, bạn có thể chạy mã hóa cụ thể để hoạt động với nó và truy cập các chức năng tương ứng của thư viện này thông qua API REST.

Xem xét tất cả những điều trên, bạn có thể phân bổ các lựa chọn sau đây Sử dụng Node.js, trong đó nó tiết lộ đầy đủ các điểm mạnh của nó.

▍Senarium №1. Ứng dụng của thời gian thực

Ứng dụng cộng tác (như trello và Google Docs.), Phòng trò chuyện tương tác, hệ thống nhắn tin tức thời và các trò chơi trực tuyến là những ví dụ về các ứng dụng thời gian thực, khi phát triển các tính năng của kiến \u200b\u200btrúc Node.js có thể phục vụ bạn một dịch vụ tốt.

Thời gian cần thiết bởi các ứng dụng này để thực hiện một số hành động nhất định có thể được mô tả từ quan điểm của người dùng, các từ "ngay lập tức" và "ngay bây giờ." Đối với hoạt động bình thường của các ứng dụng như vậy, hệ thống mà chúng dựa trên sẽ cung cấp rất tốc độ cao Một phản ứng với hành động của người dùng và mức độ chậm trễ thấp. Nút đáp ứng các yêu cầu này.

Nút tạo điều kiện cho việc xử lý nhiều yêu cầu từ khách hàng, kiến \u200b\u200btrúc của nó đóng góp sử dụng hiệu quả Thư viện, nó cung cấp đồng bộ hóa dữ liệu rất nhanh giữa máy khách và máy chủ.

▍Senarial №2. Ứng dụng một trang

Một ứng dụng một trang là một ứng dụng được trình bày bởi một trang web được tải vào trình duyệt, nội dung được cập nhật động trong quá trình tương tác của người dùng với nó. Hầu hết tải trong quá trình vận hành các ứng dụng như vậy rơi vào phần máy khách của hệ thống được viết bằng JavaScript.

Ngay cả mặc dù các ứng dụng một trang là một bước quan trọng trong sự phát triển của phát triển web, chúng có vấn đề, ví dụ, liên quan đến kết xuất. Đặc biệt, nó có thể không bị bệnh để ảnh hưởng đến việc tối ưu hóa tìm kiếm của các trang. Giải pháp phổ biến của những vấn đề này là phục vụ kết xuất với Node.js.

▍Senarium №3. Khả năng mở rộng

Máy chủ trên nút sẽ không bao giờ mạnh hơn nhiều so với cần thiết. Vẻ đẹp của kiến \u200b\u200btrúc nút bao gồm sự tối giản của nó, trong thực tế là phần máy chủ của các ứng dụng có thể được thu nhỏ tùy thuộc vào nhu cầu của dự án. Bí mật ở đây nằm ở thái độ phù hợp với hiệu suất.

Ngay cả tên của chủ đề của cuộc trò chuyện của chúng tôi, nút tập trung vào khả năng xây dựng các hệ thống từ nhiều loại các nút tính toán phân tán nhỏ có thể trao đổi lẫn nhau.

Nút mô-đun cho phép bạn tạo các ứng dụng nhỏ mà không phải đối mặt với nhu cầu hỗ trợ một cơ sở hạ tầng lớn, nhiều phần sẽ không chịu được trong một trường hợp cụ thể. Khi phát triển các ứng dụng nút, lập trình viên chọn chính xác những gì anh ta cần và, nếu cần, mở rộng giải pháp.

Tuy nhiên, cần lưu ý rằng các tính năng tương tự Tỷ lệ đi kèm với những khó khăn nhất định. Và, nếu bạn mất cảnh giác, node.js có thể trở thành ... nguy hiểm.

Hạn chế Node.js.

Nói một cách trung thực, nút cho phép nhà phát triển được gọi là, "tự bắn vào chân." Trong thế giới này, mọi thứ phải được trả tiền cho tất cả mọi thứ, bao gồm - và cho các cơ hội rộng rãi để thiết lập hệ thống và phù hợp với nhu cầu của nó. Nếu bạn làm việc với nút, không có đủ kinh nghiệm hoặc thường xuyên phóng cách tự bắn - bạn có thể phải đối mặt với các vấn đề nghiêm trọng như mất khách hàng.

Trái ngược với các phương pháp truyền thống hơn, khắc phục những đặc điểm kiến \u200b\u200btrúc hoặc các tính năng kiến \u200b\u200btrúc khác của các hệ thống, cấu trúc hỗ trợ phần máy chủ của ứng dụng của bạn được tạo bởi bạn. Do đó, có nhiều quyết định ở đây, nghĩa là nhà phát triển cần biết chính xác - chính xác những gì anh ấy làm, và điều gì sẽ xảy ra với dự án nếu cần phải mở rộng.

Trong trường hợp các ngôn ngữ khác, như Ruby và khung phổ biến của Ruby on Rails, ví dụ, trong quá trình của ý tưởng, đó là lợi thế của các thỏa thuận về cấu hình của hệ thống. Những khung hình truyền thống này thực sự dẫn đầu nhà phát triển bằng tay, chỉ cho anh ta cách chính xác, an toàn để giải quyết các nhiệm vụ điển hình.

Nút biến mọi thứ, để nói, lộn ngược. Nhà phát triển được trao nhiều tự do hơn, nhưng đường dẫn đến việc thực hiện quan niệm có thể là những nguy hiểm hoàn toàn, nếu các giải pháp không chính xác sẽ được thực hiện trong công việc. Sẽ thích hợp để nhớ "địa ngục" khét tiếng ", sẽ đột nhiên hoàn toàn có thật.


Điều này không có nghĩa là nút không thể tạo các ứng dụng máy chủ lớn, nhưng ở trên phải được giữ trong đầu.

Ngay cả người tạo ra Node.js, Ryan Dal, kết quả là, trước khi chuyển sang các dự án khác, nhận ra những hạn chế của hệ thống. Anh ấy đã nói với chi phí này rất chắc chắn:

« Tôi nghĩ rằng nút không phải là hệ thống tốt nhất để tạo các dự án máy chủ quy mô lớn. Tôi sẽ sử dụng cho việc này. Và, thẳng thắn, đó là lý do tại sao tôi rời khỏi công việc trên nút. Tôi đã từng hiểu rằng, trên thực tế, đây không phải là hệ thống phát triển máy chủ tốt nhất cả.».

Các định kiến \u200b\u200bđã đề cập trước đây liên quan đến nút là công bằng cho đến khi một khoảnh khắc nhất định không phải là một nút đường dẫn dài lâu như vậy, và chúng, ở một mức độ nào đó, vẫn không phải là một âm thanh trống rỗng. Nút có đủ sự trưởng thành và phát triển, điểm yếu của nó, nếu cần thiết, sự sẵn có của thời gian, nó hoàn toàn có thể để có được xung quanh. Và các công cụ được phát triển bởi cộng đồng khiến nó có thể tạo trên cơ sở node.js gần như bất cứ thứ gì.

Hỗ trợ phổ biến để phát triển máy chủ trên JS

Cách đây không lâu, nếu ai đó nghĩ về việc tạo ra tất cả các phần của hệ thống của tôi trên JS, tôi ngay lập tức đến ý tưởng về ngăn xếp trung bình (MongoDB, Express, Angular và Node).

Tuy nhiên, tập hợp các công cụ này và những ngày này không mất liên quan, hiện đang ở trong hệ sinh thái JS có nhiều công cụ thú vị hơn nhiều cho cả máy khách và máy chủ phát triển, do đó bạn không nên giới hạn.

Dưới đây là một số máy chủ hiện đại phổ biến JS Frameworks:

  • Express.js vẫn là khung Node.js phổ biến nhất. Nó nhanh, nhỏ gọn, không áp đặt một nhà phát triển các giải pháp kiến \u200b\u200btrúc khắc nghiệt. Cơ sở phát triển nhanh chóng của nó là sự đơn giản và dễ hiểu. Có thể anh ta ở gần với tất cả các công cụ khác để ý tưởng bên dưới, nút, sau đó là một hệ thống mô-đun nhẹ.
  • Meteor, mặt khác, sử dụng làm sạch JavaScript. Và node.js bên trong một thiết kế quy mô khá lớn. Meteor và chính nó là một hệ sinh thái toàn bộ có thể tiếp cận sự phát triển của các ứng dụng máy chủ phức tạp hơn. Tuy nhiên, việc sử dụng Meteor có thể trở nên phức tạp hơn nếu cần một cái gì đó không được nhúng trong hệ thống.
  • SAILS.JS là một khung MVC thời gian thực. Ông được phát triển để mô phỏng mẫu MVC trên nền tảng Ruby on Rails, nhưng đồng thời có nghĩa là hỗ trợ các yêu cầu của các ứng dụng web hiện đại. Nó hoạt động tất cả nhờ các API được quản lý bởi dữ liệu, với kiến \u200b\u200btrúc có thể mở rộng, hướng dịch vụ.

    Tôi đoán điều quan trọng nhất mà tôi muốn làm là chỉ ra rằng giữa các "có" và "không" có thể tìm thấy trong nhiều lý do về nút và về JS như một ngôn ngữ máy chủ nếu diện tích rộng rãi "có thể".

    Và, như thế này với ai đó hoặc không, quan tâm đến nút liên tục phát triển.


    Vào cuối tài liệu này, tôi muốn nói rằng nó không nên được điều trị cho bất kỳ khung nào như một chiếc đũa, điều này sẽ giải quyết một cách kỳ diệu tất cả các vấn đề. Node.js chỉ là một trong những công cụ trong vũ trụ phát triển web khổng lồ. Trong một số tình huống, anh ta giải quyết các nhiệm vụ ở phía trước anh ta cực kỳ tốt, và trong công việc khác với anh ta có thể biến thành một cơn ác mộng.

    Nhiệm vụ của mỗi nhà phát triển bao gồm lựa chọn kỹ thuật cẩn thận phù hợp để thực hiện bất kỳ dự án mới nào. Đồng thời, điều quan trọng là phải tính đến tất cả các khả năng và không vứt bỏ các lựa chọn thay thế hiện có.

    Ví dụ, trong công ty Snipcart, nơi tôi làm việc, một kiến \u200b\u200btrúc được sử dụng .NET, có thể nói rất nhiều không có danh tính. Tại sao cô ấy được chọn? Vâng, đơn giản là vì tại một thời điểm cụ thể, hóa ra là công cụ tốt nhất để giải quyết các nhiệm vụ được đặt trước chúng tôi.

    Tôi hy vọng câu chuyện của tôi về nút sẽ giúp bạn đưa ra quyết định đúng đắn khi chọn nền tảng máy chủ cho dự án tiếp theo của bạn.

    Tags: Thêm thẻ

Andrew. Sumin.: Chào buổi chiều, tên tôi là Andrei Sumin, tôi làm việc trong Mail.Ru. Có thêm một chút thời gian, vì vậy tôi đã chuẩn bị một phần thưởng nhỏ - chỉ để hai mươi phút còn lại. Tôi sẽ chỉ cho bạn khả năng mẫu của chúng tôi, mà chúng tôi đã làm để đạt được những con số chúng ta cần.

Trước đó, chúng tôi đã hoàn toàn có một bộ tạo nhiệt độ trên "Si". Anh ta khá đặc biệt. Do đó, chúng tôi thực sự muốn các thiết kế như vậy khi bạn có thể sử dụng JavaScript.

Dưới đây bạn thấy những gì json.name bật máy chủ.

Tôi sẽ không làm tăng sự chú ý về việc này bây giờ. Trong phần chính của báo cáo, tôi sẽ nói về những gì chúng tôi biên dịch, tại sao và tại sao. Chỉ cần bây giờ tôi đưa ra các cấu trúc cơ bản có thể là đầu ra từ hàm băm. Bạn có thể bằng cách nào đó có niềm vui, làm "thoát" giá trị này.

An toàn \u003d đúng. Dưới đây bạn thấy mã được biên dịch. Theo "Safe \u003d True" ngay lập tức thấy rằng, hãy nói rằng, chúng ta đã biến mất "thử đánh bắt".

Các thiết kế mà bất kỳ mẫu Mẫu nào cần là "nếu" và, theo đó, "chọn". Nhưng thường là hình thức "nếu khác", nhà phát triển rất cần thiết. Nhưng nếu bạn muốn XML hợp lệ, thật không may, cách duy nhất - Đây là "chọn".

Ở đây mã được hiển thị trong đó nó được biên dịch.

Đương nhiên, chu kỳ được sử dụng. Ở đâu mà không có chu kỳ? Chu kỳ trên mảng, chu kỳ trong hàm băm.

Thêm mẫu mặc định của chúng tôi "Trimit" là tất cả những gì giữa các thẻ.

Tôi sợ rằng những người không quen thuộc với những thứ đó có thể có mặt ở đây. Nhưng trong HTML, khoảng cách là một biểu tượng có ý nghĩa. Do đó, nên chỉ ra rằng bạn muốn có một không gian ở nơi này. Vâng, có những điều cụ thể như vậy.

Fest: Script là cần thiết để chúng ta có thể thực hiện một số mã JavaScript ngay ở giữa mẫu.

Bây giờ tôi sẽ cố gắng thực hiện các cuộc biểu tình nhỏ để bạn thấy những gì nó dẫn đến. Ở đây, tôi có phôi ngày hôm qua. Đây là một máy chủ HTTP thông thường trên Node.js.

(Người nói cho thấy một cuộc biểu tình.)

Nó khởi chạy một số máy chủ. Từ đây chúng tôi lấy một mô hình. Mẫu tôi, tự nhiên, sẽ hiển thị. Tôi có một số cuộc biểu tình ở đây nhận xét. Chúng tôi lấy một mẫu, nó sẽ biến thành hàm JavaScript "Mẫu". Ở đây chúng tôi là một ngàn lần sử dụng mẫu này. Vì chủ đề chính của báo cáo của tôi vẫn là số, thì thật thú vị khi chúng tôi đo lường hiệu suất của nó trong một số tình huống căng thẳng. Dưới đây, tương ứng, chúng tôi có kết quả cho mẫu này.

Hãy nhìn kỹ hơn. Mẫu đầu tiên là một chu kỳ mười nghìn lần lặp.

Hãy đặt ở đây tốt hơn HTML, nó sẽ thú vị hơn. Nó hiển thị nhịp, bên trong chúng tôi lấy được ý nghĩa của "Xin chào" từ hàm băm của lối vào mẫu và chúng tôi được nối với ngày hiện tại. Ghép nối các chuỗi - Đủ "hoạt động đắt tiền". Tất cả sẽ đi mười ngàn lần. Thêm vào đó, tôi muốn bạn vẫn cho thấy rằng chính mô hình sẽ được hoàn thành một ngàn lần.

Hãy thử chạy ...

Bây giờ sẽ có số dựa trên Node.js. V8 đã sử dụng node.js. Chúng tôi thấy mười nghìn sự kết hợp như vậy. Đừng lo lắng, tôi chỉ mang theo sau vào trình duyệt, nếu không tôi sẽ gặp vấn đề với bộ nhớ trong trình duyệt. 10 nghìn sự kết hợp được thực hiện một ngàn lần. Họ đã cho chúng tôi năm giây. Điều này có nghĩa là cùng một lúc đã có 10 nghìn người bảo thủ, và phải mất 5 mili giây trên Node.js trên máy chủ.

Chúng ta có thể thấy sẽ mất bao lâu trong trình duyệt (nếu chúng ta gửi cùng một mẫu trực tiếp vào trình duyệt).

Con số này hơi khác nhau. Chúng ta thực sự có thể thấy một trình duyệt khác. Chúng tôi cũng quan tâm đến một mẫu JavaScript. Nói chung, bạn đã thấy những gì xảy ra. Đây là Opera. Vì vậy, anh ta phải có những thứ tương tự trên máy khách và trên máy chủ. Theo tôi, gần một phút - 40 giây. Trong mọi trường hợp, ngay cả khi có một chữ số rất lớn ở đây, nó cần được chia thành một nghìn.

Của bạn đây. 39 giây. Rõ ràng, phần còn lại của thời gian anh dành cho việc kết xuất trong chính trình duyệt. Ngay cả khi trong các trình duyệt khác nhau của chúng tôi, số liệu thu được, khác nhau nhiều lần (thậm chí có thể là một thứ tự) - bạn vẫn có tính đến tất cả những thứ này nên được chia thành một nghìn. Điều này có nghĩa là một vượt qua là 39 mili giây.

Để định cấu hình, chúng tôi sử dụng mẫu này trong máy khách cho các dự án được sử dụng - nó có thể là phiên bản di động của các dự án, đối với các phiên bản Android cũ và chúng tôi không có vấn đề về hiệu suất. Trong IE, tôi không may, bây giờ tôi không thể hiển thị, bởi vì tôi vẫn còn Mac. Nhưng có một số sắc thái thú vị.

Chúng tôi có mẫu mặc định với kích hoạt "đã thoát". Điều này sẽ được thảo luận trong phần chính của báo cáo. Nếu chúng ta biết rằng dữ liệu của chúng tôi không được người dùng quản lý chính xác, thì "đã thoát" có thể bị tắt.

Hãy xem những gì xảy ra với các con số. Nó đang ở trên máy chủ. Đây là V8 trên máy chủ thông qua Node.js.

Vì vậy, rõ ràng, tôi đã sai ở đâu đó. Đây là "Lưu TRUE". Điều này không ảnh hưởng đến. Và, tốt, vâng, tất nhiên, máy chủ phải được khởi động lại. Tôi vẫn quen với khách hàng để làm việc, nơi bạn nhấn Ctrl + S + F5.

Ở đây, thực sự, sự khác biệt.

Rất nhiều thời gian đòi hỏi "thoát HTML". Điều này tôi đã thực hiện để chứng minh thủ tục cho các vấn đề mà bạn phải đối mặt.

Đối với "Lưu", trên slide trước, mỗi biểu thức JS, làm cho phép chiếu, biến mặc định trong "thử bắt".

Nó chi phí, trên thực tế, không đắt lắm, ít nhất, trong V8.

Không có sự khác biệt. Mặc dù, trên thực tế, "thử bắt" đã được gói, như bạn hiểu, một ngàn mười nghìn. Nhìn chung, có rất nhiều hoạt động - 10 triệu. TRONG trình duyệt hiện đại Nó được thực hiện rất nhanh, và trong động cơ hiện đại.

Nếu bạn có mong muốn hơn là tải nó, bạn có thể thể hiện. Hãy thử. Có lẽ chúng ta thậm chí sẽ tìm thấy bất cứ điều gì có thể được cải thiện.

Bây giờ ví dụ thú vị thứ hai, mà không có chúng ta không thể sống. Anh ấy không mới. Chúng tôi đã mượn nó ở một số hình thức từ XSLT. Tôi cũng sẽ nói về nó. Bây giờ - trình diễn. Tuy nhiên, có lẽ ai đó sẽ đến đầu báo cáo.

Chúng tôi có một mẫu riêng biệt hiển thị nhịp. Trong khoảng, chúng tôi có một cuộc gọi (ở đây, tôi đã phân bổ nó) - Fest: Get. Có nghĩa là ở nơi này để hiển thị một khối có tên "Word". Và dưới đây là xác định rằng đây là nội dung của khối đó, tương ứng và bằng chữ "từ".

Đây. Chúng tôi hiển thị nội dung của khối này. Mẫu hiển thị chỉ cần bật tệp này, cho biết span với khối này. Không có gì xảy ra nhiều hơn, bởi vì "nếu" trả về "sai" (ít nhất là điều kiện trong "nếu" trả lại "Lies").

Rõ ràng đã thay đổi? Điều này là ví dụ, trong trình duyệt, trên thực tế, các mẫu tương tự cũng đang thực hành. Đây là thừa kế nhiều nhất là trong tất cả các mẫu hiện đại (và không hiện đại lắm). Theo tôi, đến "Django" - thực tế có vẻ giống nhau.

Tôi muốn nói rằng cú pháp XML này là "SUGHTACTIC SUGAR" cho các câu thơ. Chúng tôi có một số người quen thuộc với XSL khi bạn nhìn thấy cú pháp này, bắt đầu viết nó như một người bản địa. Nhưng điều này dẫn đến các vấn đề. Ở đây, chúng tôi có một "giá trị lễ hội", mà tôi di dời ở đây. Ở đây, hãy nói - "Giá trị lễ hội".

Họ đã đến và hỏi liệu anh ta có thuộc tính "định dạng", để có thể định dạng nó ngay tại giá trị Fest. Mà tôi đã trả lời họ: "Trong mục đặc biệt này, hãy quên đi XSL. Bạn có bên trong JavaScript." Bao gồm, về cùng một cú pháp. Nó được tạo ra độc quyền để các nhiệm vụ thông thường dẫn đến các giải pháp tốc độ rất nhanh. Do đó, không có "diềm đặc biệt" ở đó. Nếu "dầm" là, nó sẽ là một giải pháp có ý thức của một nhà phát triển cụ thể. Nó phải được thể hiện trong JavaScript.

Đây là một nhiệm vụ thú vị hơn. Giả sử chúng ta có một thư viện JavaScript ... Tính năng này có thể từ chối các từ. Ở lối vào, nó có được số và mảng các từ phải nghiêng. Chúng tôi cắm dòng này. Vì vậy, trên máy chủ tại thời điểm này, JavaScript này sẽ được thực thi, tạo chức năng này.

Tạo một mảng từ. Dưới đây là một mảng nhỏ sẽ lấy được kết quả từ 0 đến chín, vì hàm này sẽ hoạt động với các tham số đầu vào đó.

Đây là chức năng của từ đã kéo dài.

Trong chính nó, nó không thú vị lắm nếu không phải là ví dụ sau đây.

Bây giờ cô ấy là một mẫu tạo HTML cho trình duyệt. Chú ý: Không còn là "lễ hội bao gồm", mà "Lễ hội chèn". Ở nơi này, chúng tôi chèn JavaScript này. Trình duyệt sẽ nhận được nó như một chương trình JavaScript.

Ở đây chúng tôi nhận được chính xác ví dụ tương tự. Đây là chức năng của chúng tôi đã đến với khách hàng và chúng tôi có thể sử dụng nó trên máy khách.

Phần thưởng lớn nhất mà chúng tôi đã chiến đấu - để các thư viện, mẫu, chương trình, các chương trình trên JavaScript có thể được sử dụng trên máy khách và trên máy chủ. Trước đây, không thể chỉ vì nó chậm và không thể hiểu được. Đột nhiên, người nhớ những nỗ lực đầu tiên để sử dụng JavaScript trên máy chủ - theo ý kiến \u200b\u200bcủa tôi, một số IDE. Jagser, theo tôi, nó được gọi là.

Bản sao từ hội trường: Có phải đó là aptana?

Andrew. Sumin.: Vâng, Aptana. Tất nhiên, có một thất bại hoàn toàn. Tôi thực sự đã thử anh ta, thực sự đã cố gắng, nhưng đầu hàng. Với sự ra đời của các động cơ riêng lẻ từ các trình duyệt khác nhau, với sự ra đời của cuộc thi khi họ cạnh tranh với nhau về hiệu suất, chúng tôi có khả năng sử dụng JavaScript trên máy chủ.

Bạn có thắc mắc về ví dụ của tôi?

Bản sao từ hội trường: Tôi có thể xem mã được biên dịch không?

Andrew. Sumin.: Đúng. Mã biên dịch có thể nhìn thấy. Ở đây, biên dịch mã mẫu. Ở đây một số chức năng dịch vụ đi đầu tiên, tất nhiên. Như tôi đã nói, tôi cần trốn thoát.

Ở đây, hãy nói chu kỳ của chúng tôi. Vì vậy, tôi đã phân bổ nó. Hãy thử mang đến gần hơn. Dưới đây là ngày Hello +. Như tôi đã hứa, chúng tôi có tất cả mọi thứ theo mặc định trong thử đánh bắt. Vì vậy, nếu bạn đột nhiên có một lớp, những người không thực sự nghĩ trong JavaScript, anh ta, ít nhất bạn sẽ phá vỡ bất cứ điều gì. Escape html - trung thực, tất cả không gian lận.

Bản sao từ hội trường: Bạn có ai hiểu Javascript trong nhóm của bạn không?

Andrew. Sumin.: Đúng. Tôi có nhiều hơn trong đội, có lẽ, có lẽ là ba hoặc bốn (thậm chí có thể năm người) biết cách "chuẩn bị kịch bản Java". Họ hiểu nó là gì, và làm thế nào để chuẩn bị nó. Một mối nguy hiểm lớn hơn nhiều là một "chấn thương" kiến \u200b\u200btrúc như vậy - cái gọi là "var". Nếu bạn không khai báo nó, thì bạn sẽ gặp vấn đề. Trên máy chủ, nó thực sự bị rò rỉ bộ nhớ, bởi vì theo mặc định, biến sẽ rơi vào danh sách toàn cầu và ở đó và sẽ vẫn còn, ít nhất trước khi khởi động lại bối cảnh.

Nhưng chúng ta có chế độ thẳng, không cho phép nó làm. Mẫu mặc định hiện tại đang hoạt động với chế độ thẳng. Tôi đã cố gắng gây rò rỉ bộ nhớ - tôi đã không thành công.

Hãy bắt đầu câu chuyện về việc thực thi JavaScript trên máy chủ.

Tại sao bạn cần nó?

Đương nhiên, câu hỏi đầu tiên xảy ra khi chúng ta nói về JavaScript trên máy chủ là một câu hỏi "Tại sao?". Tôi có rất nhiều chương trình trên JavaScript, tôi yêu anh ấy rất nhiều. Nhưng điều này là không đủ. Nó vẫn cần thiết phải làm việc.

Trong các công ty lớn (tôi đã làm việc trong một số công ty lớn) có một tính năng như vậy. Chúng tôi có rất nhiều nhà phát triển phụ trợ mạnh mẽ. Họ biết cách viết mã, biết nhiều về máy chủ. Do đó, hãy để họ viết một trình phát mẫu cho các câu thơ (nếu bạn không cần phải lấy một số loại đặc biệt). Vì điều này, rất nhiều vấn đề phát sinh. Những nhà phát triển này có vấn đề riêng, ông chủ của họ, họ cần phải làm một cái gì đó. Khi họ đến với họ với các yêu cầu, hãy để chúng tôi kết thúc một cái gì đó, chúng tôi nhớ một cái gì đó, tôi không thích nó khủng khiếp khủng khiếp.

Đồng thời có một tính năng thứ hai, đặc biệt có liên quan ngay bây giờ. Có rất nhiều người biết Javascript. Cụ thể, tôi có rất nhiều người biết Javascript. Và tôi có mẫu hiện tại trong "si", nhưng tôi không có một người nào trong trình tự biết "si".

Tất nhiên, như tôi đã nói, mẫu trên máy khách. Chúng tôi nghĩ về tất cả những điều này, bắt đầu với dự án "Mail". Dự án "Mail" không thể thực hiện mà không có mẫu ở phía máy chủ, vì cần khởi động nhanh. Đối thủ cạnh tranh không ngủ. Nó không thể làm mà không có mẫu ở phía máy khách, vì AJAX được áp dụng, mọi thứ sẽ nhanh chóng ở đây. Người dùng phải được thỏa mãn vì nó rất dễ dàng để đi đến các đối thủ cạnh tranh.

Đồng thời, chúng tôi đã có được tình huống này khi chúng tôi có một mẫu trên máy khách và mẫu trên máy chủ, logic là như nhau và các mẫu là khác nhau. Sao chép mã, rất nhiều vấn đề. Nó không rõ phải làm gì với nó. Thực sự rất nhiều sai lầm.

Chúng ta muốn gì?

Như tôi đã nói, ngoài JavaScript, tôi vẫn đã viết rất nhiều trên XSL. Đây cũng là một sản phẩm rất tốt, có lẽ là người mạnh nhất. Nhưng cũng không có "thương tích chung". Mặc dù một số khả năng là cần thiết.

Thêm vào đó, nếu chúng ta có XSL, một trong những nhược điểm của nó là một số ngôn ngữ hoàn chỉnh về mặt thuật toán không được tích hợp sẵn. Khi chúng ta muốn sắp xếp lại mảng ở đó - đây vẫn là một nhiệm vụ có thể giải quyết được. Nhưng khi chúng ta muốn đi bộ "thường xuyên" ở đó, trong XSL, đó là một địa ngục thực sự.

Vì vậy, chúng tôi muốn những điều tốt nhất của hai điều này?

Dưới đây là một ví dụ mà tôi chỉ cho bạn, anh ấy rất giống với "django". Chúng tôi tuyên bố một số khối. Ở đây chúng tôi có "tiêu đề". Nội dung của nó được xác định ngay lập tức - đó là "mail.ru". Nếu chúng ta kết nối mẫu này như trên trang, chúng tôi sẽ hiển thị "Tiêu đề" với tiêu đề "mail.ru". Tất cả các dự án trên Mail.RU có thể kết nối nó và có một tiêu đề duy nhất.

Nhưng chúng tôi có một dự án "Mail". Đương nhiên, chúng tôi muốn điều tương tự trong các dự án khác, chỉ có tiêu đề là khác nhau. Đừng viết vì mẫu khác này! Tôi muốn xác định lại anh ta.

Chính javascript.

Chúng tôi thực sự muốn làm việc với dữ liệu đầu vào để hoàn thành thuật toán hoạt động. Có một thiết kế như "tập lệnh lễ hội". Trong đó, bạn có thể làm một cái gì đó trên JavaScript và bên dưới thông qua "giá trị lễ hội", trên thực tế, nó sẽ được lấy ra.

Mẫu này sẽ rút tiền trong Mail.ru.

Sampler chính nó.

Trên thực tế, chúng tôi đã có rất nhiều tranh chấp về cú pháp XML. Cú pháp XML là quá mức - thật là ngu ngốc để tranh luận với nó. Tuy nhiên, nhiệm vụ chính của chúng tôi là học cách "COOK" JavaScript trên máy chủ. Do đó, tôi không muốn quyết định song song. Và các nhiệm vụ "Hãy đưa ra cú pháp trong đó", "Hãy để chúng tôi đưa ra Escamping", "Hãy để chúng tôi viết trong đó tất cả các loại plugin cho IDE." Tôi không muốn quyết định điều này. Do đó, chúng tôi đã lấy XML, hóa ra với IDE hỗ trợ ngắn.

Bất kỳ IDE tự tôn nào mà không có bất kỳ cài đặt nào sẽ cho bạn biết rằng bạn có XML không hợp lệ. Và tính hợp lệ của các mẫu XML bằng súng máy, hóa ra, đưa ra hiệu lực của HTML đầu ra. Dưới đây là xác thực từ hộp.

Ngoài ra, vẫn còn trong tất cả IDE có đèn nền, tab tự động. Tôi không muốn làm phiền.

Ngay cả trong XML, có một điều tốt như mặc định là không gian tên. Mở rộng này.

Chúng tôi có một mẫu nhỏ, anh ấy không thực sự biết bao nhiêu. Bạn có những dự án thực sự. Đột nhiên bạn cần một đa ngôn ngữ. "May" nó trong mẫu Fest theo mặc định bằng cách nào đó lạ lùng. Anh ta sẽ "Swell Down" và dừng lại được hỗ trợ. Và nếu bạn tuyên bố, hãy nói, không gian tên của dự án của bạn, sau đó bạn có thể "chặn" trong trình biên dịch sự kiện này và xử lý nó theo cách riêng của bạn. Giả sử bạn có thể có fest không gian tên cụ thể và mail.ru.

Trong nhiều năm, chúng tôi có rất nhiều công cụ làm việc với XML. Khi tôi được biên dịch từ mẫu Fest trong XML, tôi đã có một lựa chọn phong phú về những gì có thể được sử dụng. Kết quả là, tôi đã sử dụng trình phân tích cú pháp SAX, nhưng không phải là một thực tế là tôi sẽ dừng lại ở đây.

Chuyển đổi XML sang XML

Một lần nữa, tôi đã đề cập rằng chúng tôi có chuỗi cuối tuần không đơn giản lắm. XML là ngôn ngữ "sóng" đủ. Do đó, tôi đã không thực sự muốn đối phó với sự thoát hiểm. Khi bạn có các thiết kế điều khiển giống như trong XSL, bạn có hầu hết tất cả các vấn đề về "Escamping" biến mất. Ngoài ra, vẫn còn những thứ khác như CDATA, cho phép bạn "esquaja".

Bán hàng

Khi chúng tôi quyết định cách mẫu sẽ trông như thế nào (gần như được hiểu là chúng tôi cần cho một giá đỡ thử nghiệm để nó bắt đầu hoạt động), chúng tôi bắt đầu triển khai trình biên dịch XML trong JavaScript.

Đó là một trải nghiệm khá bất thường về lập trình cặp cho tôi. Tôi thậm chí còn tự tin rằng lập trình cặp đôi cho rất kết quả tốt đẹp, rất tốt hơn một cách đơn độc.

Nhưng cụ thể ngược lại xảy ra về vấn đề này. Chúng tôi đã lấy mẫu, hiểu kết quả sẽ như thế nào, và bắt đầu biên dịch. Tôi đã làm phiên bản của mình và Kostya đã làm phiên bản của mình. Chúng tôi tập hợp một lần một tuần và, đại khái nói, những con số đã được đo. Đúng, số của anh ta nhanh hơn một chút.

Cấu trúc chống lại chức năng.

Chúng tôi đã chọn hai cơ bản phương pháp tiếp cận khác nhau. Tôi quyết định biên dịch XML vào cấu trúc. Và Kostya biên soạn ngay lập tức vào chức năng. Đầu tiên nó không an toàn cho tôi.

Để bạn hiểu phần tổng hợp vào cấu trúc là khoảng một mảng như vậy.

HECI có nghĩa là một hành động, và các chuỗi có thể lấy ngay cho khách hàng hoặc một cái gì đó để làm một cái gì đó.

Để giải thích. Băm đầu tiên - "hành động": "Mẫu" có nghĩa là mẫu bắt đầu. Với dòng thứ hai, không cần thiết phải làm bất cứ điều gì, bạn có thể mang nó ngay cho khách hàng. Dòng thứ ba có nghĩa là dòng thứ tư phải được bỏ qua val.và kết quả val. Đã rút tiền cho khách hàng.

Hoặc, ví dụ (có lẽ nó sẽ rõ ràng hơn), hãy xem xét tùy chọn với "nếu".

Đầu tiên, các dòng thứ hai giống như slide trước đó. Dòng thứ ba có nghĩa là biểu thức sau phải được thực hiện. Nếu nó đúng, thì, theo đó, bạn cần rút "TRUE". Nếu nó là sai, thì bạn cần rút "false".

Trên thực tế, nó được lấy cảm hứng từ một buổi tiếp tân khá nổi tiếng, được sử dụng gần như trong tất cả các máy tính - đây là hồ sơ người dùng đảo ngược. Tôi muốn bằng cách nào đó chơi với cô ấy, nhưng tất cả điều này là không cần thiết. Các mẫu thực hóa hóa ra dễ dàng hơn nhiều.

Với việc thực hiện trong chức năng, mọi thứ đều rõ ràng. Chỉ trong một số điều kiện, biến ban đầu bắt đầu nối, được trưng bày trong một chuỗi rỗng.

Kết quả chúng tôi muốn có được điều này.

Đây là một trong những dự án chính của chúng tôi. Đương nhiên, suy nghĩ về hệ thống mẫu, cần phải suy nghĩ về dự án này. Danh sách các chữ cái S. Đủ số lượng thư mục.

Tôi sẽ nói một cách trung thực: nhận thức đầu tiên tôi đã làm, đã giải quyết nhiệm vụ này trong 200 mili giây.

Từ xương của xương xương, theo tôi, trong vòng một tháng hoặc một tháng rưỡi. Đến sau cuối tuần, và một người nói: "Và tôi có 180!" Câu trả lời thứ hai: "Và tôi có 150!" Vân vân và vân vân. Trong thực tế, tại một số điểm tôi đã từ bỏ, bởi vì tôi nhận ra rằng tôi không bắt kịp. Chúng tôi bắt đầu thực hiện với một chức năng, cô ấy đã thắng. Khi chúng ta vẫn còn "liếm" mọi thứ đến cùng, chúng tôi đã có 3 mili giây cho nhiệm vụ này.

Danh sách các chữ cái được vẽ trong 3 mili giây. Sự biến đổi là khoảng nay, nó càng gần càng tốt với các thiết kế JavaScript đơn giản nhất. "Đối với" - trong "cho", "nếu" - trong "nếu". Chọn là "nếu () khác".

Chúng tôi đã phải chịu một chút từ Fest: Set, như tôi hiểu rằng chúng tôi không thể tiếp tục sống mà không có ghi đè này. Nó cũng không khó lắm. Chúng tôi có khi thực thi đầu tiên của hàm của mẫu đầu tiên tạo ra đối tượng "Set Set". Khi nó bắt gặp các khối XML "SET", hàm được viết lại, trong thực tế, trong thực tế, ghi đè nội dung của khối này.

Do đó, nếu "Set" là rất nhiều, thì khi mẫu đang hoạt động, sẽ trả về XML, chỉ có phần cuối cùng của chúng sẽ được thực hiện, không phải tất cả mọi thứ. Điều này cũng cho một sự gia tăng nhỏ.

Một hiệu ứng rất thú vị đã đưa ra những điều sau đây. Với nhận thức đầu tiên, chúng tôi không bị đóng băng lắm. Khi có 200 mili giây - chúng ta nói chung, không thấy điều này. Nhưng chúng tôi đã biên soạn đầu tiên trong một cấu trúc như vậy. Chúng ta có nguồn HTML.được biên soạn đơn giản để nối một dòng phía sau dòng.

Khi chúng tôi được chọn đến ba mili giây, chúng tôi đơn giản "thường xuyên" trong mẫu được biên dịch đã thay thế các "cộng với" bằng "này cho một dòng - trên thực tế, chúng tôi đã nhận được, một con số phong nha - cộng với 30% hiệu suất.

Một lần nữa, hãy nói về bảo mật.

Sự an toàn

Bằng cách bảo mật, tôi hiểu không chỉ XSS: Chúng ta phải cần Kemplateizer để giảm thiểu nó "ra khỏi hộp". Và tôi hy vọng rằng anh ta loại trừ chúng "ra khỏi hộp." Nhưng "thử bắt" nên là nếu đột nhiên một nhà sản xuất không lọc lọc sẽ lấy các tài sản mà không có định nghĩa (eng. Không xác định).

Do đó, theo mặc định, tất cả trong thử bắt. Hơn nữa, theo các bài kiểm tra của chúng tôi là "miễn phí".

Đây là một lối thoát. Ngoài ra còn có JavaScript, thoát HTML. Dữ liệu tùy chỉnh để không có quyền truy cập.

Một lần nữa, như chúng ta đã thấy, đây là hoạt động "thân yêu" nhất trong hệ thống mẫu của chúng tôi.

Tất nhiên, chúng tôi sử dụng chế độ nghiêm ngặt của người Viking để không có rò rỉ bộ nhớ.

Nếu thước đo đột nhiên nhìn thấy một cái gì đó, anh ta sẽ ngay lập tức nhận thấy rằng tôi đã làm điều gì đó sai. Và về sản xuất của chúng tôi, chúng tôi sẽ bắt đầu khởi động lại các máy chủ và tìm hiểu giữa việc khởi động lại, trong thực tế,, xảy ra.

Như tôi đã nói, biên dịch mặc định chỉ là "thử bắt" cộng với "thoát".


Hội nhập

Chúng tôi có những con số muốn. Hoặc ít nhất là nhận được một số số khá mà nó không xấu hổ đến.

Khoảnh khắc thú vị tiếp theo. Chúng tôi có ít nhất là có những ngôn ngữ này. Tôi chắc chắn rằng họ nhiều hơn nhiều. Nhưng đây là những người mà tôi gặp phải.

Đây là "SI" - Chúng tôi có một máy chủ HTTP trên "si" và nó được viết rất nhiều logic trên đó. Perl: Hầu hết các thư được viết trên Perl. Một số dự án được viết trên Python. Node.js Chúng tôi không có sản xuất trên sản xuất, nhưng chúng tôi cũng sử dụng nó trong sự phát triển, một cách tự nhiên, bạn phải sống với nó.

Có vẻ như chúng ta thêm vào sự đa dạng này cũng là V8, chúng ta sẽ chỉ làm cho tồi tệ hơn. Nhưng khi chúng tôi đã thêm V8 cho tất cả các công nghệ này cho tất cả các công nghệ này trên thực tế, nó rất dễ dàng cho nó. Cần v8 (có API Google.) Tipped ba chức năng này để đăng nhập.

V8 chỉ là một thư viện, trong chính nó, cô ấy không biết làm thế nào. Đây là một thư viện lấy thứ gì đó vào lối vào, một cái gì đó mang lại cho lối ra. Đương nhiên, khi bạn bên trong một cái gì đó xảy ra, bạn muốn thông báo cho thế giới bên ngoài về nó. Fest_log này đã theo quyết định của công nghệ. Anh ta hoặc trong bảng điều khiển hoặc trình duyệt hoặc thư hoặc quản trị viên hệ thống SMS có thể báo cáo rằng bên trong V8 là điều sai. Và V8 Chức năng này bên trong nhận được và bằng cách nào đó có thể tương tác với nó và thông qua nó với một thế giới bên ngoài.

Fest_file, tự nhiên, mẫu. Nó đánh bại các tệp, "bao gồm", "chèn", v.v. và tương tự. Do đó, khi V8 thu thập và biên dịch các tệp, nó cần phải xử lý "bao gồm" và "chèn". vì thế môi trường bên ngoài Phải cung cấp V8 khả năng đọc tệp.

Dirname là một trifle như vậy. Khi bạn muốn đọc tệp, bạn cần dựa vào một cái gì đó. Đây là thư mục của tệp JavaScript thực thi hiện tại. Ba thiết kế này là đủ cho V8 để kiếm tiền.

Những điều sau đây đã xảy ra. Chúng tôi có một sở thú toàn bộ công nghệ trên máy chủ back-end. Nhưng có một dự án sử dụng lễ hội trên máy chủ. Có một dự án sử dụng lễ hội trên khách hàng. Có một dự án sử dụng Fest trên máy khách và trên máy chủ. Ở mọi nơi một cú pháp duy nhất và các câu thơ di chuyển giữa các dự án, không có vấn đề gì với điều này. Tất nhiên, chúng tôi "ra khỏi hộp" đã tích hợp với trình duyệt.

Lễ hội được biên soạn thành các cấu trúc JavaScript nguyên thủy, mà (tôi chắc chắn) thậm chí Explorer được chấp nhận. Chỉ cần có chỗ để thử, xin lỗi.

Làm việc với người dùng thực sự

Vì vậy, chúng tôi có một nhận thức và chúng tôi vẫn muốn đến với người dùng, học cách làm việc với họ. Tôi đã đến Igor với việc thực hiện này và nói rằng chúng tôi đã chạy các hoạt động được tải thử nghiệm xếp chồng ba mili giây. Anh trả lời: "điệu nhảy, như bạn muốn - và có cả bốn."

Bạn phải hiểu rằng việc sản xuất là, ngoài việc chuyển đổi, một số dữ liệu khác mà bạn cần để có được một cái gì đó để làm một cái gì đó. Và 4 mili giây là tất cả.

Nó đã được sử dụng bởi nhà bếp bên trong của chúng tôi, không có khả năng ai đó có như vậy. Nhưng, thật không may, cô hóa ra là rất quan trọng để nhớ cô.

Máy chủ HTTP của chúng tôi được viết trên "si", chúng tôi gọi nó là ánh sáng. Khi nó nhận được dữ liệu từ máy chủ Back-end, thì nó sẽ lưu trữ chúng trong một hàm băm phẳng. Trong thực tế, nó là một lựa chọn nguyên thủy. Nó nên dễ dàng đọc. Chỉ trong trường hợp tôi sẽ chỉ định rằng đây là danh sách các chữ cái. Dòng đầu tiên có nghĩa là độ dài của nó là năm, dòng thứ hai có nghĩa là chữ cái đầu tiên của tiêu đề "chữ" là và dòng thứ ba có nghĩa là nó không được đáp ứng.

Đương nhiên, khi chúng ta đang nói về JavaScript, chúng tôi muốn xem V8 này bên trong nó.

Bằng cách nào đó chúng ta cần đẩy nó vào bên trong động cơ V8. Chúng tôi đã thử rất nhiều lựa chọn. Sửa đổi tất cả các loại ràng buộc, Perloui và các giải pháp của họ - theo tôi, khoảng hai tuần phải chịu đựng. Dưới đây là tùy chọn mà chúng tôi chính xác đã thử là một giải pháp cho vấn đề thông qua API V8.

Tôi đã cố gắng, nhưng thật không may, nó đã không diễn ra để mang lại mã trên "si". Nó thực sự rất nhiều. Tôi sẽ cố gắng giải thích bằng lời.

Thông qua API V8 có thể được thực hiện như thế này: Nếu bạn viết JSON trong JavaScript, tại thời điểm này, V8 kêu gọi mã của bạn trên "C". Mã trên "si" tại thời điểm này có thể được trả lại bởi những gì anh ta coi là phù hợp. Anh ta có thể viết json.name. Nó sẽ ở trong hai cách tiếp cận - lần đầu tiên anh ấy sẽ liên lạc với JSON và thứ hai là để biết tên. Nó dài quá.

Tùy chọn thứ hai là json.parse. Khi bạn nâng tỷ cảnh V8, thì trên "Si", bạn đã thu thập một dòng mà một trong một giống như JSON. Gửi nó đến bối cảnh, và ngay trong bối cảnh áp đặt trên V8 json.parse này "từ hộp." Theo đó, đã bên trong bối cảnh bạn có một hàm băm có thể được gửi đến mẫu. Điều này cũng hóa ra là chậm.

Tùy chọn nhanh nhất chỉ là tùy chọn thứ ba. Tôi sẽ cố gắng vẫn là một đoạn mã trên "si" từ anh ta để hiển thị.

Ở đây bạn có dòng thứ hai. Đây chỉ là một mô hình. Tính năng JavaScript trong đó Fest được biên dịch. Cô đang đợi JSON. Bạn thu thập một dòng như vậy, hãy gọi tính năng này và một đối số đầu tiên và duy nhất là JSON, phải được sử dụng. Đưa ra lệnh để làm điều đó.

Những con số không được lắm. Với một hạn chế của bốn mili giây, hai trong số đó là sự biến đổi. Chúng tôi đo chúng riêng biệt. Bốn giây chiếm quá trình chuẩn bị dữ liệu.

Bây giờ bạn đang tìm kiếm: có vẻ như, bốn mili giây để chuẩn bị dữ liệu - Vậy thì sao? Và đây là 67% sự biến đổi.

67% thời gian chúng tôi chuẩn bị dữ liệu để tạo HTML này. Chúng tôi đã có một nhiệm vụ để đáp ứng cùng một sức mạnh mà bây giờ. 6 mili giây thay vì 4, nó gần gũi. Nhưng nó vẫn bị tổn thương. Trong thực tế, tại thời điểm đó, chúng tôi gần như đã bỏ rơi ý tưởng này.

Nhưng tôi vẫn thấy sức mạnh để lấy cái băm đó mà bạn nhớ. Tôi lấy nó ở dạng văn bản, về nhà. Thành thật mà nói, tôi không nhớ mã bây giờ. Nhưng tôi ra ngoài xem văn bản. Anh ấy bằng cách nào đó đã chuyển sang JSON NODE.JS.

Tôi đã đến Igor với những con số này và dự kiến \u200b\u200bsẽ nghe từ anh ấy: "Bạn đang hoàn thành tốt. Node.js cũng được thực hiện tốt. Trong Node.js Chúng tôi sẽ không viết. Hãy vẫn còn suy nghĩ về suy nghĩ." Nhưng nghe hoàn toàn đảo ngược. Nếu bạn không thể sử dụng nó trên Node.js? Tại thời điểm này, tôi nhận ra rằng chúng tôi giải quyết nhiệm vụ này.

Chúng ta đã làm gì? Chúng ta hãy quay lại dữ liệu mà chúng ta có trong máy chủ HTTP.

Trong thực tế, chúng tôi đã có tất cả dữ liệu trong máy chủ HTTP. Do đó, chúng tôi đã thực hiện thủ thuật tiếp theo. Thay vì chuyển đổi dữ liệu, trong V8 "bị đánh bại" chức năng mà khóa sẽ lấy dữ liệu này.

Chúng tôi tan chảy cùng một lúc bất kỳ chuyển đổi nào, mà chúng tôi chiếm 4 mili giây. Có thời gian để hứa. Nhưng hóa ra lần này là 1 mili giây. Với giới hạn 4 mili giây ... Tôi nhắc nhở bạn rằng đây là danh sách các chữ cái. Chúng tôi đã có những mili giây mà họ đã cố gắng. Cho phép người dùng thực sự với điều này. Không phải là họ nhìn thấy nó, nhưng tình hình là tiêu chuẩn.

Chúng tôi lấy một trong những máy chủ và tắt nó từ Cân bằng. Nâng cao tất cả các cơ sở hạ tầng trên đó danh sách các chữ cái được vẽ. "PREDIT" Một phần của các yêu cầu thực của những người dùng này với các dữ liệu này và danh sách các chữ cái này. Chỉ cần gửi dữ liệu đến máy chủ này (trùng lặp). Chúng tôi có kết quả kiểm tra tải 30 giờ.

Có, nhân tiện, những kết quả này cho thấy một kernel, không phải máy chủ, tôi muốn đề cập đến. Máy chủ đã xử lý 10 triệu lượt truy cập trong 30 giờ. Thời gian chuyển đổi trung bình là 1,6 mili giây. Không phải là máy chủ hóa ra là nhanh hơn. Chỉ trong người dùng thực sự cài đặt khác nhau... Chúng tôi đều được thử nghiệm trên 25 chữ cái và người dùng thực đơn đơn giản là nhỏ hơn. Hình dưới đây cho thấy một nửa người sử dụng, hãy nói, thực sự xếp chồng lên nhau lúc mười mili giây. Nhưng, rõ ràng, chúng chỉ cần có 200 chữ cái trong cài đặt.

Tôi nghĩ rằng những con số không cần thiết để giải thích. Có vẻ như hầu hết đa số là ít hơn hai mili giây. 90% yêu cầu ít hơn hai mili giây.

Tuy nhiên, bạn cần đến người dùng thực sự, thực tế, để họ nhìn thấy nó bằng chính mắt mình, mặc dù họ không quan tâm.

Khi tôi với Igor với những con số mà chúng tôi có, đã đến Ermakov (sau đó anh ấy là một phó giám đốc kỹ thuật), tôi đã nói: "Các xét nghiệm được kiểm tra tốt là tốt, những con số là tốt, nhiệm vụ là có thật. Chúng tôi muốn chạy nó trên người dùng. " Như trong bất kỳ công ty lớn nào, chúng tôi có một vài dự án nói dối. Có vẻ như bạn nên làm chúng, và dường như không cần thiết. Tôi nói: "Chúng ta hãy thực hiện bất kỳ dự án nào trong số này trên động cơ V8 trên lễ hội. Nếu có sự cố xảy ra, thì không có gì ghê tởm. Hãy quên đi dự án này theo cách tương tự như tôi đã quên năm ngoái. Nhưng nếu mọi thứ là một dàn hợp xướng, chúng ta sẽ có được một thứ làm việc mà từ đó bạn có thể đẩy lùi.

Igor nhìn tôi, nhìn vào những con số và nói: "Số là tốt. Nhưng bạn thực sự muốn V8 về sản xuất?" Tôi nói: "Tôi muốn." Anh ta trả lời: "Sau đó bắt đầu từ trang chính. Nếu không," snot "này sẽ được thề thêm. Đó là một trang. Bố cục mất ba ngày. Chúng tôi một lần nữa phân bổ một trong những máy chủ ngoại vi và phóng một nửa tải thông thường ở đó. Chúng tôi đã nhận được mức tiêu thụ tài nguyên bộ xử lý gấp ba lần so với mặt trước liền kề, hiện đang làm việc trên người dùng.

Nó nhìn tất cả như một thất bại hoàn toàn. Trong thực tế, chúng tôi rất sai lầm (tôi sẽ chỉ cho bạn sau, ở đâu). Nhưng điều này vẫn được tối ưu hóa. Mọi thứ đều rất buồn, bởi vì chúng tôi đã đắm chìm trong nhiệm vụ này rằng tôi đã có tất cả các mã TEMPOIZER trong đầu. Tôi có thể sắp xếp nó trong suy nghĩ, không đề cập đến IDE. Tôi không hiểu nơi chúng ta có thể mất nó kịp thời, bởi vì trong tất cả các bài kiểm tra trước đó mọi thứ đều ổn.

Chúng tôi đã mất sáu lần so với máy chủ hiện tại.

Không phải lần đầu tiên được gọi là những gì được gọi. Bắt đầu xem Trang chính mất 165 kilobyte. Trong số này, V8 tạo ra 65 kilobyte. Nó vẫn còn 100 kilobyte. Chúng tôi có công nghệ RB bên trong. Được hiểu trang chính - Nó vẫn là một showcase của các dự án khác. Do đó, RB là một phương tiện để cung cấp dữ liệu từ các dự án này đến trang chính. RB trong máy chủ HTTP đã đưa ra, nói chung, trong html.. Không cần thiết phải mẫu nó. Nếu cần thiết, RB này đang tham gia vào chính nó. Do đó, những điều sau đây xảy ra.

Chúng tôi có công nghệ RB. Cô "giao tiếp" với máy chủ HTTP, máy chủ HTTP cho kết quả V8. V8 bao gồm nó với dữ liệu của nó, trả lại. Một lưu ý khác cho những người không đọc bất cứ điều gì về V8. Anh ta giữ tất cả mọi thứ bên trong UTF-16. Điều này có nghĩa là chúng ta ... và chúng tôi đã có, tự nhiên, từ UTF-8. UTF-8 UTF-16 trở lại UTF8.

Đây là cách mã biên dịch ban đầu ở dạng rất đơn giản.

Chúng tôi có một số chuỗi. Với chuỗi này, kết quả của hoạt động RB là Concaten, và sau đó là Concaten của dòng tiếp theo V8.

Câu hỏi đặt ra: Nếu chúng ta không làm gì với RB, tại sao bạn cần phải cung cấp cho V8 và chi tiêu các nguồn lực cho nó? Do đó, chúng tôi đã làm một hack nhỏ. Từ "Si", hai chức năng nữa đã bị đánh bại. Đây là một chức năng đẩy. Vì hạnh phúc, trang chính là vững chắc. Do đó, không cần phải chịu "bộ" và "nhận".

Đừng mài sắc về sự chú ý này. Nếu ai đó hoàn toàn hiểu, bạn sẽ hiểu những gì tôi đang nói về. Có một mẫu rắn, hoặc khá tuyến tính. Ngay khi mô hình làm việc ra một "mảnh", chúng ta biết chính xác những gì có thể được trao cho người dùng.

Chúng tôi đã xảy ra: Thư viện V8 được tạo trên phần logic của dòng của nó và đưa nó ngay lập tức vào máy chủ HTTP. Anh ấy có thể ngay lập tức đưa nó cho khách hàng. Hơn nữa, logic, bạn cần cung cấp một mảnh từ RB. Chúng tôi thậm chí không có được mảnh này. Chúng tôi ngay lập tức nói máy chủ http: "Lấy tác phẩm này và cho đi khách hàng ngay lập tức - chúng tôi không cần bất cứ thứ gì từ nó." Nhận thêm 30%. Nhưng, trên thực tế, sự mất mát vẫn còn bốn lần.

Tôi nghi ngờ có gì đó sai. Đã tải này, số lượt truy cập mà chúng tôi giao hàng trên máy chủ thử nghiệm. Tôi nhân lên số lượng máy chủ mà bây giờ chúng tôi đã nâng lên, và nhận được số lượt truy cập mỗi ngày này.

440 000 000

Và đối với tất cả các quầy TNS, chúng tôi có rất nhiều lượt truy cập mỗi ngày.

110 000 000

Bắt đầu xem nhật ký và tìm thấy một điều thú vị: cho mỗi truy vấn hữu ích. Chúng tôi có bốn yêu cầu để ném một cái gì đó vào nhật ký. Chúng tôi, vui vẻ, trèo lên chính xác trong những tài nguyên mà chúng ta cần. Điều này thể hiện hình ảnh này.

Đã có trên một máy chủ đang chạy, chúng tôi đã có cơ hội chuyển đổi giữa các mẫu. Biểu đồ hàng đầu là bộ nhớ. Nhu cầu bộ nhớ V8, tất nhiên, nhiều hơn một chút. Sự thất bại của bộ nhớ chỉ là chuyển sang mẫu cũ. Lịch trình thấp hơn chỉ là "hòn đá". Không có thay đổi về nó. Chúng tôi đã ra mắt tất cả cho người dùng.

Bây giờ toàn bộ trang chính mail.ru được đưa ra qua V8.

V8 ON. khoảnh khắc này Tạo 65 kilobyte dữ liệu. Có lẽ hôm nay đã nhiều hơn một chút - tôi vẫn đã chuẩn bị một báo cáo trong hai tuần. Thời gian mà thư viện cần tạo dữ liệu này là một mili giây. Cộng thêm 40 megabyte trên mỗi bối cảnh, có tính đến thực tế là chúng tôi có số lượng lõi trên máy chủ lên đến 8, tôi không biết hoặc tối đa 16. Về nguyên tắc này, không phải là rất khó chịu, không có vấn đề gì với nó.

Đây gần như là một câu chuyện thành công. Ở đây Igor Sysoev có mặt. Tất cả những người đã từng nghĩ về V8 trên máy chủ, tất nhiên, phải đọc bài viết của mình về các vấn đề của V8.

Nếu tôi sai, tôi hy vọng anh ấy sẽ sửa tôi. Theo như tôi nhớ, ở đó chúng tôi đang nói chuyện Đó là những gì. Trong V8, thứ nhất, bối cảnh tăng lên ngay lập tức. Nếu chúng ta nói về các dự án thực, thì bối cảnh của chúng ta tăng lên với máy chủ HTTP tăng và chỉ một lần. Phải mất khoảng 2 mili giây, và nói chung, bạn có thể sống với nó.

Vấn đề thứ hai. Nếu đột nhiên nó xảy ra để thư viện V8 muốn phân bổ cho mình một trí nhớ và không thể, cô ấy "rơi vào thời điểm đó. Hiện tại khi chúng tôi đã tham gia vào mẫu này với JavaScript trên máy chủ, tôi đã tìm đến nhà phát triển V8 - Vyacheslav Egorova. Nhân tiện, anh ấy thường hành động, đây là một người nổi tiếng. Bạn có thể dễ dàng tìm thấy thông tin về nó. Ông gần như đã xác nhận những dự đoán này. Ông tuyên bố (chúng tôi đã không kiểm tra, một cách trung thực) rằng trong việc thực hiện V8 hiện tại, nếu anh ta không phân bổ bộ nhớ, đẩy ra một ngoại lệ (eng. Eteption), có thể bị chặn.

Nhưng anh ta thành thật thừa nhận rằng ngoại lệ này chỉ có thể khởi động lại kịp thời, đồng thời nói chung là hoàn toàn. Bối cảnh chết, và không có gì có thể được thực hiện với nó. Anh ta không phản ứng với bất cứ điều gì và mọi thứ cũng vẫn còn trong bộ nhớ.

Đối với Nginx, rất có thể, hành vi này là rất quan trọng. Chúng tôi trong Mail.ru, theo một trong những đồng nghiệp, trong cùng một RB hoạt động trong các điều kiện thiếu trí nhớ được coi là một tình huống thường xuyên. Và nơi thiếu trí nhớ được coi là một tình huống nhân sự, rất có thể sẽ có vấn đề. Nhưng nếu chúng ta nói về dự án thông thường, thì nếu bạn đột nhiên bắt đầu kết thúc bộ nhớ bằng ô tô, bạn sẽ không nghĩ về V8, nhưng khá nhiều về những thứ khác.

Một khoảnh khắc khó chịu khác.

Đây là một bài viết về V8. Trunk V8 hóa ra rất tích cực đang được phát triển. Vyacheslav mình không thể tái tạo tình huống này. Nhưng chúng tôi đã tái tạo "với một tiếng nổ." Tôi hy vọng chúng ta sẽ giúp anh ta giải quyết nó.

Tại một số điểm, chúng tôi đã phát động V8 và chúng tôi đã bị rò rỉ bộ nhớ. Chúng tôi đã tìm kiếm rò rỉ trong một thời gian rất dài, và sau đó chuyển từ Trunk sang phiên bản 3.6.8 và vấn đề biến mất. Vấn đề thân cây. Phiên bản ổn định của Node.js hiện tại, 06,14 và nó cũng sống ở mức 3,6. Nếu bạn làm việc với thân cây, hãy nhớ: bạn làm việc với một cái gì đó không hành xử rất nhiều. Vẫn chuyển sang phiên bản ổn địnhCho những nhà phát triển trả lời.

Chỉ cần liên kết đến API V8, rất cần thiết nếu đột nhiên làm điều đó. Liên kết đến Mẫu của chúng tôi. Tôi không thể nói rằng anh ta là OpenSource cho một lý do đơn giản. Trong thực tế, OpenSource gợi ý một số trách nhiệm cho những gì bạn đang làm. Chúng tôi, rất có thể, lấy nó, nhưng cụ thể bây giờ chúng tôi chưa sẵn sàng cho việc này. Do đó, tôi chỉ nói rằng chúng ta chỉ cần làm việc trong mở.

Tất cả mọi thứ tôi đã nói về thân cây V8 có thể xảy ra từ chúng tôi. Hiện tại chúng tôi sẽ không ổn định bất cứ điều gì. Đây là một sản phẩm mà chúng ta phát triển cho chính mình, nhưng trong mở video. Với một ổ bánh trên thực tế là chúng tôi muốn đăng nó trong OpenSource. Nếu có một loại "yêu cầu kéo" (theo cách, từ một số người), thì tất nhiên chúng ta đều hoan nghênh một sự quan tâm như vậy.

Đó là tất cả những gì tôi muốn nói. Tôi đã sẵn sàng để trả lời câu hỏi của bạn.

Câu hỏi và trả lời

Bản sao từ hội trường: Cảm ơn báo cáo. Tôi có một câu hỏi. Tôi không hiểu về tiền sử, tại sao cần phải sử dụng V8. Bạn đã có một trang web ...

Andrew. Sumin.: Nhiều hơn một trang web.

Bản sao từ hội trường: Bạn đã có kịch bản. Những tập lệnh này trên các máy chủ back-end bắt đầu phanh. Vì vậy, nó hay sai?

Andrew. Sumin.: Không, khá. Trong "Trang web" bạn hiểu các dự án "mail.ru mail"?

Bản sao từ hội trường: Đúng.

Andrew. Sumin.: Các vấn đề chính là phần nào. Đầu tiên - chúng tôi có một mẫu kép. Các mẫu được áp dụng trên máy chủ không thể được sử dụng trên máy khách. Đây là vấn đề. Chúng tôi nợ một danh sách các chữ cái để hiển thị trên máy chủ và trên máy khách. Do đó, chúng tôi cần các mẫu hoạt động ở khắp mọi nơi. Điều cần thiết là cùng một mẫu cho kết quả tương tự và trên máy khách và trên máy chủ. Đây là tiền đề đầu tiên và quan trọng nhất để chuyển đổi sang V8.

Nền thứ hai. Nhóm của tôi có rất nhiều người biết Javascript. Nhưng không có một người nào có đủ cho trình độ Mail.ru.ru biết, hãy nói, "Nhược điểm", Python hoặc một cái gì đó như thế. Tôi có những người có khả năng viết nhanh, tốt JavaScript, không có rò rỉ bộ nhớ, v.v. và tương tự. Nhưng không có những người có khả năng viết nó bằng ngôn ngữ khác. Không phải vì chúng, về nguyên tắc, không có khả năng, nhưng vì họ không làm điều đó mỗi ngày. Ngoài ra, bạn cần các mẫu đồng phục trên máy khách và trên máy chủ, bạn vẫn cần các chuyên gia có thể làm điều đó. Đây là hai lý do chính.

Bản sao từ hội trường: Không, ở đây, xem. Nếu tôi cần một danh sách để trì hoãn trên máy chủ, tôi có một trình kết xuất ở đó với danh sách này và cho mỗi phần tử, tôi chỉ định một số định danh. Hoặc các yếu tố nhóm phân công lớp. Tôi đang viết trên một kịch bản JavaScript thực hiện một cái gì đó ở đó. Có thể một số thay thế, tôi không biết ... nó đơn giản là không hoàn toàn được hiểu bởi động lực sử dụng. Tại sao mẫu kép nhận được?

Andrew. Sumin.: Chúng tôi có một danh sách các chữ cái trên "mail". Nó được biên dịch từ một số dữ liệu, nó phải được rút ra. Sau đó, chúng tôi đến với khách hàng và danh sách các chữ cái được cập nhật một lần một lần (vì một người có thể đến các chữ cái mới). Theo đó, nó phải được kết xuất. Nó xuất hiện một cách tự nhiên cho khách hàng dưới dạng dữ liệu. "DRIVE" HTML dành thời gian. Anh ấy đến dưới hình thức của một số JSON.

Ngoài ra, chúng tôi có một loại tối ưu hóa khác nhau. JSON đến, nó phải được biến thành HTML. Điều này, một lần nữa, mẫu. Cộng với danh sách chữ cái. Đối với mỗi chữ cái, đủ thông tin để khi nhấp vào chữ cái, người dùng đã có thể được hiển thị một cái gì đó - hãy nói, tiêu đề chữ cái. Chúng tôi có chủ đề, tác giả, chúng tôi có thể hiển thị nó, chờ nội dung của bức thư. Đây là một mẫu khác.

Trên khách hàng, chúng tôi có rất nhiều triệu chứng mẫu. Tất cả các loại thủ thuật loại "Tôi sẽ thêm một mã định danh và viết một mã đơn giản trên JavaScript" không thực sự hoạt động. Và khi một người trên một trang có một lá thư, anh ta có thể nhấn F5 ở đó, và tại thời điểm này, chúng ta phải hiển thị lá thư này trên máy chủ, vì nó nhanh hơn, đủ kỳ lạ.

Bức thư là một đối tượng khó. Có rất nhiều tất cả các logic mẫu. "Từ ai", "cho ai", "có thể đọc", "không phải", "quan trọng", "không quan trọng." Có những chấp trước, không có đầu tư. Rất nhiều thứ.

Bản sao từ hội trường: Thông thoáng. Cảm ơn bạn.

Bản sao từ hội trường: Tôi có hai câu hỏi. Đầu tiên: Tại sao bạn chọn V8. Bạn đã xem JavaScript từ Mozilla (SpiderMonkey, Tracemonkey)?

Andrew. Sumin.: Thành thật mà nói, chúng tôi nhìn theo hướng của mình. Cá nhân, tôi đã chọn V8, thay vào đó, để xem xét chính trị. Một công ty lớn tạo ra một sản phẩm cho chính mình. Lý do là như vậy. Khi chúng ta trở thành các mẫu kết quả để chạy trên máy khách, đặc biệt, một mẫu có danh sách các chữ cái trong Chrome "được mở rộng" trong 6 mili giây và trong Mozilla - trong 3 mili giây. Tôi nghĩ: Có lẽ một sự lựa chọn đã sai?

Do đó, tôi đã đạt được 1 mili giây (để so sánh: Máy chủ của chúng tôi trong GZIP dành nhiều thời gian hơn V8). Tôi quyết định ở lại V8. Có thể V8 vẫn là đội SpiderMonkey. Mặc dù tại thời điểm này trên mẫu SpiderMonkey của chúng tôi nhanh hơn.

Những lý do vẫn là chính trị. Với thực tế là về tốc độ, chúng ta không có nơi nào để theo đuổi. Các vấn đề khác bây giờ cần phải quyết định.

Bản sao từ hội trường: Câu hỏi thứ hai. Làm thế nào để máy chủ trông giống như một điểm kiến \u200b\u200btrúc? Đây có phải là một quá trình xử lý một loạt các hợp chất, hoặc như thế nào?

Andrew. Sumin.: Igor sẽ trả lời - anh ấy đã viết nó. Nó là tốt hơn để anh ta trả lời câu trả lời.

Igor Sysoev.: Có, đây là một quy trình xử lý một loạt các hợp chất.

Bản sao từ hội trường: Thông thoáng. Epoll linux bạn có?

Igor Sysoev.: Đúng. Một quá trình.

Bản sao từ hội trường: Tất cả các kết nối được xử lý trong một bối cảnh?

Igor Sysoev.: Có, một bối cảnh.

Bản sao từ hội trường: Thông thoáng. Cảm ơn bạn.

Bản sao từ hội trường: Tôi có một câu hỏi, trước tiên, về ghi đè các mẫu. Làm thế nào để giải quyết một nhiệm vụ như vậy? Giả sử chúng ta có bất kỳ khối nào, chúng tôi muốn rút khối này trên một trang chính xác và thêm thứ khác vào nó. Điền thêm thông tin thêm. Ghi đè với cuộc gọi Khối cuộc gọi. Bạn nói rằng bạn có JavaScript. Làm thế nào nó sẽ được thể hiện? Bạn có phải viết một trình biên dịch lắp ráp trong cú pháp XML này trên JavaScript không?

Andrew. Sumin.: Một vài lựa chọn. Đương nhiên, nó có thể là một chèn trình biên dịch hoặc bạn có thể tự mở rộng ngôn ngữ của các mẫu. Nếu chúng ta cần nó, và chúng tôi sẽ không mất tốc độ, chúng tôi sẽ làm điều đó, có thể trong hệ thống mẫu hiện tại. Nếu bạn cần nó, và bạn cần tốc độ tương tự, bạn chỉ cần mở rộng cú pháp hiện tại của mình. Hoặc gửi cho chúng tôi một bản vá.

Bản sao từ hội trường: Không, tất nhiên, tôi hiểu rằng các tiện nghi ngữ nghĩa như vậy là "miễn phí" so với tốc độ không được đưa ra. Tôi có một câu hỏi trong một câu hỏi khác. Thư viện khối của bạn sau đó là gì, bạn không cần ghi đè với phương thức gọi điện?

Andrew. Sumin.: Bây giờ tôi đã không hiểu câu hỏi.

Bản sao từ hội trường: Bạn có thư viện nào sau đó được sử dụng và trong đó có một xác định lại? Hoặc chỉ là tất cả mọi thứ được viết trên một dự án trong một lớp, và không cần xác định lại, do đó không cần ngữ nghĩa phong phú.

Andrew. Sumin.: Một dự án được viết chính xác như vậy. Hai hoặc ba dự án được viết bây giờ. Ở đó chúng ta đã suy nghĩ về những điều này. Hai hoặc ba dự án này đơn giản hơn một chút tham khảo hiệu suất. Nhiều khả năng, ở đó chúng tôi sẽ tinh chỉnh nó.

Bản sao từ hội trường: Tôi có một câu hỏi nữa. Bạn đã nói với mức độ tuyệt vời của các chuyên gia JavaScript tuyệt vời. Đối với họ, tất cả điều này là dễ hiểu và thuận tiện. Tại sao Cú pháp XML sau đó, tại sao không đặt cú pháp trong cú pháp JavaScript? Sau đó, chuyên gia sẽ sử dụng trình soạn thảo JavaScript "gốc", ví dụ. Mã chính sẽ dễ đọc hơn, vì nó là cùng một mã. Chúng tôi dường như thống nhất thực thi các mẫu này từ quan điểm của động cơ. Nhưng từ quan điểm của cú pháp, chúng ta, ngược lại, tạo ra thực thể thứ hai.

Andrew. Sumin.: Thực thể được tạo ra. Nhưng đây là một số lý do. Đây là hậu quả của một số giải pháp. Đầu tiên, tôi đã đề cập rằng nhiệm vụ mà chúng tôi chắc chắn cần là quyết định là tìm hiểu cách chuẩn bị JavaScript trên máy chủ. Để quyết định nó, tôi không muốn bị phân tâm bằng cách phát minh ra các cú pháp, giải quyết các vấn đề với "thoát khỏi" và như vậy.

Bản sao từ hội trường: Nhưng trong JavaScript, cú pháp được phát minh và các vấn đề với "thoát" đã được giải quyết. Giống như với XML.

Andrew. Sumin.: Không, khi bạn xác định trên JavaScript, sau đó trong bất kỳ trường hợp nào xuất hiện với ngôn ngữ của bạn.

Bản sao từ hội trường: Tại sao? Tại sao tôi phát minh ra một ngôn ngữ, nhưng không ghi vào JavaScript?

Andrew. Sumin.: Bởi vì các dòng nối trên JavaScript là một nghề nghiệp rất vô ơn.

Bản sao từ hội trường: Được chứ. Tôi không hiểu.

Andrew. Sumin.: Thứ hai. Nó có thể là khi JavaScript trên máy chủ sẽ là điều thông thường trên nhiều dự án (có thể không cho toàn bộ dự án), ít nhất là khi điều này sẽ được coi là một thực hành thông thường, rất có thể là một mẫu khác xuất hiện, không phải là lễ hội. Rất có thể được. Tại sao không?

Nhưng đây là nhiệm vụ của một đơn đặt hàng khác. Bây giờ không cần thiết phải giải quyết nó, bởi vì có vấn đề khó khăn hơn.

Thứ hai. 99% tài liệu đầu ra của chúng tôi là XML. Khi bạn có thiết kế điều khiển XML và ở đầu ra XML, dự án rất đơn giản hơn, vì XML hiểu các trình chỉnh sửa. Họ sẽ có hiệu lực, cộng với có một loạt các công cụ để hoạt động với XML. Hiện tại đây là một giải pháp cuối cùng. Điều gì sẽ xảy ra trong một năm, tôi không thể nói.

Bản sao từ hội trường: OK cảm ơn bạn. Tôi đang hoàn thiện. Vâng, đúng bạn nói, theo ý kiến \u200b\u200bcủa tôi. Vấn đề quan trọng nhất là mang JavaScript đến máy chủ, và sau đó nó có thể được tối ưu hóa. Nó là nói một cách thô lỗ, một bước cơ bản. Và sau đó đã có những cải tiến nhỏ không có lợi nhuận có thể được thực hiện trong tương lai. Cảm ơn bạn đã dành một trải nghiệm như vậy.

Bản sao từ hội trường: Tôi có một câu hỏi trong phần tiếp theo của một trong những câu hỏi trước - về một quy trình. Đây có phải là một quá trình thực sự trong đó tất cả các yêu cầu đi? Hoặc là một số quy trình trên các cổng khác nhau, trong đó vượt trội, hãy để Nginx truyền các yêu cầu khác nhau từ những người dùng khác nhau?

Igor Sysoev.: Không phải. Không có nginx. Ở đó - có, một quá trình, nơi mọi thứ diễn ra. Trong thực tế, có một số dĩa trên một máy. Tất cả trong số họ trên hạt nhân "Hang". Khách hàng bằng cách nào đó cân bằng.

Bản sao từ hội trường: Thông thoáng. Cảm ơn bạn.

Bản sao từ hội trường: Vẫn là một câu hỏi như vậy. Vài năm trước, tôi cũng đã cố gắng tham gia JavaScript trên máy chủ. Với gỡ lỗi là địa ngục chung. Những công cụ gỡ lỗi sử dụng để chia sẻ tất cả điều này?

Andrew. Sumin.: Bây giờ chúng ta có một phần thưởng rất lớn - đó là Node.js. Tất cả những gì chúng ta chạy, "từ hộp" hoạt động trong node.js. Có đủ công cụ tốt gỡ lỗi. Ngoài ra, nếu chúng ta nói chính xác về Mẫu, chúng ta luôn có thể gửi mẫu của riêng bạn cho khách hàng. Thậm chí còn có nhiều công cụ gỡ lỗi hơn.

Thứ ba: Như tôi đã nói, có thể có bất kỳ lớp lót cụ thể nào với phương tiện. Nó có thể được thực hiện để môi trường chỉ đơn giản là "đã chỉ ra" chức năng. Chúng tôi có chức năng của nhật ký "Cấm". Trong thực tế, cô ấy "log", "var" và "lỗi" ", và V8 có thể" giao tiếp "với thế giới bên ngoài. Ở đó, môi trường sẽ loại bỏ dữ liệu này ở đâu đó. Ngoài ra, vẫn còn trong API V8, chính nó có rất nhiều việc phải làm việc với V8 thông qua API V8. Ít nhất là khi anh ta rớt xuống - anh ta nói qua API rằng anh ta "ngã".

Bản sao từ hội trường: Cảm ơn bạn rất nhiều.

Bản sao từ hội trường: Cảm ơn vì đã chú ý.

Andrew. Sumin.: Cảm ơn tất cả.

Hình 2.1 Kiến trúc của ứng dụng Máy chủ-Máy chủ trong JavaScript

Ba lớp là:

  • Khách hàng WWW (như Netscape Navigator-Client): Lớp này cung cấp một ứng dụng của ứng dụng giao diện người dùng cuối. Lớp này cũng có thể chứa một số logic ứng dụng, chẳng hạn như quy tắc xác minh dữ liệu được triển khai trong ứng dụng khách JavaScript. Khách hàng có thể ở trong hoặc ngoài máy chủ proxy của mạng công ty.
  • Máy chủ cơ sở dữ liệu / máy chủ Netscape www:Lớp này bao gồm một máy chủ Netscape với kích hoạt JavaScript. Nó chứa logic ứng dụng, phục vụ bảo mật và kiểm soát quyền truy cập vào nhiều người dùng bằng máy chủ JavaScript. Lớp này cho phép khách hàng cả trong hành động và bên ngoài máy chủ proxy có quyền truy cập vào ứng dụng. WWW Server cũng hoạt động như một khách hàng với bất kỳ Đã cài đặt máy chủ Cơ sở dữ liệu
  • Máy chủ cơ sở dữ liệu: Lớp này bao gồm các máy chủ SQL BD thường hoạt động tại các máy trạm hiệu suất cao. Nó chứa tất cả dữ liệu cơ sở dữ liệu, siêu dữ liệu và toàn vẹn tham chiếu / quy tắc toàn vẹn tham chiếu cần thiết cho ứng dụng. Lớp này thường nằm trong khu vực của máy chủ proxy của mạng công ty và có thể cung cấp một lớp bảo mật ngoài lớp bảo mật máy chủ WWW. Máy chủ Netscape Enterprise hỗ trợ việc sử dụng máy chủ cơ sở dữ liệu: ODBC, DB2, Informix, Oracle và Sybase. Netscape FastTrack Server chỉ hỗ trợ ODBC. Ngoài ra, về dịch vụ cơ sở dữ liệu LiveWire, xem Phần 3, Dịch vụ dịch vụ cơ sở dữ liệu "LiveWire."

Môi trường khách hàng JavaScript hoạt động như một phần của www-client và môi trường máy chủ JavaScript hoạt động như một phần của máy chủ Web Netscape có quyền truy cập vào một hoặc nhiều máy chủ cơ sở dữ liệu. Hiển thị nhiều chi tiết hơn với môi trường máy chủ JavaScript và các ứng dụng được tạo cho nó được nhúng trong máy chủ web Netscape.

Yêu cầu hệ thống

Để phát triển các ứng dụng JavaScript sử dụng ưu điểm và máy khách và máy chủ JavaScript, bạn cần một môi trường phù hợp để thiết kế và xuất bản. Nói chung, nên phát triển các ứng dụng trên một hệ thống được phân tách khỏi máy chủ xuất bản, vì sự phát triển tiêu tốn rất nhiều tài nguyên (kết nối, băng thông, thời gian và bộ nhớ của bộ xử lý). Khi phát triển, công việc của các ứng dụng người dùng cuối đã được xuất bản cũng có thể bị hỏng.

Môi trường phát triển JavaScript bao gồm:

  • TIỆN ÍCHĐể ủy quyền và biên dịch các ứng dụng JavaScript. Những tiện ích này thường được đặt trên máy phát triển.
  • Máy phát triển với máy chủ webĐể khởi chạy các ứng dụng JavaScript đang được phát triển.
  • Máy ấn phẩm với máy chủ webĐể xuất bản các ứng dụng phát triển. Người dùng cuối có quyền truy cập vào các ứng dụng trên máy chủ này.

TIỆN ÍCH YÊU CẦU:

  • Trình duyệt có khả năng chạy JavaScript, chẳng hạn như Netscape Navigator, là một phần của Netscape Communicator.
  • Trình biên dịch ứng dụng JavaScript, chẳng hạn như trình biên dịch máy chủ Web Netscape.
  • Biên tập viên, chẳng hạn như emacs hoặc notepad.

Các máy ấn phẩm và ấn phẩm yêu cầu sự sẵn có của phần mềm sau:

  • Máy chủ web;
  • Máy chạy JavaScript, chẳng hạn như máy chủ Netscape Web Server.
  • Định cấu hình máy chủ của bạn để chạy các ứng dụng JavaScript, như được thực hiện trong Trình quản lý ứng dụng JavaScript, được cung cấp cùng với các máy chủ Web Netscape.

Ngoài ra, nếu ứng dụng của bạn sử dụng dịch vụ cơ sở dữ liệu dịch vụ JavaScript LiveWire, bạn sẽ cần:

  • Chương trình là một máy chủ cơ sở dữ liệu quan hệ trên máy chủ cơ sở dữ liệu của bạn. Xem tài liệu của máy chủ cơ sở dữ liệu của bạn. Trong một số trường hợp, bạn sẽ cần cài đặt máy chủ web và máy chủ cơ sở dữ liệu trên một máy. Về các yêu cầu cụ thể của máy chủ JavaScript, xem Chương 10, "Cấu hình cơ sở dữ liệu."
  • BD client và phần mềm mạng trên máy chủ web của bạn. Nếu bạn sử dụng một máy và dưới dạng máy chủ cơ sở dữ liệu và dưới dạng máy chủ web, việc cung cấp cơ sở dữ liệu khách hàng điển hình thường được cài đặt khi bạn cài đặt máy chủ cơ sở dữ liệu. Mặt khác, bạn cần đảm bảo rằng máy khách cơ sở dữ liệu được cài đặt trên cùng một máy với máy chủ Web để bạn có thể truy cập vào cơ sở dữ liệu dưới dạng khách hàng. Đối với các yêu cầu đối với phần mềm máy khách, hãy xem tài liệu bổ sung của nhà cung cấp DB.

Thông tin cấu hình

Phần này thảo luận về thông tin cấu hình để sử dụng máy chủ JavaScript. Ngoài ra, về việc thiết lập cơ sở dữ liệu để hoạt động với dịch vụ dịch vụ cơ sở dữ liệu LiveWire, hãy xem Chương 10, "Cấu hình cơ sở dữ liệu."

Kết nối máy chủ JavaScript.

Để chạy các ứng dụng JavaScript trên máy chủ của bạn, bạn phải kết nối máy thực thi JavaScript trong Trình quản lý máy chủ của mình, nhấp vào chương trình, sau đó chọn máy chủ JavaScript. Sau dấu nhắc "Kích hoạt môi trường ứng dụng JavaScript / Kích hoạt môi trường ứng dụng JavaScript?" Chọn Có và bấm OK. Bạn cũng sẽ được yêu cầu hạn chế quyền truy cập vào Trình quản lý ứng dụng. Ngoài ra, xem

GHI CHÚ: Nếu bạn không kết nối máy thực thi JavaScript, các ứng dụng JavaScript sẽ không thể chạy trên máy chủ này.

Để sử dụng và servlets, và LiveWire, bạn cần kết nối máy chủ JavaScript để kết nối Java. Cả hai có thể được kết nối thông qua việc sử dụng menu chương trình máy chủ quản trị. Nếu bạn sửa đổi đường dẫn đến Classespeath trong Obj.conf, các thay đổi của bạn sẽ bị mất nếu bạn kết nối / tắt máy chủ JavaScript hoặc Java từ menu phần mềm máy chủ quản trị. Một cách khác để chỉnh sửa Chỉ thị ClassPath trong Obj.conf là cài đặt biến môi trường ClassPath trong UNIX hoặc cài đặt biến ClassPath trong cài đặt hệ thống trong Windows NT. Nếu bạn cần chỉnh sửa trực tiếp Obj.conf, hãy lưu tệp ban đầu chỉ trong trường hợp. Trong Enterprise Server 4.0, bạn phải thêm thông tin ClassPath vào các tệp cấu hình JVM (JVM12.conf cho Solaris và NT) thông qua giao diện máy chủ quản trị doanh nghiệp.

Khi bạn kích hoạt các ứng dụng JavaScript, bạn phải dừng và khởi động lại máy chủ web của mình để liên kết môi trường biến đổi Bắt đầu hành động. Nếu điều này không được thực hiện, các ứng dụng JavaScript sử dụng dịch vụ dịch vụ cơ sở dữ liệu LiveWire sẽ không hoạt động.

Bảo vệ người quản lý ứng dụng "A

Trình quản lý ứng dụng cung cấp quyền kiểm soát các ứng dụng JavaScript. Liên quan đến các khả năng đặc biệt của nó, bạn phải bảo vệ nó khỏi quyền truy cập trái phép. Nếu bạn không giới hạn quyền truy cập vào Trình quản lý ứng dụng, Y, bất kỳ ai cũng có thể thêm, xóa, sửa đổi, bắt đầu và dừng các ứng dụng trên máy chủ của bạn. Tất nhiên, có thể dẫn đến hậu quả không mong muốn.

Bạn (Nhà phát triển ứng dụng trên JavaScript) phải có quyền truy cập để sử dụng Trình quản lý ứng dụng và trên máy chủ dành cho nhà phát triển, vì bạn sử dụng nó để hoạt động với ứng dụng khi phát triển. Tuy nhiên, quản trị viên của máy chủ Web của bạn có thể không cung cấp cho bạn các quyền như vậy trên máy chủ nhà phát triển.

Nếu bạn kết nối máy thực thi JavaScript trong Trình quản lý máy chủ "e, dấu nhắc sẽ hỏi bạn, giới hạn quyền truy cập vào Trình quản lý ứng dụng" Y. Chọn Có và bấm OK. (Có - Mặc định.) Sau đó, bất kỳ ai sẽ cố gắng truy cập Trình quản lý ứng dụng "U, sẽ có nghĩa vụ nhập tên người dùng và mật khẩu máy chủ." A để có thể sử dụng Trình quản lý ứng dụng và ứng dụng mẫu DBADMIN. Ngoài ra, hãy xem Hướng dẫn quản trị viên cho máy chủ web của bạn.

Nếu máy chủ của bạn không sử dụng Lớp Sockets Secure (SSL), tên người dùng và mật khẩu cho Trình quản lý ứng dụng, "A được truyền qua mạng ở dạng không được sửa. Bắt dữ liệu này, bạn có thể truy cập trình quản lý ứng dụng. Nếu bạn sử dụng cùng một mật khẩu cho máy chủ quản trị viên, hacker cũng sẽ có quyền kiểm soát máy chủ này. Do đó, bạn có thể khuyên bạn không nên sử dụng Trình quản lý ứng dụng bên ngoài máy chủ proxy nếu bạn không sử dụng SSL. Để biết cách kết nối SSL với máy chủ, hãy xem thư mục quản trị viên của máy chủ web của bạn.

JavaScript của khách hàng. Mở rộng kernel của ngôn ngữ do các đối tượng kiểm soát trình duyệt (trình điều hướng hoặc trình duyệt web tương tự khác) và tài liệu của nó Mô hình đối tượng (DOM). Ví dụ: tiện ích mở rộng của khách hàng cho phép ứng dụng đặt các mục trên biểu mẫu HTML và phản hồi với các sự kiện của người dùng, chẳng hạn như nhấp chuột, nhập biểu mẫu và điều hướng thông qua các trang.
  • Máy chủ javascript. mở rộng kernel của ngôn ngữ do các đối tượng liên quan đến công việc JavaScript trên máy chủ. Ví dụ: tiện ích mở rộng máy chủ cho phép bạn kết nối với cơ sở dữ liệu quan hệ, duy trì tính liên tục thông tin giữa các cuộc gọi ứng dụng hoặc hoạt động với các tệp trên máy chủ.
  • JavaScript cung cấp cho bạn khả năng tạo ứng dụng đang chạy trên Internet. Các ứng dụng khách hoạt động trong trình duyệt, chẳng hạn như Netscape Navigator và các ứng dụng máy chủ chạy trên máy chủ, chẳng hạn như máy chủ Netscape Enterprise. Sử dụng JavaScript, bạn có thể tạo các trang HTML động xử lý việc xử lý đầu vào của người dùng và hoạt động với dữ liệu thông qua việc sử dụng các đối tượng đặc biệt, tệp và căn cứ quan hệ dữ liệu.

    Với sự trợ giúp của chức năng LiveConnect, bạn có thể kích hoạt mã Java và JavaScript để tương tác. Từ JavaScript, bạn có thể in ngay các đối tượng Java và truy cập các phương thức và trường công khai của họ. Từ Java, bạn có thể có quyền truy cập vào đối tượng, phương thức và thuộc tính của JavaScript.

    Netscape đã phát minh ra JavaScript và JavaScript lần đầu tiên được sử dụng trong các trình duyệt Netscape.

    Kernel, máy khách và máy chủ JavaScript

    Các thành phần JavaScript được hiển thị trong hình ảnh này.

    Hình 1.1 Ngôn ngữ JavaScript

    Các phần sau được giới thiệu trong JavaScript trên máy khách và trên máy chủ.

    Cảng JavaScript

    JavaScript máy khách và máy chủ có các yếu tố phổ biến sau:

    • Từ khóa
    • Người vận hành cú pháp và ngữ pháp
    • Yêu cầu về biểu thức, biến và chữ
    • Mô hình đối tượng (mặc dù JavaScript máy khách và máy chủ có các bộ đối tượng được xác định trước khác nhau)
    • Các đối tượng và hàm được xác định trước, chẳng hạn như mảng, ngày và toán

    JavaScript của khách hàng.

    Các trình duyệt web như Navigator (2.0 trở lên phiên bản muộn), Có thể diễn giải các nhà khai thác JavaScript của khách hàng được nhúng trong trang HTML. Nếu trình duyệt (hoặc khách hàng) Yêu cầu một trang như vậy, máy chủ sẽ gửi toàn bộ nội dung của tài liệu, bao gồm các nhà khai thác HTML và JavaScript, máy khách qua mạng. Trình duyệt đọc một trang từ trên xuống dưới, hiển thị HTML kết quả và thực thi các toán tử JavaScript vì nó là từ phát hiện. Quá trình này được hiển thị trong hình dưới đây cung cấp cho người dùng kết quả cuối cùng.

    Hình 1.2 Khách hàng JavaScript

    Các nhà khai thác JavaScript của khách hàng được nhúng trong trang HTML có thể phản hồi với các sự kiện của người dùng, chẳng hạn như nhấp chuột, nhập biểu mẫu và điều hướng trên trang. Ví dụ, bạn có thể viết tính năng JavaScript Để xác minh tính đúng đắn của người dùng được nhập dưới dạng thông tin, số điện thoại hoặc mã zip. Không có truyền qua mạng, JavaScript, được nhúng trên trang HTML, có thể kiểm tra dữ liệu đã nhập và hiển thị hộp thoại nếu người dùng đã nhập sai dữ liệu.

    Các phiên bản JavaScript khác nhau hoạt động với các phiên bản cụ thể của Navigator ". Ví dụ: JavaScript 1.2 được thiết kế cho Navigator 4.0. Một số khả năng của JavaScript 1.2 không khả dụng trong JavaScript 1.1 và do đó, không có sẵn trong Navigator 3.0. Giới thiệu về các phiên bản JavaScript và điều hướng xem" JavaScript phiên bản ".

    Máy chủ javascript.

    Máy chủ JavaScript cũng được nhúng trong các trang HTML. Các nhà khai thác máy chủ có thể kết nối với cơ sở dữ liệu quan hệ của các nhà sản xuất khác nhau, cung cấp thông tin chia sẻ bởi một số người tiêu dùng, để truy cập hệ thống tệp máy chủ hoặc tương tác với các ứng dụng khác thông qua Liveconnect và Java. Các trang HTML với máy chủ JavaScript cũng có thể chứa JavaScript của khách hàng.

    Không giống như máy khách JavaScript thuần túy, các trang HTML có máy chủ JavaScript được biên dịch thành mã byte của các tệp thực thi. Các tệp thực thi này được khởi chạy bởi một máy chủ web có máy thực thi JavaScript. Do đó, việc tạo các ứng dụng JavaScript là một quá trình của hai giai đoạn.

    Ở giai đoạn đầu tiên, được hiển thị trên, bạn tạo các trang HTML (có thể chứa các toán tử JavaScript máy khách và máy chủ) và các tệp JavaScript. Sau đó, bạn biên dịch tất cả các tệp này thành một tệp thực thi duy nhất.

    Hình 1.3 JavaScript máy chủ trong quy trình phát triển

    Ở giai đoạn thứ hai, được hiển thị trên, trang ứng dụng được yêu cầu bởi trình duyệt máy khách. Máy thực thi sử dụng tệp tìm kiếm thực thi trang nguồn Và tự động tạo trang HTML được trả về. Máy ra mắt các toán tử JavaScript máy chủ được tìm thấy trên trang. Kết quả là, trang HTML có thể được thêm vào hTML mới. hoặc các nhà khai thác javascript. Máy thực thi sẽ gửi trang kết quả qua mạng Navigator "của máy khách chạy để thực thi JavaScript của máy khách và hiển thị kết quả.

    Hình 1.4 Máy chủ JavaScript ở giai đoạn chạy

    không giống phần mềm tiêu chuẩn Giao diện cổng chung (CGI), tất cả JavaScript nguồn tích hợp trực tiếp vào các trang HTML, tăng tốc độ phát triển và tạo điều kiện cho dịch vụ. Dịch vụ quản lý phiên JavaScript chứa các đối tượng bạn có thể sử dụng để duy trì dữ liệu tồn tại giữa các yêu cầu của khách hàng, một số ứng dụng khách và nhiều ứng dụng. Dịch vụ máy chủ dịch vụ cơ sở dữ liệu LiveWire cung cấp các đối tượng để truy cập cơ sở dữ liệu, là một giao diện cho các máy chủ cơ sở dữ liệu ngôn ngữ truy vấn có cấu trúc (SQL).

    JavaScript và Java.

    JavaScript và Java tương tự, nhưng có sự khác biệt cơ bản. Ngôn ngữ JavaScript giống với Java, nhưng không có gõ tĩnh và kiểm tra nghiêm ngặt các loại Java. JavaScript về cơ bản hỗ trợ cú pháp biểu thức Java và các thiết kế điều khiển lưu lượng cơ bản.

    Không giống như hệ thống thời gian biên dịch lớp Java, được xây dựng trên quảng cáo, JavaScript sẽ hỗ trợ hệ thống thời gian chạy dựa trên một lượng nhỏ các loại dữ liệu: các giá trị số, boolean và chuỗi. JavaScript có một mô hình đối tượng dựa trên các nguyên mẫu và mô hình không phổ biến hơn dựa trên các lớp. Mô hình về các nguyên mẫu cung cấp khả năng thừa kế động; Đó là những gì được thừa hưởng có thể khác nhau cho các đối tượng khác nhau. JavaScript cũng hỗ trợ các tính năng mà không có yêu cầu khai báo đặc biệt. Các chức năng có thể là thuộc tính của các đối tượng, thực hiện các phương thức được gõ yếu.

    JavaScript miễn phí nhiều hơn nhiều trong mẫu so với Java. Bạn không nên khai báo tất cả các biến, lớp và phương thức. Bạn không nên xem xét phương pháp nào là công khai, riêng tư hoặc được bảo vệ và bạn không nên thực hiện các giao diện. Các giá trị được trả về của các biến, tham số và hàm không được gõ rõ ràng.

    Java là một ngôn ngữ lập trình dựa trên các lớp được tạo để thực hiện nhanh và kiểm tra nghiêm ngặt. Ví dụ, phương tiện kiểm tra loại nghiêm ngặt, bạn không thể làm rõ một Java nguyên thành một liên kết đối tượng hoặc truy cập bộ nhớ riêng, vi phạm mã byte Java. Mô hình lớp Java có nghĩa là các chương trình chỉ bao gồm các lớp và các phương thức của chúng. Kế thừa các lớp Java và gõ nghiêm ngặt thường yêu cầu một hệ thống phân cấp đối tượng được xây dựng chặt chẽ. Những yêu cầu này làm cho lập trình Java phức tạp hơn Ủy quyền trong JavaScript.

    JavaScript trong tinh thần xuất phát từ các ngôn ngữ nhỏ, được gõ động như HyperTalk và DBASE. Các ngôn ngữ lập trình này là các tiện ích lập trình cho một đối tượng rộng, vì họ đã đơn giản hóa cú pháp, chức năng nhúng chuyên dụng và yêu cầu tối thiểu Khi tạo đồ vật.

    Bảng 1.1 JavaScript so với Java
    Javascript. Java.

    Giải thích (không được biên dịch) bởi khách hàng.

    Biên dịch mã byte được biên dịch được tải xuống từ máy chủ, chạy trên máy khách.

    Hướng đối tượng. Không có sự khác biệt về loại đối tượng. Kế thừa trải qua cơ chế nguyên mẫu và các thuộc tính và phương thức có thể được thêm một cách linh hoạt vào bất kỳ đối tượng nào.

    Dựa trên các lớp học Các đối tượng được chia thành các lớp và các bản sao với thừa kế trong suốt chuỗi phân cấp các lớp. Các lớp và phiên bản không thể có các thuộc tính hoặc phương thức được thêm vào một cách linh hoạt.

    Mã tích hợp và được nhúng trong HTML.

    Aplafts khác với HTML (khi truy cập từ các trang HTML).

    Loại dữ liệu của biến không được khai báo (gõ động).

    Kiểu dữ liệu của biến phải được khai báo (gõ tĩnh).

    Không thể tự động ghi vào đĩa cứng.

    Không thể tự động ghi vào đĩa cứng.

    Gỡ lỗi trong JavaScript.

    JavaScript cho phép bạn tạo phức tạp chương trình máy tính. Như trong các ngôn ngữ khác, bạn có thể sai khi viết kịch bản. Trình gỡ lỗi debugger JavaScript Netscape cho phép bạn gỡ lỗi các tập lệnh của bạn. Về việc sử dụng trình gỡ lỗi / trình gỡ lỗi, hãy xem các tài liệu sau:

    • Trình gỡ lỗi JavaScript Netscape 1.1 - Giới thiệu về trình gỡ lỗi.
    • Bạn có thể tải gỡ gỡ lỗi từ URL được chỉ định. Tệp tải xuống này SmartUpdate .jar. Để cài đặt trình gỡ lỗi, hãy tải xuống tệp này.jar file to Navigator: Sử dụng quy trình được mô tả trong URL ở trên hoặc nhập URL vào tệp K.jar trong trường Vị trí.

    • Bắt đầu với trình gỡ lỗi JavaScript Netscape Giải thích cách sử dụng trình gỡ lỗi.

    Visual JavaScript.

    Netscape Visual JavaScript là một tiện ích phát triển trực quan trên cơ sở các thành phần cho nền tảng Môi trường mạng Netscape mở (một). Nó được dự định chủ yếu để sử dụng các nhà phát triển muốn tạo các ứng dụng web phụ thuộc vào nền tảng dựa trên các tiêu chuẩn từ các thành phần sẵn sàng để sử dụng với chi phí lập trình tối thiểu. Các ứng dụng này dựa trên HTML, JavaScript và Java.

    Thông số kỹ thuật JavaScript và ECMA

    Netscape Corporation đã phát minh ra JavaScript và JavaScript lần đầu tiên được sử dụng trong các trình duyệt Netscape. Đồng thời, Netscape hoạt động với ECMA (Hiệp hội các nhà sản xuất máy tính châu Âu) vượt trội so với việc tạo ra một ngôn ngữ lập trình quốc tế được tiêu chuẩn hóa dựa trên kernel JavaScript. ECMA là Hiệp hội các tiêu chuẩn quốc tế về các hệ thống thông tin và truyền thông. Phiên bản JavaScript được tiêu chuẩn hóa này, được gọi là EcMascript, hoạt động chính xác như nhau trong tất cả các ứng dụng hỗ trợ tiêu chuẩn này. Các công ty có thể sử dụng ngôn ngữ tiêu chuẩn mở này để phát triển các triển khai JavaScript của họ. Phiên bản đầu tiên của tiêu chuẩn ECMA được ghi lại trong đặc tả ECMA-262.

    Tiêu chuẩn ECMA-262 cũng được ISO (Tổ chức tiêu chuẩn quốc tế) chấp thuận là ISO-16262. Bạn có thể tìm thấy phiên bản PDF của ECMA-262 trên trang web Netscape Devedge Online. Bạn cũng có thể tìm thấy thông số kỹ thuật này trên trang web ECMA. Đặc tả ECMA không mô tả Đối tượng tài liệu. Model (DOM), được tiêu chuẩn hóa bởi tập đoàn Worl Wide Web Consortium (W3C). DOM xác định phương thức mà các đối tượng HTML tài liệu được tiếp xúc với tập lệnh của bạn.

    Tỷ lệ phiên bản javascript và ecma

    Netscape hoạt động chặt chẽ với ECMA để tạo ra một đặc tả ECMA. Bảng hiển thị tỷ lệ giữa các phiên bản JavaScript và ECMA.