【问题标题】:How to avoid CSS and bundling hell?如何避免 CSS 和捆绑地狱?
【发布时间】:2020-10-15 06:49:21
【问题描述】:

我开发的每个 asp.net MVC 网站都有同样的问题,所以我想知道是否有解决方案。

该网站在我开发时运行良好,但是,当我发布该网站时,我总是遇到捆绑问题。为了解决这个问题,我必须禁用优化。

首先,捆绑将所有捆绑的 CSS 合并到 ~\Content 文件夹中的一个文件中,即使一个捆绑中的所有 CSS 都位于子目录中。结果是从 CSS 引用的图像丢失了,因为它们具有相对 URL。

第二个问题是,由于某些奇怪的原因,JS 捆绑系统不希望所有 JS 都在同一个文件中,因为 JS 文件在捆绑时会报告错误,并且站点根本无法运行。

这是我的 BundleConfig.cs 文件。如果我最后删除BundleTable.EnableOptimizations = false;,则没有任何效果。出现很多 Javascript 错误。

    public static void RegisterBundles(BundleCollection bundles)
    {
        if (bundles != null)
        {
            bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery-{version}.js"));

            bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                        "~/Scripts/jquery.validate*"));

            // Use the development version of Modernizr to develop with and learn from. Then, when you're
            // ready for production, use the build tool at http://modernizr.com to pick only the tests you need.
            bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                        "~/Scripts/modernizr-*"));

            bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
                      "~/Scripts/umd/popper.js",
                      "~/Scripts/bootstrap.js"));

            bundles.Add(new ScriptBundle("~/bundles/custom").Include(
                        "~/Scripts/custom.js"));

            bundles.Add(new StyleBundle("~/Content/css").Include(
                    "~/Content/site.css",
                    "~/Content/site/style.css"));

            bundles.Add(new StyleBundle("~/Content/waitMe").Include(
                    "~/Content/waitMe.css"));

            bundles.Add(new ScriptBundle("~/bundles/waitMe").Include(
                    "~/Scripts/waitMe.js"));

            bundles.Add(new StyleBundle("~/Content/sweetalert").Include(
                   "~/Content/sweetalert2.min.css"));

            bundles.Add(new ScriptBundle("~/bundles/sweetalert").Include(
                    "~/Scripts/sweetalert2/sweetalert2.all.min.js"));

            bundles.Add(new ScriptBundle("~/bundles/bundle").Include(
                      "~/Scripts/bundle.js"));

            bundles.Add(new ScriptBundle("~/bundles/moment").Include(
                      "~/Scripts/moment-with-locales.js"));

            bundles.Add(new ScriptBundle("~/bundles/mask").Include(
                "~/Scripts/jquery.inputmask.js"));

            bundles.Add(new StyleBundle("~/Content/daterangepicker").Include(
                    "~/Content/daterangepicker.css"));

            bundles.Add(new ScriptBundle("~/bundles/daterangepicker").Include(
                    "~/Scripts/daterangepicker.js"));

            bundles.Add(new StyleBundle("~/Content/select2").Include(
                "~/Content/select2.css"));

            bundles.Add(new ScriptBundle("~/bundles/select2").Include(
                    "~/Scripts/select2.js",
                    "~/Scripts/i18n/es.js"));

            bundles.Add(new StyleBundle("~/Content/tapatar").Include(
                    "~/Content/tapatar.css"));

            bundles.Add(new ScriptBundle("~/bundles/tapatar").Include(
                    "~/Scripts/tapatar.js"));

            bundles.Add(new ScriptBundle("~/bundles/assets").Include(
                    "~/Scripts/canvas.js",
                    "~/Scripts/collapse.js",
                    "~/Scripts/settings.js",
                    "~/Scripts/template.js",
                    "~/Scripts/default-assets/active.js"));

            bundles.Add(new StyleBundle("~/Content/grid").Include(
                      "~/Scripts/DataTables/DataTables-1.10.20/css/dataTables.bootstrap4.css",
                      "~/Scripts/DataTables/FixedColumns-3.3.0/css/fixedColumns.bootstrap4.css",
                      "~/Scripts/DataTables/Responsive-2.2.3/css/responsive.bootstrap4.css",
                      "~/Scripts/DataTables/Scroller-2.0.1/css/scroller.bootstrap4.css",
                      "~/Scripts/DataTables/Select-1.3.1/css/select.bootstrap4.css",
                      "~/Scripts/DataTables/RowGroup-1.1.1/css/rowGroup.bootstrap4.css"));

            bundles.Add(new ScriptBundle("~/bundles/grid").Include(
                      "~/Scripts/DataTables/DataTables-1.10.20/js/jquery.dataTables.js",
                      "~/Scripts/DataTables/DataTables-1.10.20/js/dataTables.bootstrap4.js",
                      "~/Scripts/DataTables/FixedColumns-3.3.0/js/dataTables.fixedColumns.js",
                      "~/Scripts/DataTables/Responsive-2.2.3/js/dataTables.responsive.js",
                      "~/Scripts/DataTables/Scroller-2.0.1/js/dataTables.scroller.js",
                      "~/Scripts/DataTables/Select-1.3.1/js/dataTables.select.js",
                      "~/Scripts/DataTables/RowGroup-1.1.1/js/dataTables.rowGroup.js",
                      "~/Scripts/DataTables/dataTables.datetime.js"));

            bundles.Add(new ScriptBundle("~/bundles/editor").Include(
                    "~/Scripts/tinymce/tinymce.js"));

            bundles.Add(new StyleBundle("~/Content/imageuploader").Include(
                    "~/Content/ssi-uploader.css"));

            bundles.Add(new ScriptBundle("~/bundles/imageuploader").Include(
                    "~/Scripts/ssi-uploader.js"));

            bundles.Add(new StyleBundle("~/Content/popup").Include(
                    "~/Content/magnific-popup.css"));

            bundles.Add(new ScriptBundle("~/bundles/popup").Include(
                    "~/Scripts/jquery.magnific-popup.js",
                    "~/Scripts/i18n/jquery.magnific-popup.es.js"));

            bundles.Add(new ScriptBundle("~/bundles/fileinput").Include(
                    "~/Scripts/fileinput.js",
                    "~/Scripts/locales/es.js",
                    "~/Content/bootstrap-fileinput/themes/fas/theme.js"
                    ));

            bundles.Add(new StyleBundle("~/Content/fileinput").Include(
                    "~/Content/bootstrap-fileinput/css/fileinput.css"));

            bundles.Add(new StyleBundle("~/Content/toastr").Include(
                    "~/Content/toastr.min.css"));

            bundles.Add(new ScriptBundle("~/bundles/toastr").Include(
                    "~/Scripts/toastr.js"));

            bundles.Add(new ScriptBundle("~/bundles/cleave").Include(
                    "~/Scripts/cleave.js"));

            bundles.Add(new StyleBundle("~/Content/summernote").Include(
                    "~/Content/summernote/summernote-bs4.css"));

            bundles.Add(new ScriptBundle("~/bundles/summernote").Include(
                    "~/Scripts/summernote/summernote-bs4.js",
                    "~/Scripts/summernote/lang/summernote-es-ES.js"
                    ));

            bundles.Add(new ScriptBundle("~/bundles/apexcharts").Include(
                    "~/Scripts/apexcharts/apexcharts.js"));

            bundles.Add(new ScriptBundle("~/bundles/pace").Include(
                    "~/Scripts/inicio/pace.min.js"));

            bundles.Add(new ScriptBundle("~/bundles/home").Include(
                    "~/Scripts/inicio/jquery-2.1.3.min.js",
                    "~/Scripts/inicio/plugins.js",
                    "~/Scripts/inicio/main.js"));

            bundles.Add(new StyleBundle("~/Content/home").Include(
                    "~/Content/inicio/base.css",
                    "~/Content/inicio/vendor.css",
                    "~/Content/inicio/main.css"));

            bundles.Add(new ScriptBundle("~/bundles/paises").Include(
                    "~/Scripts/paises/cl/jquery.rut.js"));

            bundles.Add(new StyleBundle("~/Content/datepicker").Include(
                    "~/Content/bootstrap-datepicker.css"));

            bundles.Add(new ScriptBundle("~/bundles/datepicker").Include(
                    "~/Scripts/bootstrap-datepicker.js",
                    "~/Scripts/bootstrap-datepicker.es.js"
                    ));

            bundles.Add(new StyleBundle("~/Content/timepicki").Include(
                    "~/Content/timepicki.css"));

            bundles.Add(new ScriptBundle("~/bundles/timepicki").Include(
                    "~/Scripts/timepicki.js"
                    ));

            bundles.Add(new StyleBundle("~/Content/fileinput").Include(
                    "~/Content/fileinput/css/fileinput.css"));

            bundles.Add(new ScriptBundle("~/bundles/fileinput").Include(
                            "~/Scripts/fileinput/fileinput.js",
                            "~/Scripts/fileinput/locales/es.js",
                            "~/Scripts/fileinput/themes/fa/theme.js"));

            bundles.Add(new ScriptBundle("~/bundles/clock").Include(
                            "~/Scripts/jclock.js"));

            bundles.Add(new ScriptBundle("~/bundles/tinymce").Include(
                            "~/Scripts/tinymce/tinymce.js",
                            "~/Scripts/tinymce/langs/es_MX.js"));

            BundleTable.EnableOptimizations = false;
        }

有没有避免这一切地狱的好习惯?

詹姆

【问题讨论】:

    标签: asp.net-mvc bundling-and-minification


    【解决方案1】:

    您必须在捆绑时使用 CssRewriteUrlTransform,以便将相对图像路径(相对于 css 文件位置)转换为来自网站根目录的绝对路径。下面是一个例子:

    bundles.Add(new StyleBundle("~/Content/fileinput").Include("~/Content/fileinput/css/fileinput.css", new CssRewriteUrlTransform()));
    
     
    

    【讨论】:

    • 谢谢。由于包含了很多 CSS,我想我可以只实例化一次 CssRewriteUrlTransform 并在包含的每个 CSS 中使用该实例,对吧?而且,JS 呢?将它们捆绑在一起可能会出现什么问题?
    • 您需要为每个 css 文件传递​​一个 CssRewriteUrlTransform 的新实例。在这里查看答案:stackoverflow.com/questions/27277614/…
    • 对于 javascript,最好在脚本所在的同一级别准备捆绑包。
    猜你喜欢
    • 2017-05-08
    • 2017-08-18
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多