【问题标题】:Style bundling for MVC4 not using min filesMVC4 的样式捆绑不使用最小文件
【发布时间】:2023-03-30 21:03:01
【问题描述】:

我有 4 个文件:

  • a.css
  • a.min.css
  • b.css
  • b.min.css

它们通过以下方式添加到捆绑包中:

bundles.Add(new StyleBundle("~/Content/acss").Include("~/Content/a.css", "~/Content/b.css"));

在调试中运行应用程序时,一切都正确呈现:

 <link href="/Content/a.css" rel="stylesheet"/>
 <link href="/Content/b.css" rel="stylesheet"/>

但是,在发布版本中运行时,我以以下方式呈现它:

 <link href="/Content/acss?v=mUdXE7_fXKjICzE_XteIB1Igy6TekX1QFh-BtY6fFUw1" rel="stylesheet"/>

我在里面创立:

/* 缩小失败。返回未缩小的内容。 (24,708):运行时错误 CSS1030:预期标识符,找到 '.'

所以我有两个问题:

  1. 为什么它不能根据在线文档工作?所有信息都说如果发布版本可用,它会选择最小文件?
  2. 如何使其按照文档工作?

【问题讨论】:

  • “为什么它不能根据在线文档工作?” “如何使它根据文档工作?” - 你在看哪些文档?
  • CSS1030: Expected identifier, found '.' 看起来你的 css 中有错误,可能会导致缩小失败。
  • @ZippyV 缩小不适用于某些浏览器特定标签。而且问题与错误无关,而是与为什么捆绑不使用 min 文件有关,该文件已经在文件夹中。
  • @Pluc,我错过了这个问题,并在你的答案下方回答。

标签: c# asp.net-mvc


【解决方案1】:

你看过Bundle Transformer吗,1.6.5 version 引入了一个名为 usePreMinifiedFiles 的属性,它可以启用/禁用预压缩文件的使用。

你设置BundleTable.EnableOptimizations = true;

来自documentation

注意:除非 EnableOptimizations 为 true 或 Web.config 文件中的编译元素设置为 false,文件 不会被捆绑或缩小。此外,.min 版本的 将不使用文件,将选择完整的调试版本。 EnableOptimizations 覆盖编译中的调试属性 Web.config 文件中的元素

【讨论】:

  • 不,还没有,在我开始使用 3rd 方工具之前,我想得到一个答案,为什么捆绑不能根据文档工作。
  • 你可以尝试使用更长的命名css,例如apple.css和banana.css。只是想知道是否与某些缩小的变量 a 或 b 发生冲突。当然,这是完全的猜测,也许与此不符。
  • 这只是一个例子。我的文件实际上被称为:myfile.common.cssmyfile.layout.all.cssmyfile.common.min.cssmyfile.layout.all.min.css
  • 啊,这可以解释。尝试重命名以排除“。”。即重命名为 myfileCommmon.css 和 myfileCommon.min.css 以及布局
  • 破折号也可以,这对您来说可能更好(myfile-common 等),但请先尝试上述方法。
【解决方案2】:

您的实际问题无法回答,因为它已经充当文档状态(这就是为什么我问您正在查看什么文档,但您选择忽略我的评论)。

如果您想在发布模式下保持相同的行为,请在您的 Global.asax 中使用 BundleTable.EnableOptimizations = false;。这将关闭仅在调试模式下有效的捆绑和缩小。然后使用您自己的缩小 css / js 文件,只需将您的包路径指向缩小版本。

根据文档,您还可以使用"~/Content/a{version}.css",它将在调试模式下使用非缩小版本,在发布时使用缩小版本。但是,我没有尝试过。

【讨论】:

  • 我没有忽略你的评论。我没有看到你提出任何问题。我能看到的唯一一个与文件名中的点有关。也许我是盲人,但看不到任何问题。现在回答它,[这里是] (asp.net/mvc/tutorials/mvc-4/bundling-and-minification) 我看过的地方。有以下声明: 捆绑框架遵循几个常见的约定,例如: 当“FileX.min.js”和“FileX.js”存在时选择“.min”文件进行发布。选择非“.min”版本进行调试。
  • 请阅读您在提供的链接上发布的报价后的 5 行。这也是我找到发布此回复的信息的地方,但您没有按照该教程中提到的内容进行操作。
  • 我将文件更改为模式:a-1.css、a-1.min.css 并将 bundle 替换为 a-{version}.css 并且行为更糟。因为它根本不渲染,既不调试也不发布。
【解决方案3】:

我遇到了与您完全相同的问题,我的解决方案包含 css/js 文件以及我使用 Web Essentials 最小化的 .min 文件。

如果我在调试模式下使用捆绑包,一切都会正常工作,并且所有单独的非最小化文件都会加载到我的应用程序中。但是,如果我设置BundleTable.EnableOptimizations = true;,我会收到错误,因为它无法最小化我的文件。

基于http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification 声明:

对于 ASP.NET MVC 4,这意味着使用调试配置,文件 jquery-1.7.1.js 将被添加到包中。在一个版本中 配置,jquery-1.7.1.min.js 将被添加。捆绑 框架遵循几个常见的约定,例如:

“FileX.min.js”和“FileX.js”时选择“.min”文件发布 存在。选择非“.min”版本进行调试。

我希望它可以简单地加载我已经最小化的文件并将它们捆绑在一起。我认为文档中隐含但缺少的是,它还会再次最小化我已经最小化的文件,这些文件不起作用并导致输出错误。

我发现http://aspnetoptimization.codeplex.com/workitem/56 提到:

您可以简单地通过创建捆绑包来跳过缩小 转换,即不创建 ScriptBundle,只创建普通 Bundle。

结果证明这是我的问题的答案。通过将我的ScriptBundleStyleBundle 都设置为只输入Bundle,我现在可以在没有最小化的情况下获得正确的捆绑。

在调试中,我所有的常规 css/jss 文件都是单独加载的。当我将其设置为非调试时,所有内容都被捆绑并自动选择所有 .min 文件。

【讨论】:

  • 将 ScriptBundle 和 StyleBundle 更改为常规 Bundle 为我做到了。但是,为什么微软在加载 jquery-{version}.js 和 jquery-{version}-min.js 时默认不在默认 mvc 项目中使用 Bundle?
  • 谢谢!似乎主要的怪癖是它正在最小化 .min 文件。
  • 如果您想要一个使用现有最小文件(如果可用)的单个捆绑包,或者使用 ASP.NET:s 缩小来最小化,该怎么办?
猜你喜欢
  • 2012-09-24
  • 2012-11-20
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多