ارتقاء به ASP.NET Core 1.0 - قسمت 21 - بررسی تغییرات Bundling و Minification
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: چهار دقیقه

زیرساخت یکی کردن و فشرده سازی اسکریپت‌ها و فایل‌های CSS نگارش پیشین ASP.NET MVC، به طور کامل از ASP.NET Core حذف شده‌است. در ابتدا (تا نگارش RC2)، روش استفاده‌ی از Gulp را توصیه کردند و در زمان ارائه‌ی نگارش RTM، توصیه‌ی رسمی آن‌ها به Bundler Minifier تغییر کرد (و دیگر Gulp را توصیه نمی‌کنند).


یکی کردن و فشرده سازی فایل‌های استاتیک در ASP.NET Core

هدف از یکی کردن و فشرده سازی فایل‌های استاتیک مانند اسکریپت‌ها و فایل‌های CSS، بهبود کارآیی برنامه با کاهش حجم نهایی ارائه‌ی آن و همچنین کاهش تعداد رفت و برگشت‌های به سرور برای دریافت فایل‌های متعدد مرتبط به آن است. در عملیات Bundling، چندین فایل، به یک تک فایل تبدیل می‌شوند تا اتصالات مرورگر به وب سرور، جهت دریافت آن‌ها به نحو چشمگیری کاهش پیدا کند و در عملیات Minification، مراحل متعددی بر روی کدهای نوشته شده صورت می‌گیرد تا حجم نهایی آن‌ها کاهش پیدا کنند. مایکروسافت در ASP.NET Core RTM، ابزاری را به نام BundlerMinifier.Core جهت برآورده کردن این اهداف ارائه کرده‌است. بنابراین اولین قدم، نصب وابستگی‌های آن است.
برای اینکار یک سطر ذیل  را به فایل project.json اضافه کنید. این بسته باید به قسمت tools اضافه شود تا قابلیت فراخوانی از طریق خط فرمان را نیز پیدا کند:
"tools": {
    "BundlerMinifier.Core": "2.1.258"
},
در غیر اینصورت (ذکر آن در قسمت dependencies) خطاهای ذیل را دریافت خواهید کرد:
No executable found matching command "dotnet-bundle"
Version for package `BundlerMinifier.Core` could not be resolved.


اسکریپت نویسی برای کار با BundlerMinifier.Core

روش‌های زیادی برای کار با ابزار BundlerMinifier.Core وجود دارند؛ منجمله انتخاب فایل‌ها در solution explorer و سپس کلیک راست بر روی فایل‌های انتخاب شده و انتخاب گزینه‌ی bundler & minifier برای یکی کردن و فشرده سازی خودکار این فایل‌ها. برای این منظور افزونه‌ی Bundler & Minifier را نیاز است نصب کنید.
اما روشی که قابلیت خودکارسازی را دارد، استفاده از فایل ویژه‌ی bundleconfig.json این ابزار است. برای این منظور فایل جدید bundleconfig.json را به ریشه‌ی پروژه اضافه کرده و سپس محتوای ذیل را به آن اضافه کنید:
[
    {
        "outputFileName": "wwwroot/css/site.min.css",
        "inputFiles": [
            "wwwroot/css/site.css"
        ]
    },
    {
        "outputFileName": "wwwroot/js/site.min.js",
        "inputFiles": [
            "bower_components/jquery/dist/jquery.min.js",
            "bower_components/jquery-validation/dist/jquery.validate.min.js",
            "bower_components/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
        ],
        "minify": {
            "enabled": true,
            "renameLocals": true
        },
        "sourceMap": false
    }
]
فرمت این فایل بسیار خوانا است. برای مثال در یک مدخل آن، در ذیل خاصیت inputFiles، لیست فایل‌های css ذکر می‌شوند و سپس در outputFileName، محل نهایی فایل تولیدی باید ذکر شود. این محل نیز باید از پیش وجود داشته باشد. یعنی باید پوشه‌های js و css را در پوشه‌ی عمومی wwwroot پیشتر ایجاد کرده باشید.
با ذخیره سازی این فایل، کار یکی سازی و فشرده کردن مداخل آن به صورت خودکار صورت خواهد گرفت.


خودکار سازی فرآیند یکی کردن و فشرده سازی فایل‌های استاتیک

