Is there a way to update asp.net mvc bundle contents dynamically at run-time?
U

1

10

I'm ASP.NET MVC v4 for my application, and I'm using the web optimization features (bundling and minification of scripts and styles).

Now, what I understand is (please correct me if wrong), the optimization framework will look at the included files at the time of compilation and configure them. It'll create a version number (v=something) based on the contents. Every time the contents change, it'll recreate the version hash, and the client will get updated files.

Now, is there a way to get the following done

[1] Update something inside a js file in my server, and serve the updated one to the clients without re-building & re-starting the application (I'm not changing bundle configuration here, just updating file content inside a script) ?

[2] Update the script configuration itself (e.g. adding a new script to a bundle), and get that served to the clients without Re-compiling & Re-staring the application? Or, at least without re-compiling? (I know, generally we define the bundles inside cs files, but wondering if there is a way out!)

[3] Is there a way to use my own version number (say from a config file, v=myCustomScriptVersion) rather than the auto-generated version hash?

Understate answered 22/12, 2014 at 14:46 Comment(7)
The bundles aren't configured during compilation, they are configured at runtime during Application_Start.Gelhar
@danludwig, bundle contents are indeed defined in compile-time.Tenuto
@Tenuto they are defined at compile time, but they are configured at runtime. Appplication_Start will call BundleConfig.RegisterBundles, which adds the bundles to the collection. This code runs ...at runtime.Gelhar
Maybe I'm bit confused there. Anyway, I've updated my question, my intention is to get an updated script without re-compiling and re-staring the app.Understate
@ArghyaC yes it's possible. You would have to have something that would clear out GlobalFilters.Filters and re-run your bundle registration code.Gelhar
@danludwig, filters?Tenuto
@Gelhar & @ haim770, a working code example would be really helpful :)Understate
U
14

It's bit late, but I'm just sharing my experience on my own questions here.

As discussed in the comments of the question, bundles are defined as part of a cs file (generally BundleConfig.cs inside App_Start). So, the bundles are defined at compile time, and at application start they will get added to collection and become usable.

Now, the interesting bit. At run-time, the optimization framework looks into the included files and creates a hash of the contents, and appends that as a version query-string to the bundle request. So, when the bundle is called the generated uri is like the below one.

http://example.com/Bundles/MyBundledScripts?v=ILpm9GTTPShzteCf85dcR4x0msPpku-QRNlggE42QN81

This version number v=... is completely dynamic. If any file content within the bundle is changed, this version will be regenerated, and will remain same otherwise.

Now to answer the questions,

[1] This is done automatically by the framework, no need to do anything extra for this. Every time a file content is changed, new version number will be generated and the clients will get the updated scripts.

[2] Not possible. If files included in a bundle are changed, is has to be recompiled.

[3] Yes, it can be used. The custom version number can be added as below.

@Scripts.Render("~/Bundles/MyBundledScripts?v=" + ConfigurationManager.AppSettings["ScriptVersion"])

But Caution! This will remove the automatic versioning based on file contents.

And, additionally, if there are multiple versions of the same file available and we always want to include the latest version available, that can be achieved easily by including a {version} wildcard in bundle configuration like below.

bundles.Add(new ScriptBundle("~/Bundles/MyBundledScripts")
            .Include(
                "~/Scripts/Vendor/someScript-{version}.js"
            ));

So, if there are 2 scripts in the /Scripts/Vendor folder someScript-2.3.js someScript-3.4.js

Then the file someScript-3.4.js (higher version) will get included automatically. And when a new file someScript-4.0.js is added to the folder, that will be served to clients without any need for recompile/restart.

Understate answered 14/1, 2015 at 14:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.