20

My website is working fine on localhost when @Scripts.Render() is not bundling the scripts however when I deploy to my server the bundled Javascript must contain an error as all Javascript on my page stops working.

Here is my bundle code:

        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"));
        }

Here is my rendering code:

@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")

Can someone explain what might be happening to my Javascript upon deployment?

Thanks, Alex.

4

4 回答 4

23

您还可以将“新 ScriptBundle”更改为“新 Bundle”:

bundles.Add(new Bundle("~/bundles/modernizr").Include("~/Scripts/modernizr-*"));

这将在不缩小的情况下捆绑您的资产。我遇到了一些情况,缩小只是不适用于某些库,所以这仍然允许你将它们包含在你的包中。

于 2013-02-22T16:57:30.383 回答
8

即使出现错误,缩小也“有效”

真正的解决方案是:

  • 在发布之前排除 .min 和 .map 文件

并且缩小将起作用。事实上,缩小过程总是有效的!

如果“它有效”,它到底是怎么回事:为什么我们会出错?

与启用的优化捆绑时,ASP.Net 似乎优先使用 .min 文件。因此,它还将在 .min 文件中集成任何代码,并在不添加换行符的情况下一个接一个地附加每个 javascript 文件。

浏览器无法理解为什么会有潜在的注释 /* 在最小映射配置之后: //# 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 文件创建单独的捆绑包(就像不激活捆绑功能一样)。
  • 创建一个不会启用缩小的捆绑包(坏)
  • 或替代方案:排除所有缩小文件或具有 sourceMappingURL(或更改其源)和 .map 文件的 min.js 文件

目标是强制 ASP.Net 自己重新生成 min 文件(并且 ASP.Net 不会在其生成的文件中生成 //sourceMappingUrl,因此它将解决该问题)。

所以真正的问题是这个特性在浏览器中的当前实现,因为它似乎无法解析源映射注释的注释。也许还有另一种方式来指示浏览器 sourceMappingUrl 已经结束。

于 2013-11-29T10:17:59.617 回答
8

通常调试和部署的包之间的唯一区别是在调试时优化被关闭。

打开优化时,缩小可能会突出显示语法错误,如果有换行符,则可以原谅。例如:

var x = 10
var y = 15

未缩小,这可能会起作用 - 但缩小后你最终会得到......

var x = 10 var y = 15 // SyntaxError: missing ; before statement

这不起作用 - 你需要;那里缺少的字符。

如果您调试脚本,您应该能够看到错误在哪里。

于 2013-01-17T14:31:42.160 回答
0

检查此解决方案
IIS Config>Authentication>RightClickOn Anonymous Auth>Click Edit> Check Application pool identity

取自这里

于 2013-10-23T14:20:59.013 回答