Being Silverlight developer means that we are also kind of web developers. From this point of view, we also have to think about the web traffic that our applications generate. We need to reduce it as much as possible. So basically we need to reduce the size of the application's output - the .xap file.
In this post I'll try to summarize the five ways to reduce the size of a xap that I've shared today with Sofia's Silverlight User Group.
Understanding the Xap
In order to reduce the size of a xap file, we should first be aware of its structure. Basically it can contain only 4 things:
- AppManifest.xaml - xaml file that identifies the packaged assemblies and the application entry point
- Application Assembly - the one that contains the Application class.
- Library assemblies.
- Resource files - like images and videos
So we can smaller its size by reducing the code and resources of our assemblies, load assemblies on demand (exclude them from the xap) or minify some of the compiled library assemblies.
Start with the Resources
You should carefully think about the resources (Images, Videos...) - how you use and manage them! You have 3 options to choose from - embed them into assembly, add them as a content in the xap or leave them on the server as web content. Note that the last option can reduce the xap significantly. You have to check their "Build Action" and choose the correct one:
- Resource - The resource gets embedded into the assembly, so respectively in the xap.
- Content - The resource gets embedded into the xap.
- None - The resource won't be embedded into the assembly nor the xap. But you can "Copy it to the Output Directory", so use it as web resource, thus Load it on Demand.
You can read more about Silverlight resource files here
Application Library Caching
It allows you to exclude assemblies form the xap with just a single click option, mark them as external parts
and make them ready to be cached by the browser. I'm not going to dive into Assembly Caching, since Evan made a great post about it. Just read it
and consider using it.
Load assemblies on Demand
This trick is possible due to the Silverlight API, that allows us to load assemblies into the AppDomain. We need to download one using simple WebClient, load it and use Reflection to use its types and resources. Although this is tricky and kind of obsolete (thanks to the Prism
), one can find it interesting and implement it on his/her own. You can read more about this approach
Modularity with Prism
Prism is probably the best approach out there for Silvrelight application development. The architecture allows us to slice the application into Moduls. Each module can be easily configured to be Loaded On Demand | When Available and On the Background.
So the resulting application consist of a lot of xaps and some of them are delayed and downloaded during run-time, which can significantly reduce the initial download time and respectively enhance the overall user experience. Download the latest binaries
and play with the modularity example projects.
Note that if a Module reference assembly that is loaded with the main module, you can set its CopyLocal = False attribute, which means that the assembly won't be included into the xap. But since it will be already loaded into the AppDomain, everything is ok.
Dead-code removing - Minification
Some more Tricks
- Re-zip your xap package using higher compression ratio. Read the full story by Valeri Hristov.
- Configure long expiration date on your IIS, so the xap will be cached by the user's browser, thus downloaded only once.
- Create nice looking and professional SplashScreen that will reduce the bad experience from downloading big xap package.
Thank you for your time and keep in mind that the Xap size matters!