2013-04-26 33 views
69

Như bạn đã biết, Airbnb opensourced Rendr (http://nerds.airbnb.com/weve-open-sourced-rendr) mà nên cho phép server-side render của Backbone ứng dụng. Điều này là tuyệt vời, bởi vì người ta có thể chạy "lần lặp" đầu tiên của việc kết xuất khuôn mẫu trên máy chủ và máy khách nhận được tài liệu HTML hoàn toàn được kết xuất cùng với toàn bộ ứng dụng JS. Nó làm giảm đáng kể thời gian hiển thị và có thể giúp chúng tôi loại bỏ các hệ thống khuôn mẫu phía máy chủ khác.AngularJS - server-side render

Vì vậy, có ai đó đã quản lý kết xuất AngularJS với jsdom hoặc ZombieJS? Những giả lập về trình duyệt dom/trình duyệt trên Node.js nên theo lý thuyết là đủ cho việc tạo khuôn mẫu góc phía máy chủ đơn giản, nhưng kết quả tôi tìm thấy googling nó không phải là rất kết luận.

+7

Nó có thể đến trong AngularJS 2.0. Trong [video này] (http://youtu.be/ZhfUv0spHCY?t=40m30s), chúng nói về hiển thị phía máy chủ và tại sao hiện tại không thể thực hiện điều đó với AngularJS vào lúc này. –

Trả lời

2

@ dai-shi tạo trình kết nối trước, xem here. Vẫn còn một vài vấn đề nhưng hy vọng một khởi đầu tốt đẹp

+0

nó có vẻ là một công cụ tốt, bạn có sử dụng nó trong sản xuất? – IamStalker

4

Tôi cũng đang tìm kiếm giải pháp. Nhưng nó không phải là một tùy chọn để sử dụng trình duyệt để hiển thị html trên máy chủ và gửi nó tới giao diện người dùng. Airbnb thử nó đầu tiên nhưng bị từ chối vì chậm và thiếu tài nguyên. Nó không phải là một giải pháp sản xuất.

Cập nhật: Đây sớm có thể được có thể với sự ra đời của Object.observe;)

+0

Trong hầu hết các trường hợp, hiển thị phía máy chủ sẽ được sử dụng cho rô bốt và một số trường hợp đặc biệt, do đó tác động hiệu suất máy chủ là không thể tin được. Ngoài ra 'rendering' trên phía máy chủ chỉ là mẫu để xử lý html, mà không thực tế rendering (mà là CPU nhất đói), mà anyway xảy ra ở phía khách hàng. – setec

+0

thường là bạn muốn thực hiện hiển thị phía máy chủ trên tải ban đầu. do đó, người dùng x sẽ truy cập trang danh sách cho lần đầu tiên truy cập ứng dụng. có thể họ đã đóng trình duyệt và mở lại sau. thay vì tải ứng dụng, sau đó thực hiện một yêu cầu http khác cho dữ liệu, máy chủ chỉ có thể thực hiện tất cả điều đó cho chúng tôi trong lần khởi chạy ban đầu. lý do rất hữu ích khác để làm điều này là dành cho các bot của công cụ tìm kiếm. không phải tất cả chúng đều thông minh như các chương trình google và không có trình biên dịch javascript của riêng chúng. – jemiloii

+0

Thời gian hiển thị không quan trọng đối với các chương trình google AdWords sử dụng thời gian tải làm yếu tố trong [chất lượng trang đích] (https://support.google.com/adwords/answer/2404197?co=ADWORDS.IsAWNCustomer%3Dfalse&hl=vi). Tôi đã tìm thấy ngay cả các trình duyệt không đầu như PhantomJS tạo ra tải CPU đáng kể. –

1

Đây không phải là performant, nhưng tôi đã đang làm việc trên một đơn giản PhantomJS server for Heorku sẽ phân tích cú pháp bất kỳ JS khách hàng nào. Tôi sử dụng nó đặc biệt với Angular và Rails để phục vụ HTML cho các yêu cầu bot.

5

AngularJS hoạt động với bối cảnh jsdom mà không có bất kỳ thủ thuật nào. Chỉ cần thêm angular.js vào js src danh sách và trang chính của ứng dụng góc để jsdom trên initializion của nó.

Vì vậy, hiển thị rất đơn giản: chỉ cần sử dụng góc trong jsdom và nó hoạt động. Đưa nó vào trình duyệt hơi khó hơn.

Một cách là đồng bộ hóa hàng loạt thay đổi DOM.

Để nhận cập nhật từ máy chủ đến máy khách, bạn có thể sử dụng MutationEvents (không may, jsdom không hỗ trợ MutationObservers, nhưng MutationEvents hoạt động khá nhanh). Sử dụng chúng để xếp chồng các thay đổi DOM trong mảng tích lũy và đẩy nó định kỳ vào trình duyệt của khách hàng (giả sử, mỗi 25 ms).

Cũng để bật sự kiện của người dùng, bạn nên theo dõi tài liệu khôn ngoan trên trình duyệt và tương tự tích lũy và đẩy chúng vào máy chủ.

Một thực hiện cách tiếp cận như vậy là jsdom-sync (https://www.npmjs.org/package/jsdom-sync)

Một nhược điểm của máy chủ bên vẽ là sự vắng mặt của kích thước DOM mô hình hộp, bởi vì để có được chiều rộng yếu tố/chiều cao nó nên được thực sự trả lại. Có nghĩa là giải pháp này hầu như không phù hợp cho svg và như vậy ..

Bạn cũng có thể xem xét xem mô hình phạm vi và đồng bộ hóa với phạm vi trình duyệt, nhưng đó là câu chuyện hoàn toàn khác.

0

i Hy vọng nó vẫn có thể giúp somone, nhưng đây là một gói NPM Tôi đã tạo:

https://www.npmjs.com/package/ng-node-compile

+0

Bạn có thể giải thích thêm làm thế nào để biết khi nào thì đường ống của các angularj ngừng hoạt động? – IamStalker

5

Gói này mới https://github.com/a-lucas/angular.js-server cho phép bạn pre-render một ứng dụng kiễu góc và gửi HTML cho khách hàng, sau đó sẽ thực thi mã JS.

Nó hỗ trợ lưu vào bộ đệm cho mỗi url và bạn có thể xác định quy tắc để kích hoạt hiển thị trước URL.

PS: Tôi là người đóng góp chính cho gói này.

2

Tôi biết đây là một câu trả lời trễ, angular.js-server (https://github.com/a-lucas/angular.js-server) sử dụng phiên bản góc được sửa đổi kích hoạt trạng thái không hoạt động cần thiết để phát hiện khi tất cả sự kiện yêu cầu ajax và $ biên dịch được xử lý.

Tôi đã quản lý trước khi kết xuất ngăn xếp mean.js với hầu như không có sửa đổi nào.