2008-12-01 13 views
12

Để cung cấp URL đẹp giữa các phần của ứng dụng, chúng tôi chia mọi thứ thành nhiều mô-đun được biên dịch độc lập. Ví dụ: có phần "người quản lý" và phần "trình chỉnh sửa". Trình chỉnh sửa khởi chạy trong cửa sổ mới. Bằng cách này, chúng tôi có thể liên kết trực tiếp với người chỉnh sửa:Các ứng dụng lớn trong GWT: một mô-đun hoặc một số?

/com.example.EditorApp?id=1 

Mô-đun EditorApp chỉ nhận giá trị cho id và tải tài liệu lên.

Vấn đề với điều này là TẤT CẢ mã chung giữa hai mô-đun được nhân đôi trong đầu ra. Điều này bao gồm bất kỳ nội dung tĩnh (đồ họa), bảng định kiểu, v.v.

Và một vấn đề khác là thời gian biên dịch tạo JavaScript gần gấp đôi vì chúng tôi có một số mã phức tạp được chia sẻ giữa hai mô-đun phải được xử lý hai lần.

Có ai đã xử lý vấn đề này không? Tôi đang xem xét loại bỏ các mô-đun riêng biệt và sáp nhập tất cả trở lại vào một mục tiêu biên dịch. Hạn chế duy nhất là các URL giữa "ứng dụng" của chúng tôi trở thành một cái gì đó như:

/com.example.MainApp?mode=editor&id=1 

Mỗi cửa sổ tải mô-đun chính, kiểm tra giá trị của tham số chế độ và gọi mã mô-đun thích hợp.

+0

Điều này có thể hữu ích: http://code.google.com/webtoolkit/doc/latest/DevGuideCodeSplitting.html –

+0

Đúng. Tôi hỏi điều này trước khi GWT 2.x được phát hành. Mọi thứ trở nên đơn giản và mạnh mẽ hơn bao giờ hết. –

Trả lời

8

Tôi đã xây dựng một vài ứng dụng rất lớn trong GWT và tôi tìm cách tốt nhất để chia nhỏ thành các mô-đun và chuyển mã chung vào khu vực riêng của nó, như bạn đã làm. Lý do trong trường hợp của chúng tôi là đơn giản, chúng tôi đã có một số phần của ứng dụng của chúng tôi rất khác với phần còn lại, do đó, nó có ý nghĩa từ một quan điểm kích thước biên dịch. Ứng dụng của chúng tôi được biên dịch xuống 300kb cho phần chính và khoảng 25-40kb cho các phần khác. Nếu chúng ta chỉ cần đặt tất cả trong một người sử dụng sẽ có được trái với một tải về 600kb, mà đối với chúng tôi đã không được chấp nhận. Nó cũng có ý nghĩa hơn từ quan điểm thiết kế và khả năng sử dụng lại để phân biệt mọi thứ càng nhiều càng tốt, vì chúng tôi đã sử dụng lại rất nhiều mô-đun mà chúng tôi đã xây dựng trên dự án này.

Thời gian biên dịch không phải là điều bạn thường nên lo lắng, bởi vì bạn thực sự có thể làm cho nó nhanh hơn nếu bạn có các mô-đun riêng biệt. Chúng tôi sử dụng kiến ​​để xây dựng dự án của mình và chúng tôi đặt nó chỉ biên dịch GWT đã thay đổi và trong quá trình phát triển chỉ xây dựng cho một trình duyệt, thời gian biên dịch điển hình cho dự án của chúng tôi là 20 giây và chúng tôi có nhiều mã. Bạn có thể xem và ví dụ về điều này here.

Một điều nhỏ khác: Tôi giả sử bạn biết rằng bạn không phải sử dụng đường dẫn GWT mặc định mà nó tạo ra? Vì vậy, thay vì com.MyPackage.Package bạn chỉ có thể đặt nó vào một thư mục với một tên tốt đẹp như 'ui' hoặc một cái gì đó. Sau khi biên dịch GWT không quan tâm đến nơi bạn đặt nó, và không nhạy cảm với những thay đổi đường dẫn, bởi vì tất cả chạy từ cùng một thư mục.

