可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a weird issue with the mvc4 bundler not including files with extension .min.js
In my BundleConfig class, I declare
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle(\"~/Scripts/jquery\")
.Include(\"~/Scripts/jquery-1.8.0.js\")
.Include(\"~/Scripts/jquery.tmpl.min.js\"));
}
In my view, I declare
<html>
<head>
@Scripts.Render(\"~/Scripts/jquery\")
</head><body>test</body>
</html>
And when it renders, it only renders
<html>
<head>
<script src=\"/Scripts/jquery-1.8.0.js\"></script>
</head>
<body>test</body>
</html>
If I rename the jquery.tmpl.min.js to jquery.tmpl.js (and update the path in the bundle accordingly), both scripts are rendered correctly.
Is there some config setting that is causing it to ignore \'.min.js\' files?
回答1:
The solution I originally posted is questionable (is a dirty hack). The tweaked behaviour has changed in Microsoft.AspNet.Web.Optimization package and the tweak does not work anymore, as pointed out by many commenters. Right now I cannot reproduce the issue at all with the version 1.1.3 of the package.
Please see sources of System.Web.Optimization.BundleCollection (you can use dotPeek for example) for better understanding of what you are about to do.
Also read Max Shmelev\'s answer.
Original answer:
Either rename .min.js to .js or do something like
public static void AddDefaultIgnorePatterns(IgnoreList ignoreList)
{
if (ignoreList == null)
throw new ArgumentNullException(\"ignoreList\");
ignoreList.Ignore(\"*.intellisense.js\");
ignoreList.Ignore(\"*-vsdoc.js\");
ignoreList.Ignore(\"*.debug.js\", OptimizationMode.WhenEnabled);
//ignoreList.Ignore(\"*.min.js\", OptimizationMode.WhenDisabled);
ignoreList.Ignore(\"*.min.css\", OptimizationMode.WhenDisabled);
}
public static void RegisterBundles(BundleCollection bundles)
{
bundles.IgnoreList.Clear();
AddDefaultIgnorePatterns(bundles.IgnoreList);
//NOTE: it\'s bundles.DirectoryFilter in Microsoft.AspNet.Web.Optimization.1.1.3 and not bundles.IgnoreList
//...your code
}
回答2:
Microsoft implies the following behavior (and I prefer to follow it in my projects):
short version
- You have both debug and minified versions of a script in your project under the same folder:
- You add only script.js to a bundle in your code.
As a result you will automatically have the script.js included in DEBUG mode and script.min.js in RELEASE mode.
long version
You can have also .debug.js version. In that case the file is included in the following priority in DEBUG:
- script.debug.js
- script.js
in RELEASE:
- script.min.js
- script.js
note
And by the way, the only reason to have a .min versions of your scripts in MVC4 is the case when the minified version can not be processed automatically. For example the following code can not be obfuscated automatically:
if (DEBUG) console.log(\"Debug message\");
In all the other cases you can go with just a debug version of your script.
回答3:
If all you have is a minified version of a file, the simplest solution I\'ve found is to copy the minified file, remove .min from the copied file\'s name, then reference the non-minified file name in your bundle.
For example, let\'s say you purchased a js component and they gave you a file called some-lib-3.2.1.min.js. To use this file in a bundle, do the following:
Copy some-lib-3.2.1.min.js and rename the copied file to some-lib-3.2.1.js. Include both files in your project.
Reference the non-minified file in your bundle, like this:
bundles.Add(new ScriptBundle(\"~/bundles/libraries\").Include(
\"~/Scripts/some-lib-{version}.js\"
));
Just because the file without \'min\' in the name is actually minified shouldn\'t cause any issues (other than the fact it\'s essentially unreadable). It\'s only used in debug mode and gets written out as a separate script. When not in debug mode the pre-compiled min file should be included in your bundle.
回答4:
I have found a good solution that works at least in MVC5, you can just use Bundle
instead of ScriptBundle
. It does not have the smart behavior of ScriptBundle
that we don\'t like (ignoring .min, etc.) in this case. In my solution I use Bundle
for 3d party scripts with .min and .map files and I use ScriptBundle
for our code. I have not noticed any drawbacks of doing it. To make it work this way you will need to add original file e.g. angular.js, and it will load angular.js in debug and it will bundle the angular.min.js in release mode.
回答5:
To render *.min.js
files, you must disable BundleTable.EnableOptimizations
, which is a global setting that applies to all bundles.
If you want to enable optimizations for specific bundles only, you can create your own ScriptBundle
type that temporarily enables optimizations when enumerating files in the bundle.
public class OptimizedScriptBundle : ScriptBundle
{
public OptimizedScriptBundle(string virtualPath)
: base(virtualPath)
{
}
public OptimizedScriptBundle(string virtualPath, string cdnPath)
: base(virtualPath, cdnPath)
{
}
public override IEnumerable<BundleFile> EnumerateFiles(BundleContext context)
{
if (context.EnableOptimizations)
return base.EnumerateFiles(context);
try
{
context.EnableOptimizations = true;
return base.EnumerateFiles(context);
}
finally
{
context.EnableOptimizations = false;
}
}
}
Use OptimizedScriptBundle
instead of ScriptBundle
for bundles whose minified file should always be used, regardless of whether a non-minified file exists.
Example for Kendo UI for ASP.NET MVC, which is distributed as a collection of only minified files.
bundles.Add(new OptimizedScriptBundle(\"~/bundles/kendo\")
.Include(
\"~/Scripts/kendo/kendo.all.*\",
\"~/Scripts/kendo/kendo.aspnetmvc.*\",
\"~/Scripts/kendo/cultures/kendo.*\",
\"~/Scripts/kendo/messages/kendo.*\"));
回答6:
For my case, I was using the (wonderful!) Knockout.js library which comes as Debug/Non versions:
\"~/Scripts/knockout-{Version}.js\"
\"~/Scripts/knockout-{Version}.Debug.js\"
To make this work, I included \"Knockout-{Version}.js\" (non-debug) in my Bundle and got the .debug. js file in Debug mode.
回答7:
An easy way just Rename the .min file for example you have abc.min.css than just rename this file to abc_min.css and add this to your bundle. I know its not the right way to do it, but just a temporary solution. thanks and happy coding.
回答8:
Bundler have a lot of benefits check this page BUT:
The Microsoft MVC4 Platform Considers that you have at least both minified version & unminified version for each Script or Style Bundle(another files like Debug and vsdoc are available too). So We have trouble in situations that there is only one of these files.
You can change debug state in web.config file permanently to handle output:
<compilation debug=\"false\" targetFramework=\"4.0\" />
See the output changes! File filtering changed. To meet the purpose we must change ignore case filtration that will change application logic!
回答9:
Folks
I would just keep it simply until Microsoft gets it act together
Try this
In RegisterBundles create this bundle for Kendo
bundles.Add(new StyleBundle(\"~/Content/kendo/css\").Include(
\"~/Content/kendo/2012.3.1121/kendo.common.min.css\",
\"~/Content/kendo/2012.3.1121/kendo.dataviz.min.css\",
\"~/Content/kendo/2012.3.1121/kendo.blueopal.min.css\"
));
In _Layout.cshtml put this:
@if (HttpContext.Current.IsDebuggingEnabled)
{
<link href=\"@Url.Content(\"~/Content/kendo/2012.3.1121/kendo.common.min.css\")\"
rel=\"stylesheet\" type=\"text/css\" />
<link href=\"@Url.Content(\"~/Content/kendo/2012.3.1121/kendo.dataviz.min.css\")\"
rel=\"stylesheet\" type=\"text/css\" />
<link href=\"@Url.Content(\"~/Content/kendo/2012.3.1121/kendo.blueopal.min.css\")\"
rel=\"stylesheet\" type=\"text/css\" />
}
else
{
@Styles.Render(\"~/Content/kendo/css\")
}
This way we get best of bundles in Production and a reference in Debug
Fix it up when Microsoft fixes their MVC 4 Code