Author: b...@google.com Date: Mon Apr 6 08:51:55 2009 New Revision: 5187 Modified: wiki/ClientBundle.wiki
Log: Edited wiki page through web user interface. Modified: wiki/ClientBundle.wiki ============================================================================== --- wiki/ClientBundle.wiki (original) +++ wiki/ClientBundle.wiki Mon Apr 6 08:51:55 2009 @@ -1,13 +1,110 @@ #summary Compile-time resource optimizations -TODO(bobv): Copy wiki articles from incubator to here; cross-link the pages +<wiki:toc /> -= Migrating from ImmutableResourceBundle = += Introduction = + + The resources in a deployed GWT application can be roughly categorized into resources to never cache `.nocache.js`, to cache forever `.cache.html`, and everything else `myapp.css`. The ClientBundle interface moves entries in the everything-else category into the cache-forever category. + += Goals = + + * No more uncertainty if your application is getting the right contents for program resources. + * Decrease non-determinism caused by intermediate proxy servers. + * Enable more aggressive caching headers for program resources. + * Eliminate mismatches between physical filenames and constants in Java code by performing consistency checks during the compile. + * Use 'data:' URLs, JSON bundles, or other means of embedding resources in compiled JS when browser- and size-appropriate to decrease the number of round-trips entirely. + * Provide an extensible design for adding new resource types. + * Ensure there is no penalty for having multiple ClientBundle resource functions refer to the same content. + += Non-Goals = + + * To provide a file-system abstraction + += Examples = + +To use the ClientBundle, add an inherits tag to your `gwt.xml` file: +{{{ +<inherits name="com.google.gwt.resources.Resources" /> +}}} + +Interfaces: +{{{ +public interface MyResources extends ClientBundle { + public static final MyResources INSTANCE = GWT.create(MyResources.class); + + @Source("my.css") + public CssResource css(); + + @Source("config.xml") + public TextResource initialConfiguration(); + + @Source("manual.pdf") + public DataResource ownersManual(); +} +}}} + +You can then say: +{{{ + Window.alert(MyResources.INSTANCE.css().getText()); + new Frame(MyResources.INSTANCE.ownersManual().getURL()); +}}} + += I18N = + +ClientBundle is compatible with GWT's I18N module. + +Suppose you defined a resource: +{{{ +...@source("default.txt") +public TextResource defaultText(); +}}} + +For each possible value of the `locale` deferred-binding property, the ClientBundle generator will look for variations of the specified filename in a manner similar to that of Java's `ResourceBundle`. + +Suppose the `locale` were set to `fr_FR`. The generator would look for files in the following order: + # default_fr_FR.txt + # default_fr.txt + # default.txt + +This will work equally well with all resource types, which can allow you to provide localized versions of other resources, say `ownersManual_en.pdf` versus `ownersManual_fr.pdf`. + += Pluggable Resource Generation = + +Each subtype of `ResourcePrototype` must define a `...@resourcegenerator` annotation whose value is a concrete Java class that extends `ResourceGenerator`. The instance of the `ResourceGenerator` is responsible for accumulation (or bundling) of incoming resource data as well as a small degree of code generation to assemble the concrete implementation of the ClientBundle class. Implementors of `ResourceGenerator` subclasses can expect that only one `ResourceGenerator` will be created for a given type of resource within an ClientBundle interface. + +The methods on a `ResourceGenerator` are called in the following order + # `init` to provide the `ResourceGenerator` with a `ResourceContext` + # `prepare` is called for each `JMethod` the `ResourceGenerator` is expected to handle + # `createFields` allows the `ResourceGenerator` to add code at the class level + # `createAssignment` is called for each `JMethod`. The generated code should be suitable for use as the right-hand side of an assignment expression. + # `finish` is called after all assignments should have been written. + +`ResourceGenerators` are expected to make use of the `ResourceGeneratorUtil` class. + += Potential pitfalls = + * Changing the content of the resources will change the filenames (or data: encoding), thus forcing a recompile of the GWT application. To avoid this, the inlining and renaming features can be globally toggled off in your gwt.xml file during the development phase. + * Inlining files into the compiled JS may not make sense if those files are not always accessed by the program, thus inlining should be configurable on a per-resource or per-ClientBundle basis. + += Levers and knobs = + + * `ClientBundle.enableInlining` is a deferred-binding property that can be used to disable the use of `data:` URLs in browsers that would otherwise support inlining resource data into the compiled JS. + * `ClientBundle.enableRenaming` is a configuration property that will disable the use of strongly-named cache files. + += Resource types = + + * CssResource + * DataResource + * ExternalTextResource + * GwtCreateResource + * ImageResource + * TextResource + += Migrating from !ImmutableResourceBundle = == Plan == * Expected that incubator IRB system will initially co-exist with ClientBundle in trunk while integration issues are worked out. - * Will then change incubator code to be trivial wrappers around trunk code and add deprecations. + * Will then change incubator code to add deprecations. * No plans to remove types from incubator for _long period of time_. * No additional features or bug-fixes will be added to incubator APIs. @@ -23,4 +120,5 @@ * `CssResource.enableMerge` to `CssResource.mergeEnabled` * `CssResource.forceStrict` to `CssResource.strictAccessors` * `CssResource.globalPrefix` to `CssResource.obfuscationPrefix` + * `CssResource.style` has changed to a configuration property; switch from `<set-property>` to `<set-configuration-property>` tags to configure this. * StyleInjector moved to `com.google.gwt.dom.client` package --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---