ASP.NET MVC 4脚本捆绑在部署时导致错误
当@Scripts.Render()
没有捆绑脚本时,我的网站在localhost上工作正常但是当我部署到我的服务器时,捆绑的Javascript必须包含错误,因为我页面上的所有Javascript都停止工作。
这是我的包代码:
public static void RegisterBundles(BundleCollection bundles) { bundles.Add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js", "~/Scripts/jquery-migrate-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( "~/Scripts/jquery.unobtrusive*", "~/Scripts/jquery.validate*")); bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include( "~/Scripts/jquery-ui-{version}.js", "~/Scripts/jquery-ui.unobtrusive-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/modernizr").Include( "~/Scripts/modernizr-*")); bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css")); bundles.Add(new StyleBundle("~/Content/themes/base/css").Include( "~/Content/themes/base/jquery.ui.core.css", "~/Content/themes/base/jquery.ui.resizable.css", "~/Content/themes/base/jquery.ui.selectable.css", "~/Content/themes/base/jquery.ui.accordion.css", "~/Content/themes/base/jquery.ui.autocomplete.css", "~/Content/themes/base/jquery.ui.button.css", "~/Content/themes/base/jquery.ui.dialog.css", "~/Content/themes/base/jquery.ui.slider.css", "~/Content/themes/base/jquery.ui.tabs.css", "~/Content/themes/base/jquery.ui.datepicker.css", "~/Content/themes/base/jquery.ui.progressbar.css", "~/Content/themes/base/jquery.ui.theme.css")); }
这是我的渲染代码:
@Styles.Render("~/Content/css") @Styles.Render("~/Content/themes/base/css") @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/jqueryval") @Scripts.Render("~/bundles/jqueryui") @Scripts.Render("~/bundles/modernizr")
有人可以解释部署时我的Javascript可能会发生什么吗?
谢谢,Alex。
您还可以将“新ScriptBundle”更改为“new Bundle”:
bundles.Add(new Bundle("~/bundles/modernizr").Include("~/Scripts/modernizr-*"));
这将捆绑您的资产而不会缩小。 我遇到过一些情况,其中缩小只是不适用于某些库,所以这仍然允许你将它们包含在你的包中。
通常,调试和部署捆绑包之间的唯一区别是在调试时会关闭优化。
当打开优化时,缩小可以突出显示语法错误,如果存在换行符,则会被忽略。 例如:
var x = 10 var y = 15
没有贬义,这可能会奏效 – 但最终会缩小你…
var x = 10 var y = 15 // SyntaxError: missing ; before statement
哪个不行 – 你需要失踪;
那里的人物。
如果您调试脚本,您应该能够看到错误的位置。
即使出现错误,缩小“仍然有效”
真正的解决方案是:
- 在发布之前排除.min和.map文件
缩小将起作用。 事实上,缩小过程始终有效!
如果“它有效”,它究竟发生了什么:为什么我们有错误?
在捆绑启用的优化时,ASP.Net似乎优先使用.min文件。 因此,它还将在.min文件中集成任何代码,并依次附加每个javascript文件而不添加换行符。
浏览器无法理解为什么存在潜在的注释/ *在min映射配置之后://#sourceMappingURL = jquery.history.min.js.map因为捆绑的文件看起来像:
[SOMEJAVASCRIPT OF FILEJAVASCRIPT1 HERE;] //# sourceMappingURL=jquery.history.min.js.map /* begin of a comment of FILEJAVASCRIPT2 appended (in the bundle) javascript file */
有两种解决方案可以避免这种错误:
- 为无法遵循的javascript文件创建单独的包(就像不激活捆绑function一样)。
- 创建一个不会启用缩小的包(坏)
- 或者替代方法:排除所有缩小文件或具有sourceMappingURL(或更改其源代码)和.map文件的min.js文件
目标是强制ASP.Net自己重新生成min文件(并且ASP.Net不会在其生成的文件中生成// sourceMappingUrl,因此它将解决该问题)。
所以真正的问题是浏览器中当前这个function的实现,因为它似乎无法解析sourcemapping注释的注释。 也许有另一种方式来指示浏览器sourceMappingUrl已经结束。
检查此解决方案
IIS配置>身份validation> RightClickOn匿名身份validation>单击“编辑”>“检查应用程序池身份”
从这里开始 。