برای خودکار سازی این فرآیند، می‌توان به صورت زیر عمل کرد. فایل project.json را گشوده و قسمت scripts آن‌را به نحو ذیل تغییر دهید:
"scripts": {
    "precompile": [
        "dotnet bundle"
    ],
    "prepublish": [
        "bower install"
    ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
روش دستی کار با ابزار BundlerMinifier، مراجعه به خط فرمان و صدور دستور dotnet bundle است (ابتدا از طریق خط فرمان به ریشه‌ی پروژه وارد شده و سپس این دستور را صادر کنید). برای خودکار سازی آن می‌توان این دستور را در قسمت scripts فایل project.json نیز ذکر کرد تا پیش از کامپایل برنامه، کار یکی کردن، فشرده سازی و همچنین کپی فایل نهایی به پوشه‌ی wwwroot برنامه به صورت خودکار انجام شود.

یک نکته: به منوی Build گزینه‌ی Update all bundles نیز با نصب افزونه‌ی Bundler & Minifier اضافه می‌شود. همچنین اگر از منوی Tools گزینه‌ی Task runner explorer را انتخاب کنید، فایل bundleconfig.json توسط آن شناسایی شده و گزینه‌ی update all files را نیز در اینجا مشاهده خواهید کرد.



ساده سازی تعاریف فایل Layout برنامه

در یک چنین حالتی دیگر نباید در فایل layout شما، ارجاعات مستقیمی به پوشه‌ی مثلا bower_components وجود داشته باشند و یا در کلاس آغازین برنامه، نیازی نیست تا این پوشه را عمومی کنید. لیست مداخلی را که نیاز دارید، به ترتیب از پوشه‌های مختلفی تهیه و در فایل bundleconfig.json ذکر کنید تا یکی شده و خروجی js/site.min.js را تشکیل دهند. این مورد تنها مدخلی است که نیاز است در فایل layout برنامه ذکر شود (بجای چندین و چند مدخل مورد نیاز):
 <script src="~/js/site.min.js" asp-append-version="true" type="text/javascript"></script>
در مورد ویژگی asp-append-version نیز پیشتر در مطلب «ارتقاء به ASP.NET Core 1.0 - قسمت 12 - معرفی Tag Helpers» بحث شد و به آن مکانیزم cache busting می‌گویند. این ویژگی سبب خواهد شد تا یک کوئری استرینگ v=xyz? مانند، به انتهای آدرس اسکریپت یا فایل css یا هر فایل استاتیک دیگری اضافه شود. با تغییر محتوای این فایل، قسمت xyz به صورت خودکار تغییر خواهد کرد و به این ترتیب مرورگر همواره آخرین نگارش این فایل را دریافت می‌کند.
  • #
    ‫۸ سال و ۲ ماه قبل، یکشنبه ۱۰ مرداد ۱۳۹۵، ساعت ۲۰:۴۹
    در فایل کانفیگ کلید:
    "sourceMap": false
    که با مقدار false تنظیم شده: 1- آیا برای شامل/غیرشامل کردن فایل‌های map هست یا به منظور دیگری است؟ 2- اگر ذکر نشود، پیشفرض true هست؟
    ممنون
    • #
      ‫۸ سال و ۲ ماه قبل، یکشنبه ۱۰ مرداد ۱۳۹۵، ساعت ۲۲:۰۸
      - برای کپی همان فایل‌های map هست.
      - پیش فرض آن false است.
  • #
    ‫۸ سال و ۲ ماه قبل، یکشنبه ۱۰ مرداد ۱۳۹۵، ساعت ۲۰:۵۴
    ضمنا برای صرفنظر کردن از کامنت فایل‌ها موقع minify کلید خاصی باید ست بشه؟ مثلا:
    "ignoreComments" : true
    • #
      ‫۸ سال و ۲ ماه قبل، یکشنبه ۱۰ مرداد ۱۳۹۵، ساعت ۲۲:۱۷
      {
          "outputFileName": "out.js",
          "inputFiles": [ "in.js" ],
          "minify": {
              "enabled": true,
              "preserveImportantComments": true
          }
      }
      برای فایل‌های css هم:
       {
          "outputFileName": "output/bundle.css",
          "inputFiles": [
            "css/lib/**/*.css", // globbing patterns are supported
            "css/input/site.css"
          ],
          "minify": {
              "enabled": true,
              "commentMode": "all"
          }
        },
      این تنظیمات را باید از فایل‌های سورس آن استخراج کرد. در اینجا و اینجا.
  • #
    ‫۷ سال و ۱۰ ماه قبل، سه‌شنبه ۹ آذر ۱۳۹۵، ساعت ۲۲:۴۱
    این که یک فایل نهایی ساخته شود خیلی عالیه هست اما چگونه با مشکل مناقشه (Conflict) کدها مقابله کنیم و یا چه استاندارد و ساختاری رو برای استفاده از افزونه‌های تهیه شده جی کوئری در نظر بگیریم ؟ و چطور پس از فشرده سازی به یک فایل نهایی صحت عملکرد کدها را ارزیابی کنیم؟
    • #
      ‫۷ سال و ۱۰ ماه قبل، سه‌شنبه ۹ آذر ۱۳۹۵، ساعت ۲۳:۱۵
      برای جاوا اسکریپت هم امکان نوشتن unit tests وجود دارد؛ برای مثال توسط Jasmine و یا QUnit 
  • #
    ‫۷ سال و ۸ ماه قبل، شنبه ۱۱ دی ۱۳۹۵، ساعت ۱۳:۰۴
    « Smidge »
    A lightweight runtime CSS/JavaScript file minification, combination, compression & management library for ASP.Net Core
  • #
    ‫۷ سال و ۶ ماه قبل، سه‌شنبه ۱۷ اسفند ۱۳۹۵، ساعت ۱۹:۵۹
    اگه داخل css یک فونت اضافه کنیم چون آدرسش تغییر میکنه دیگه امکان بارگذاری فایل مربوط به فونت نیست . برای حل این موضوع چه کاری باید انجام داد ؟ در ورژن قبل اگر اشتباه نکنم با CssRewriteUrlTransform     قابل حل بود .
    • #
      ‫۷ سال و ۶ ماه قبل، سه‌شنبه ۱۷ اسفند ۱۳۹۵، ساعت ۲۰:۴۹
      در پروژه DNTIdentity از فونت صمیم استفاده شده‌است. تنها کاری که برای استفاده‌ی از این قلم انجام شده‌است، کپی کردن فونت‌های آن به داخل پوشه‌ی wwwroot است. البته بدیهی است که کار عمومی کردن wwwroot را هم باید پیشتر انجام داده باشید. به علاوه اگر از IIS استفاده می‌کنید، تنظیمات وب کانفیگ مرتبطی را هم نیاز دارید. برای به روز رسانی‌های بعدی هم بهتر است مدخل bower آن‌را اضافه کنید.
      بنابراین اگر قلم شما در فایل css، آدرس fonts/Samim.eot/ را دارد، پوشه‌ی fonts را در داخل پوشه‌ی wwwroot ایجاد/کپی کنید.
  • #
    ‫۷ سال و ۶ ماه قبل، دوشنبه ۷ فروردین ۱۳۹۶، ساعت ۰۰:۴۰
    به روز رسانی
    با حذف فایل project.json در VS 2017، اکنون با کلیک راست بر روی گروه نام پروژه (فایل csproj)، گزینه‌ی Edit آن ظاهر شده و مداخل ذکر شده‌ی در مطلب فوق، چنین تعاریفی را پیدا می‌کنند: 
    <Project Sdk="Microsoft.NET.Sdk.Web">
      <Target Name="PrecompileScript" BeforeTargets="BeforeBuild">
        <Exec Command="dotnet bundle" />
      </Target>
    
      <ItemGroup>
        <DotNetCliToolReference Include="BundlerMinifier.Core" Version="2.2.301" />
      </ItemGroup>
    </Project>
    • #
      ‫۴ سال و ۶ ماه قبل، سه‌شنبه ۱۳ اسفند ۱۳۹۸، ساعت ۲۱:۰۶
      طبق مستندات dotnet در نسخه 3.1.102 ، باید پکیج BuildBundlerMinifier را نصب کرد و فایل bundleconfig.json را به پروژه اضافه کرد.
      • #
        ‫۴ سال و ۶ ماه قبل، سه‌شنبه ۱۳ اسفند ۱۳۹۸، ساعت ۲۳:۴۳
        الان دو روش برای کار با BundlerMinifier وجود دارد:
        - روش اول: همان روشی است که در این مطلب بحث شده و هنوز هم کار می‌کند:
        <DotNetCliToolReference Include="BundlerMinifier.Core" Version="2.6.362" />
        این روش امکان اجرای دستور dotnet bundle را که توسط PrecompileScript فوق ذکر شد، میسر می‌کند:
          <Target Name="PrecompileScript" BeforeTargets="BeforeBuild">
            <Exec Command="dotnet bundle" />
          </Target>
        - روش دوم: نصب بسته‌ی BuildBundlerMinifier است:
        dotnet add package BuildBundlerMinifier
        با نصب آن، دستور استاندارد dotnet build توسعه یافته و دیگر نیازی به تنظیم PrecompileScript فوق را ندارد.
        در کل هر دو مرتبط به یک مخزن کد بوده و اساسا یکی هستند.
  • #
    ‫۷ سال و ۳ ماه قبل، جمعه ۲۶ خرداد ۱۳۹۶، ساعت ۰۸:۳۸
    در نسخه‌های قبل mvc  امکان مفیدی بود که میشد هنگام دیباگ عملیات bundling رو کلا غیر فعال کرد و برای release فقط استفاده کرد ازش...
    که خیلی کمک میشد برای تست و بررسی اسکریپت‌ها و css‌ها .
    با این تفاسیر چنین امکانی وجود نداره در asp.netcore ?
  • #
    ‫۷ سال و ۱ ماه قبل، جمعه ۱۳ مرداد ۱۳۹۶، ساعت ۰۰:۵۶
    پس از مطالعه موارد به نکته ای برخوردم تگ هلپر asp-append-version فقط برای برای فایل هایی کار میکنه که داخل wwwroot باشن. آیا راه کاری وجود دارد که برای دایرکتوری‌های دیگری که در FileServerOption معرفی میکنیم کار کند؟  
    • #
      ‫۴ سال و ۸ ماه قبل، شنبه ۳۰ آذر ۱۳۹۸، ساعت ۱۳:۱۵
      سلام
      این کتابخانه WebOptimizer.Core بهترین گزینه‌ای بود که فایلهای اسکریپت و CSS رو هم فشرده میکنه و هم Bundle و هم اینکه این فایلهای جدید Bundle شده رو داخل فضای کش میریزه که از مکان فایلهای اصلی جدا نگهداری میشه .
      فقط در مورد ارتقا از ASP.NET Core 2.2 به ASP.Net Core 3.0 چون برای بخش احراز هویت شخصی بر روی پروژه باید از فریمورکهای زیر در نسخه ASp.NET Core 3.0 در قسمت PackageReference‌های پروژه استفاده بشه
      <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.0" />
      <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.0" />
      <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.0" />
      یک خطا در زمانی که فایلهای CSS رو می‌خواهد با هم Bundle کند پیش میاید که در نسخه‌های قبلی و یا حتی زمانی که از این سه PackageReference نخواهیم استفاده کنیم پیش نمیاد.

      برای رفع این مشکل در حال حاضر میتوانید این خط از کد سورس پروژه را با خط کد زیر تغییر دهید تا خطا رفع شود.
      content[key] = Adjust(config.Content[key].AsString(), input.PhysicalPath, output.Name);
      دلیلش اینه زمانی که از اون PackageReference‌ها استفاده میکنیم در این خط از کد خصوصیت output.PhysicalPath  مقدار null دریافت میکنه که باعث عدم کارایی و Bundle کردن فایلهای CSS میشه .
      گزارش کردم تا بعدا در نسخه nuget Package این مشکل برطرف بشه.
      • #
        ‫۴ سال و ۸ ماه قبل، شنبه ۳۰ آذر ۱۳۹۸، ساعت ۱۴:۰۴
        یک نکته‌ی تکمیلی!
        اهراز = جمع هرز یا هرزه!
        احراز = به دست آوردن
        احراز هویت = شناسائی شخصیت = اثبات هویت 
  • #
    ‫۶ سال و ۵ ماه قبل، یکشنبه ۱۲ فروردین ۱۳۹۷، ساعت ۰۱:۲۳
    یک نکته‌ی تکمیلی در مورد فونت‌ها

    عموما فونت‌ها در بسته‌های اصلی یک چنین مسیرهایی را دارند:
    src: url("../webfonts/fa-brands-400.eot");
    و در حالت پیش‌فرض این ابزار آن‌ها را به صورت زیر در فایل نهایی تولیدی بازنویسی می‌کند (بر اساس مسیر نسبی قرارگیری آن در پروژه):
    src: url("../node_modules/components-font-awesome/webfonts/fa-brands-400.eot");
    به همین جهت در حین اجرای برنامه پیام یافت نشدن آن‌ها را مشاهده می‌کنید.
    برای غیرفعال کردن این بازنویسی مسیر (بدون نیاز به عمومی کردن مسیر node_modules در کلاس آغازین برنامه)، باید در اینجا adjustRelativePaths را به false تنظیم کنید:
        {
            "outputFileName": "wwwroot/css/site.min.css",
            "inputFiles": [
                "node_modules/bootstrap/dist/css/bootstrap.min.css",
                "node_modules/bootstrap-rtl/dist/css/bootstrap-rtl.min.css",
                "node_modules/components-font-awesome/css/fa-solid.min.css",
                "node_modules/components-font-awesome/css/fontawesome.min.css",
                "content/custom.css"
            ],
            "minify": {
                "enabled": true,
                "renameLocals": false,
                "adjustRelativePaths": false
            },
            "sourceMap": false
        },
  • #
    ‫۶ سال و ۳ ماه قبل، یکشنبه ۲۰ خرداد ۱۳۹۷، ساعت ۰۳:۲۷
    با تشکر، با معرفی پکیج‌ها از طریق Bower پوشه ای به نام lib در wwwroot ایجاد شده به همین ترتیب معرفی بخش inputFiles رو من به شکل زیر انجام دادم :
    "wwwroot/lib/jquery/dist/jquery.min.js",
    و همچنین پکیج مربوطه در nuget  و افزونه معرفی شده در مطلب رو هم نصب کردم،با اجرای update all files در task runner محتوای فایل‌های :
    "wwwroot/js/site.min.js"
    "wwwroot/css/site.min.css"
    تغییری نمی‌کنند، اگر ممکن هست راهنمائی بفرمائید
    • #
      ‫۶ سال و ۳ ماه قبل، یکشنبه ۲۰ خرداد ۱۳۹۷، ساعت ۰۵:۵۷
      - اگر به تصویر ارسال شده دقت کنید، یک لاگ عملیات هم مشخص است. در اینجا خطاهای احتمالی ذکر می‌شوند. مثلا سطر زرد رنگ این تصویر به معنای نبود پوشه‌ی مربوطه است.
      - اصل این مطلب به روز رسانی هست که در نظرات عنوان شده و با build پروژه به صورت خودکار رخ می‌دهد.
  • #
    ‫۴ سال و ۶ ماه قبل، پنجشنبه ۱۵ اسفند ۱۳۹۸، ساعت ۲۲:۴۵
    وقتی در Visual Studio 2019 یک پروژه جدید mvc core ایجاد میکنم فایل بوت استرپ ورژن 4 در پروژه در قسمت wwwroot>lib>bootstap>dist>css>bootstarp.css وجود دارد. وقتی تغییری در این فایل میدهم در خروجی اعمال نمی‌شود چون دارد از فایل bootstrap.min.css می خواند. چه طور میشود که در bootstarp.css تغییری اعمال کرد و اتوماتیک این تغییر در bootstrap.min.css که در دل خودش هست هم اعمال شود؟
    • #
      ‫۴ سال و ۶ ماه قبل، جمعه ۱۶ اسفند ۱۳۹۸، ساعت ۰۰:۲۲
      پروژه‌ای که بر اساس دستور dotnet new mvc و به کمک SDK جدید ایجاد می‌شود (این دستور وابستگی به IDE شما ندارد)، فقط به همراه فایل‌های نهایی یکسری کتابخانه‌ی جاوا اسکریپتی و CSS ای است و راهی را برای مدیریت آن‌ها اضافه نکرده‌اند. بنابراین یا باید از روش مطلب جاری استفاده کنید (نمونه‌اش در اینجا) و یا از روش «LibMan».
  • #
    ‫۴ سال قبل، شنبه ۱ شهریور ۱۳۹۹، ساعت ۱۸:۰۵
    سلام؛ من با visual studio موفق به این کار شدم و مشکلی نداریم. اما هر کاری کردم با vscode برای پروژه DNT نتونستم bundler minifier رو راه اندازی کنم. نکته خاصی داره یا باید حتما از visual studio استفاده کرد؟
      • #
        ‫۴ سال قبل، یکشنبه ۲ شهریور ۱۳۹۹، ساعت ۰۱:۴۵
        ممنونم از پاسختون
        نکته : در صورتی که اگر نسخه‌های دیگری از SDK .NET core در سیستم از قبل نصب باشد دستور dotnet bundle یک خطای گمراه کننده برمیگرداند. من تمامی نسخه‌های کمتر از 3.1 SDK Core  رو uninstall کردم و بدون هیچ مشکلی اجرا شد.

  • #
    ‫۲ سال قبل، سه‌شنبه ۲۹ شهریور ۱۴۰۱، ساعت ۰۰:۳۶
    یک نکته‌ی تکمیلی
    با توجه به اینکه BundlerMinifier چندسالی هست که به روز نشده، انتخاب بهتر در این لحظه « WebOptimizer » است. یک نمونه مثال از روش ارتقاء از BundlerMinifier به WebOptimizer در اینجا
    • #
      ‫۱ سال و ۱۱ ماه قبل، چهارشنبه ۳۰ شهریور ۱۴۰۱، ساعت ۰۳:۱۸
      در مستندات خود مایکروسافت نیز پیکیج WebOptimizer معرفی شده و با توجه به اینکه asp.net core به صورت native  مبحث bundling و minification را پوشش نمی‌دهد، بهترین گزینه همین بسته میباشد. اما چند نکته در این بسته وجود داره:

      - وقتی شما از تنظیمات پیش فرض (بدون اعمال هیچ کانفیگی) استفاده کنید، تمام فایل‌های استاتیکی که در صفحه در خواست شده را minify خواهد کرد.
      برای مثال دو فایل bootstrap.min.css و index.css را در یک صفحه رفرنس داده اید. در هر ریکوئست (اگر تنظیمات را اعمال نکرده باشید) تمامی فایل‌ها را minify خواهد کرد که این امر سبب کاهش مدت زمان بارگذاری صفحه و خطا در نمایش و چیدمان خواهد شد.
      اما میتوانید یک مسیر را به صورت سراسری مشخص کنید و تعدادی فایل دیگر را هم مشخص کنید تا فایل‌های از پیش minify شده را نیز به اشتباه فشرده سازی نکند.
      برای مثال میتوان گفت فقط تمام فایل‌های مسیر wwwroot/myJsFiles را فشرده سازی کن و  در این صورت کاری به فولدر wwwroot/myLibraries  نخواهد داشت. یا فقط فایل‌های b.js، a.js و c.js فشرده شوند.
      - minify در زمان runtime: هر بار که ریکوئست به یک فایل استاتیک ارسال شود، این پکیج در همان لحظه عملیات minify را شروع خواهد کرد.
      (در بارگذاری اولیه و قبل از cache مرورگر) البته که اگر نکته اول را رعایت کرده باشید، پرفرمنس را نه تنها کاهش میدهد، بلکه باعث افزایش هم میشود. ولی قطعا در حالتی که از قبل فایل‌ها minify شده باشند، پرفرمنس بیشتر خواهد بود.
      - متاسفانه این پکیج فشرده سازی html را ندارد و نمونه خوبی در حد این بسته را پیدا نکردم.
      • #
        ‫۱ سال و ۱۱ ماه قبل، چهارشنبه ۳۰ شهریور ۱۴۰۱، ساعت ۰۳:۵۹
        - هدف اصلی از bundling این هست که «تمام فایل‌ها» مدخلی در صفحه نداشته باشند و فقط یک فایل معرف تمام آن‌ها ارائه شود؛ مانند کاری که در اینجا شده و گرنه ضرورتی به استفاده از این ابزارها نیست.
        + در تنظیمات آن حالت‌های مختلف caching سمت سرور مانند enableMemoryCache وجود دارد تا هربار و با هر درخواستی کار bundling و سایر جزئیات را تکرار نکند.