Link from: http://www.binoot.com/2013/04/18/deploying-durandal-spa-to-production/
I have been building a single page application (SPA) using Durandal JS. In this post, I want to talk about some of the steps that you want to take when you are deploying your single page application to your production/live web server. In my case I am using ASP.Net MVC 4 and I use Windows Azure to host my website. If you want to learn more about how to build a SPA using Durandal, I strongly suggest you watchJohn Papa‘s SPA Jump Start course in Pluralsight.
Typically your SPA application will have a structure like this:
In this all the files except the main-built.js is your application. This includes Durandal, Require JS, your files, etc. “main-built.js” is the optimized single file that contains your javascript and html files that you need to deploy to your production web server. So you do you package this for production? This is simple than I thought. I was thinking of using ASP.Net Bundle capability to bundle all the JS files, but decided against it because I felt to manage my SPA files using ASP.Net bundling could become very tricky very fast because of paths, and html files. So I went with the optimizer that is included with Durandal.
Once you install durandal using Nuget ( or HotTowel Nuget), you will see under App\durandal\amd\ you have a file called optimizer.exe. This is the tool we will use to package our SPA application.
Now we can use this file in our application, following code snippet shows how to include this in your index.chtml file. We will use the full files when we are in debug mode and when we are running a release configuration, use the optimized file.
1
2
3
4
5
6
7
8
|
@Scripts.Render(
"~/scripts/vendor"
)
@
if
(HttpContext.Current.IsDebuggingEnabled) {
<script src=
"~/App/durandal/amd/require.js"
data-main=
"App/main"
></script>
}
else
{
<script type=
"text/javascript"
src=
"~/App/main-built.js"
></script>
}
|
As you can see, I am using ASP.Net Bundles to combine and compress all the standard JS files like bootstrap, jquery plugins, or any other components that I use and are not part of my SPA code and use the optimizer created file for my SPA code. With this approach, our application code (SPA code) is send to browser as a single file enabling faster download. If you want to bust cache when each time you are deploying new code to your server, you can configure Require.js to include a query string parameter to each resource it fetches.
1
2
3
4
|
require.config({
paths: {
"text"
:
"durandal/amd/text"
},
urlArgs:
"bust="
+ (
new
Date()).getTime()
});
|
Reference: http://requirejs.org/docs/api.html#config.
Please note that the code snippet above is ideal only for development, for your release code, change this to something like :
urlArgs: "bust=v1.1"
This will make sure that your users will not be downloading any resources that browser already has unless it is changed (which typically happens when you have a new release)
That’s all for now folks! Happy Programming!
Cheers!
Binu