I thought I'd share the instructions I prepared for creating a dojo
0.4.2 custom profile for Struts 2.0.9. The objective is to bundle all
the required dojo resources into dojo.js to avoid the numerous slow
sequential requests for resources. This makes a massive performance
improvement to the default ajax theme.
Instructions for improving the performance of dojo 0.4.2 in Struts 2.0.9:
$resources$ is assumed to be your web resources directory
1. First, configure struts to serve the static files directly from
$resources$/struts instead of from within struts-core-2.0.9.jar:
a. extract struts2-core-2.0.9.jar/org/apache/struts2/static/* to
$resources$/struts/
b. edit struts.properties and set struts.serve.static=false
c. also extract the javascript and css files from
struts2-core-2.0.9.jar/templates/* to $resources$/struts/ as this will
be helpful later
eg. $resources$/struts/ajax/dojoRequire.js
Confirm that your application still works before proceeding. It's
essential that resources are loaded from the directory rather than the jar.
2. Download the source of dojo 0.4.2. You won't need to modify it. The
download location doesn't matter. We assume it's in release-0.4.2/
> svn export http://svn.dojotoolkit.org/dojo/tags/release-0.4.2
This is almost identical to the version bundled with struts2.0.9.
3. Use an editor to create a dojo custom profile as the file
release-0.4.2/buildscripts/profiles/struts2.profile.js. This file
defines which dojo resources you use directly. Essentially it specifies
which code will be included in dojo.js. An example that includes almost
everything is provided at the end of this email.
4. Copy the struts widgets into the dojo directory so they can be
included within dojo.js. That is, copy $resources$/struts/dojo/struts/*
to release-0.4.2/struts.
This is the directory that contains the widget and widgets
subdirectories, css and some images.
5. Build dojo using ant. This will create a new dojo.js file:
> cd release-0.4.2/buildscripts
> ant -Dprofile=struts2 -Dstrip_and_compress=true clean release
intern-strings strip-resource-comments
(You may be asked to run it twice).
Pay some attention to the build process. In particular, note whether it
finds the struts widgets and 'internalises' the related resources. If
not, see Step 4. You'll probably notice a lot of things are included
that you don't need. That will be helpful later for optimizations.
Some errors will occur while stripping the comments but these are ok.
6. When the build process completes the release directory will contain
all the files you need. The content of the release directory can be
copied over the top of $resources$/struts/dojo. You'll notice it's
almost exactly the same as the original, although dojo.js is probably
larger.
It's okay to delete the demo, test and release subfolders before copying
to your application. The src subfolder must be distributed with your
application as it contains images used by dojo.
7. Clear your browser cache and test your application again. You should
note the larger dojo.js file being loaded and significantly fewer
requests for resources by dojo Hopefully it's also a lot faster.
That's it. Now you can go back and optimize the profile by removing
resources you don't need. There's examples in the profiles directory.
Repeat the build/test process to find the right balance.
I also recommend editing $resources$/struts/ajax/dojoRequire.js to
remove the reference to the Editor2 if you don't use this as it's a
very,very heavy-weight resource.
Hope that helps someone else. Improvements & comments welcome. See
reference [3] below for detailed instructions and rationale.
regards,
Jeromy Evans
Resources
[1] http://struts.apache.org/2.x/docs/performance-tuning.html
[2]
http://www.nabble.com/-s2--Struts-head-tag-KILLS-%28%3E-10s%29-page-load-time-tf4490390.html#a13047981
[3]
http://www.dojotoolkit.org/book/dojo-book-0-4/part-6-customizing-dojo-builds-better-performance
The following profile includes almost everything in dojo.js. It assumes
the struts widgets have been copied into the directory as mentioned at
step 4.
struts2.profile.js:
var dependencies = [
"dojo.lang.*",
"dojo.html.*",
"dojo.debug",
"dojo.html.display",
"dojo.html.layout",
"dojo.html.util",
"dojo.lfx.*",
"dojo.event.*",
"dojo.logging.*",
"dojo.io.*",
"dojo.io.IframeIO",
"dojo.date",
"dojo.string.*",
"dojo.regex",
"dojo.rpc.*",
"dojo.xml.*",
// "dojo.flash.*",
// "dojo.storage.*",
"dojo.undo.*",
"dojo.crypto.*",
//"dojo.collections.*",
"dojo.collections.ArrayList",
"dojo.collections.Collections",
"dojo.collections.Queue",
"dojo.collections.Stack",
"dojo.dnd.*",
"dojo.widget.*",
"dojo.widget.TabContainer",
"dojo.widget.PageContainer",
"dojo.widget.LinkPane",
//"dojo.widget.Editor2",
//"dojo.widget.RichText",
//"dojo.widget.Editor2Toolbar",
//"dojo.widget.ColorPalette",
"dojo.math.*",
//"dojo.reflect.*",
"dojo.uri.*",
"struts.widget.Bind",
"struts.widget.Bind",
"struts.widget.BindDiv",
"struts.widget.BindAnchor",
"struts.widget.ComboBox",
"struts.widget.StrutsTimePicker",
"struts.widget.StrutsTimePicker"
];
dependencies.prefixes = [
["struts", "struts"]
];
load("getDependencyList.js");
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]