+0

liên kết sẽ hết hạn ngay bây giờ –

1

Ok. Tôi thực sự hiểu được rằng thực sự không có câu trả lời "đúng" bởi vì các dự án thay đổi rất nhiều. Nó phụ thuộc rất nhiều vào bản chất của ứng dụng.

Công trình chính của chúng tôi bao gồm một số mô-đun trong nhà và mô-đun bên thứ ba. Tất cả đều được quản lý trong các dự án riêng biệt. Điều đó có ý nghĩa vì chúng được sử dụng ở những nơi khác nhau.

Nhưng có nhiều hơn một mô-đun trong một dự án được thiết kế để hoạt động như một ứng dụng hoàn chỉnh dường như có những thứ quá phức tạp. Lý do ban đầu cho hai mô-đun là để giữ cho URL đơn giản khi mở các màn hình khác nhau trong một cửa sổ mới.Mặc dù có nhiều mục tiêu xây dựng, tất cả chúng đều sử dụng một tập hợp con rất phổ biến của mã (bao gồm cả thư viện marshalling XML/POJO tùy chỉnh).

Giới thiệu về kích thước ... đối với chúng tôi, một mô-đun là 280KB và mô-đun kia chỉ hơn 300KB.

Tôi vừa hoàn tất việc hợp nhất mọi thứ lại thành một mô-đun duy nhất. Mô-đun kết hợp mới là khoảng 380KB. Vì vậy, nó thực sự là một chút ít để tải về vì hầu hết mọi người sẽ sử dụng cả hai màn hình.

Cũng nên nhớ có bộ đệm ẩn hoàn hảo, vì vậy chỉ nên tải xuống 380KB một lần, trừ khi ứng dụng bị thay đổi.

+0

ứng dụng của chúng tôi chạy dưới dạng HTTPS, vì vậy không có bộ nhớ đệm trong nhiều lượt truy cập, do đó kích thước thực sự quan trọng đối với chúng tôi. Tôi nghĩ câu trả lời đúng trong hầu hết các trường hợp là phân chia chúng, để bảo trì, quản lý và biên dịch tốc độ – rustyshelf

+1

@rustyshelf: HTTPS không _not_ có nghĩa là không có bộ nhớ đệm. xem ví dụ [bài đăng trên blog này về các huyền thoại HTTPS] (http://blog.httpwatch.com/2011/01/28/top-7-myths-about-https/) –

4

Từ kinh nghiệm xây dựng ứng dụng GWT, có một vài điều cần xem xét khi quyết định xem bạn có muốn nhiều mô-đun (có hoặc không có điểm nhập) hay tất cả trong một: thời gian tải xuống (kích thước gói Javascript), thời gian biên dịch, điều hướng/url và khả năng bảo trì/khả năng sử dụng lại.

... mỗi lần tải xuống, mã chia nhỏ khá nhiều làm giảm sự cần thiết phải đột nhập vào các mô-đun khác nhau vì lý do hiệu suất.

... mỗi lần biên dịch, thậm chí các ứng dụng lớn cũng khá nhanh để biên dịch, nhưng nó có thể giúp giải quyết mọi thứ cho các ứng dụng lớn.

... trên mỗi điều hướng/url, có thể là một nỗi đau khi điều hướng từ mô-đun này sang mô-đun khác (giả sử EntryPoints khác), vì mỗi mô-đun có trạng thái phía máy khách riêng ... mô-đun.

... mỗi khả năng bảo trì/khả năng sử dụng lại, có thể hữu ích từ phối cảnh tổ chức/cấu trúc để chia thành các mô-đun riêng biệt (ngay cả khi chỉ có một EntryPoint).

Tôi đã viết một bài đăng blog về using GWT Modules, trong trường hợp nó giúp.

Các vấn đề liên quan