2010-01-13 27 views
7

Tôi đã có một ứng dụng được viết bằng Struts/Tiles/JSP mà tôi đang thêm ứng dụng GWT vào. Phần không phải GWT của ứng dụng của tôi xử lý bộ đệm css bằng cách thực sự viết ra tệp css với số phiên bản được lấy từ kho lưu trữ svn của tôi, như "styles.css? Svnbuild = 12345" này. Bằng cách đó tôi có thể yêu cầu trình duyệt lưu trữ các tệp css đó mãi mãi và khi tôi triển khai phiên bản mới, tất cả người dùng của tôi sẽ tải xuống ngay lập tức.Cách xử lý bộ nhớ đệm của các tệp CSS chủ đề GWT

Bây giờ tôi đang chuyển sang ứng dụng GWT và tôi thích cách nó sử dụng "longmd5sum.cache.css" làm tên tệp để tôi vẫn có thể yêu cầu trình duyệt lưu vào bộ nhớ cache mãi mãi. Vấn đề là các tệp css được liên kết với chủ đề của tôi, như "gwt-standard.css", không có tên mạnh và không có tham số svnbuild của tôi đính kèm. Bất cứ khi nào tôi triển khai một phiên bản mới của ứng dụng của tôi, người dùng vẫn nhìn thấy phiên bản cũ của css mà làm cho nó trông sai.

Có ai đã tìm ra phương pháp hay nhất để xử lý bộ nhớ đệm của các tệp css chủ đề gwt không? Có cách nào tôi có thể nối thêm một tham số svnbuild hoặc một cái gì đó tương tự khi phụ thêm css vào tài liệu?

+0

Giải pháp đã cung cấp đã vô dụng trên GWT2.4. Bạn có thể đề xuất giải pháp mới không? – Hatter

Trả lời

10

Ok. Vì vậy, sau khi tôi đăng này, tôi đào vào mã nguồn GWT và tìm thấy một số liên kết về việc tạo một liên kết tùy chỉnh GWT.

http://development.lombardi.com/?p=29

http://code.google.com/webtoolkit/doc/1.6/DevGuideOrganizingProjects.html

Đây là cách tôi giải quyết nó với mối liên kết của riêng tôi. Trước tiên, tôi đã tạo một lớp trình liên kết mở rộng IFrameLinker chuẩn:

@LinkerOrder(LinkerOrder.Order.PRIMARY) 
public class MyLinker extends IFrameLinker { 
    protected String generateStylesheetInjector(String stylesheetUrl) { 
     stylesheetUrl = stylesheetUrl + "?buildtime=" + System.currentTimeMillis(); 
     return super.generateStylesheetInjector(stylesheetUrl); 
    } 
} 

Sau đó, chỉ cần yêu cầu mô-đun của bạn sử dụng trình liên kết tùy chỉnh của bạn. Trong tệp module.gwt.xml của bạn:

<module> 
    <define-linker name="mylinker" class="com.company.gwt.core.linker.MyLinker" /> 
    <add-linker name="mylinker" /> 
</module> 

Chỉ cần thử nó ra và bây giờ trong tệp nocache.js của tôi, nó xuất ra dấu thời gian mới mỗi khi tôi biên dịch. Người dùng của tôi có thể lưu trữ tệp css vĩnh viễn và họ sẽ tự động tải xuống tệp mới bất cứ khi nào tôi triển khai phiên bản ứng dụng mới.

2

Có vẻ như điều ưu tiên cần làm bây giờ là sử dụng ClientBundles thay vì sau đó tách biệt CSS: Google Css Resource Cookbook . Chúng tôi vừa mới chuyển đổi này khá đau đớn với những điều sau đây (với một số rõ ràng ý định tương lai để loại bỏ các chú thích @ CssResource.NotStrict):

public interface OurCssResources extends ClientBundle { 

    @Source("ourCSS.css") 
    @CssResource.NotStrict 
    public CssResource getCss(); 
... 

Sau đó, trong thư mục gốc của ứng dụng của chúng tôi:

private void injectAllCss() { 
     OurCssResources resources = GWT.create(OurCssResources.class); 
     resources.getCss().ensureInjected(); 
... 

Đây là một loại phương pháp tiếp cận nặng tay, nhưng nó giải quyết vấn đề, và nó đặt bạn trên con đường để làm những việc theo cách dự định của google. Có vẻ như bạn có thể đến gần hơn với cách dự định của họ fairly automatically (mặc dù tôi chưa thử trên 2.4, những thứ tôi đã đề cập ở trên đã làm việc dưới 2.4 (Tôi đã gặp sự cố với phụ thuộc bên ngoài (GXT) , nhưng vì điều đó sẽ không thay đổi, tôi chỉ để lại nó bằng phương pháp cũ thời

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