আমি কীভাবে একটি স্পষ্ট স্ক্রিপ্টবান্ডেলে অর্ডার অন্তর্ভুক্ত করতে পারি?


91

আমি বাইরে চেষ্টা করছি MVC4 System.Web.Optimization 1.0 ScriptBundle বৈশিষ্ট্য

আমার নিম্নলিখিত কনফিগারেশন রয়েছে:

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        // shared scripts
        Bundle canvasScripts =
            new ScriptBundle(BundlePaths.CanvasScripts)
                .Include("~/Scripts/modernizr-*")
                .Include("~/Scripts/json2.js")
                .Include("~/Scripts/columnizer.js")
                .Include("~/Scripts/jquery.ui.message.min.js")
                .Include("~/Scripts/Shared/achievements.js")
                .Include("~/Scripts/Shared/canvas.js");
        bundles.Add(canvasScripts);
    }
}

এবং নিম্নলিখিত দেখুন:

<script type="text/javascript" src="@Scripts.Url(BundlePaths.CanvasScripts)"></script>

যেখানে BundlePaths.CanvasScriptsহয় "~/bundles/scripts/canvas"। এটি এটি রেন্ডার করে:

<script type="text/javascript" src="/bundles/scripts/canvas?v=UTH3XqH0UXWjJzi-gtX03eU183BJNpFNg8anioG14_41"></script>

এতদূর ভাল, ~/Scripts/Shared/achievements.jsব্যান্ডেল করা উত্সের প্রথম স্ক্রিপ্টটি বাদে । এটি এর আগে অন্তর্ভুক্ত প্রতিটি স্ক্রিপ্টের উপর নির্ভর করে ScriptBundleআমি কীভাবে নিশ্চিত করতে পারি যে এটি যাতে বান্ডলে বিবৃতি অন্তর্ভুক্ত করে সেই আদেশটিকে সম্মান করে?

হালনাগাদ

এটি তুলনামূলকভাবে নতুন এএসপি.নেট এমভিসি 4 অ্যাপ্লিকেশন ছিল তবে এটি অপ্টিমাইজেশনের কাঠামো প্রি রিলিজ প্যাকেজটিকে উল্লেখ করেছে। আমি এটিকে অপসারণ করেছি এবং http://nuget.org/packages/Mic Microsoft.AspNet.Web.Optimization থেকে আরটিএম প্যাকেজ যুক্ত করেছি । আরটিএম সংস্করণটি ডিবাগ = ওয়েবকনফাইগের সাথে সত্য সহ, @Scripts.Render("~/bundles/scripts/canvas")পৃথক স্ক্রিপ্ট ট্যাগগুলি সঠিক ক্রমে রেন্ডার করে।

ওয়েবকনফিগে ডিবাগ = মিথ্যা দিয়ে, সম্মিলিত স্ক্রিপ্টটির প্রথমে সাফল্য.জেএস স্ক্রিপ্ট রয়েছে, তবে এটি যেহেতু পরবর্তীতে ডাকা একটি ফাংশন সংজ্ঞা (অবজেক্ট কনস্ট্রাক্টর), এটি ত্রুটি ছাড়াই চলে। নির্ভরতা নির্ধারণের জন্য মিনিফায়ারটি যথেষ্ট স্মার্ট?

আমি IBundleOrdererডারিন ডিমিট্রভ আরটিএমের সাথে উভয় ডিবাগ বিকল্পের সাথে প্রস্তাবটি প্রয়োগের চেষ্টা করেছিলাম এবং এটি একই রকম আচরণ করে।

তাই সংক্ষিপ্ত সংস্করণটি আমার প্রত্যাশা অনুযায়ী নয় তবে এটি কার্যকর হয়।

উত্তর:


18

আরটিএম বিটগুলিতে আমি এই আচরণটি দেখছি না, আপনি কি মাইক্রোসফ্ট এএসপি.নেট ওয়েব অপ্টিমাইজেশন ফ্রেমওয়ার্ক 1.0.0 বিট ব্যবহার করছেন: http://nuget.org/packages/Mic Microsoft.AspNet.Web.Optimization ?

আমি একটি নতুন এমভিসি 4 ইন্টারনেট অ্যাপ্লিকেশন ওয়েবসাইটের ভিত্তিতে আপনার নমুনায় অনুরূপ তিরস্কার ব্যবহার করেছি।

আমি BundleConfig.RegisterBundles এ যুক্ত করেছি:

        Bundle canvasScripts =
            new ScriptBundle("~/bundles/scripts/canvas")
                .Include("~/Scripts/modernizr-*")
                .Include("~/Scripts/Shared/achievements.js")
                .Include("~/Scripts/Shared/canvas.js");
        bundles.Add(canvasScripts); 

এবং তারপরে ডিফল্ট সূচী পৃষ্ঠায় আমি যুক্ত করেছি:

<script src="@Scripts.Url("~/bundles/scripts/canvas")"></script>

এবং আমি যাচাই করেছি যে বান্ডিলটির জন্য সংক্ষিপ্ত জাভাস্ক্রিপ্টে, অর্জন.js এর সামগ্রীগুলি আধুনিকীকরণের পরে ...


আমি 1.0 সংস্করণে আপগ্রেড করেছি। আমার আপডেট হওয়া প্রশ্নটি দেখুন। সাফল্য.জেএস এর বিষয়বস্তুগুলি সর্বনিম্ন সংস্করণে প্রথমে অন্তর্ভুক্ত করা হয়, তবে এটি পরে কাজ করা একটি ফাংশন থেকে এটি কাজ করে।
jrummell

115

আপনি একটি কাস্টম বান্ডেল অর্ডার ( IBundleOrderer) লিখতে পারেন যা নিশ্চিত করবে যে আপনি যেভাবে বান্ডেলগুলি নিবন্ধভুক্ত করেছেন তাতে অন্তর্ভুক্ত রয়েছে:

public class AsIsBundleOrderer : IBundleOrderer
{
    public virtual IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
    {
        return files;
    }
}

এবং তারপর:

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        var bundle = new Bundle("~/bundles/scripts/canvas");
        bundle.Orderer = new AsIsBundleOrderer();
        bundle
            .Include("~/Scripts/modernizr-*")
            .Include("~/Scripts/json2.js")
            .Include("~/Scripts/columnizer.js")
            .Include("~/Scripts/jquery.ui.message.min.js")
            .Include("~/Scripts/Shared/achievements.js")
            .Include("~/Scripts/Shared/canvas.js");
        bundles.Add(bundle);
    }
}

এবং আপনার দৃষ্টিতে:

@Scripts.Render("~/bundles/scripts/canvas")

10
এটি কাজ করা উচিত, তবে এটি অপ্রয়োজনীয়ও হওয়া উচিত, কারণ ডিফল্ট আদেশদাতা সাধারণত অন্তর্ভুক্তির ক্রমকে সম্মান করে (এটি কেবলমাত্র কয়েকটি বিশেষ ফাইলকে শীর্ষে উত্থাপন করে, যেমন jquery, reset.css / normalize.css ইত্যাদি)। এটি শীর্ষে সাফল্য.js প্রচার করা উচিত নয়।
হাও কুং

4
@ ফ্লিপডুব্ট এখানে রেপ্রো দিয়ে একটি ইস্যু ফাইল করুন: এ্যাসনেটপটিমাইজেশন.কোড্লেপ্লেক্স
হাও কুং

4
এটি নিখুঁতভাবে কাজ করে, ধন্যবাদ! যদিও আমি সম্মত, এটি প্রয়োজনীয় হওয়া উচিত নয়।
সিবিআর

4
এটি আমার পক্ষে কাজ করে। যখন অনুযায়ী বুটস্ট্র্যাপ উপর jqueryui প্রচার ছিল stackoverflow.com/questions/17367736/... আমি এটা ফ্লিপ প্রয়োজন।
শেঠক্রান

4
@ হাও কুং আমরা কী অন্তর্ভুক্ত ডিরেক্টরিতে ফাইলগুলি অর্ডার করতে পারি ?
শাইজুত

52

ধন্যবাদ দারিন আমি একটি এক্সটেনশন পদ্ধতি যুক্ত করেছি।

internal class AsIsBundleOrderer : IBundleOrderer
{
    public virtual IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
    {
        return files;
    }
}

internal static class BundleExtensions
{
    public static Bundle ForceOrdered(this Bundle sb)
    {
        sb.Orderer = new AsIsBundleOrderer();
        return sb;
    }
}

ব্যবহার

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-{version}.js",
                    "~/Scripts/jquery-migrate-{version}.js",

                    "~/Scripts/jquery.validate.js",
                    "~/Scripts/jquery.validate.messages_fr.js",
                    "~/Scripts/moon.jquery.validation-{version}.js",

                    "~/Scripts/jquery-ui-{version}.js"
                    ).ForceOrdered());

9
খুব স্মার্ট! : ডি এখনই আমাকে ইন্টারফেস পদ্ধতির স্বাক্ষরের FileInfoজন্য পরিবর্তন করতে BundleFileহয়েছিল। তারা এটি পরিবর্তন করেছে।
লেনিয়েল ম্যাককাফেরি

হ্যাঁ তারা এটিকে পূর্বরূপ সংস্করণে পরিবর্তন করেছে যা ওউইন কাঠামো ব্যবহার করে
সফটলিয়ন

লিটল অফ টপিক: কারও কাছে এই BundleFileক্লাসে আরও তথ্য আছে ? এম্বেড থাকা সংস্থানগুলিকে বান্ডিল করার জন্য, আমি এটি ইনস্ট্যান্ট করার চেষ্টা করছি এবং এটির নির্মাত্রে একটি (কংক্রিটের শিশু) VirtualFileপ্যারামিটার প্রয়োজন।
সুপারজোজ

আমার একই প্রশ্ন রয়েছে, আমার বান্ডিলফাই ইনস্ট্যান্ট করা দরকার, তবে কীভাবে জানা নেই
রুই

4
@ সু্পেরজোস আমি জানি এটি বরং পুরানো তবে অন্য কারও সমস্যা হলে আমি উত্তর দেব। এটি System.Web.Optimization এর অংশ।
টালন

47

এমভিসি 5 (বান্ডেলফিল বনাম ফাইলআইএনফো) এর পরিবর্তনগুলি পরিচালনা করতে সফটলিয়ন দ্বারা সরবরাহিত উত্তরটি আপডেট করেছে।

internal class AsIsBundleOrderer : IBundleOrderer
{
    public virtual IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files)
    {
        return files;
    }
}

internal static class BundleExtensions
{
    public static Bundle ForceOrdered(this Bundle sb)
    {
        sb.Orderer = new AsIsBundleOrderer();
        return sb;
    }
}

ব্যবহার:

    bundles.Add(new ScriptBundle("~/content/js/site")
        .Include("~/content/scripts/jquery-{version}.js")
        .Include("~/content/scripts/bootstrap-{version}.js")
        .Include("~/content/scripts/jquery.validate-{version}")
        .ForceOrdered());

আমি সাবলীল সিনট্যাক্স ব্যবহার করতে পছন্দ করি তবে এটি একক পদ্ধতিতে কল এবং সমস্ত স্ক্রিপ্টগুলি প্যারামিটার হিসাবে পাস করে।


4
এমভিসি 5 এ কাজ করে Thanks ধন্যবাদ
পাস্কল কার্মোনি 14

4
দুর্দান্ত। এটি এমএস imho দ্বারা অন্তর্ভুক্ত করা উচিত
অ্যাঞ্জেলো

ওয়েব ফর্মগুলিতেও কবজির মতো কাজ করে ... মূলত এটি সর্বশেষতম সংস্করণগুলির জন্য দুর্দান্ত কাজ করা উচিত!
সানি শর্মা

খুব পরিষ্কার এবং সহজ সমাধান। অনেক ধন্যবাদ.
বুঞ্জিবি

5

আপনার বান্ডেল সংগ্রহের সাহায্যে অর্ডার সেট করতে সক্ষম হওয়া উচিত ileফাইসেটঅর্ডারলিস্ট। এই ব্লগ পোস্টটি দেখুন: http://weblogs.asp.net/imranbaloch/archive/2012/09/30/hided-options-of-asp-net-bundling- এবং-minication.aspx । আপনার উদাহরণের কোডটি এমন কিছু হবে:

BundleFileSetOrdering bundleFileSetOrdering = new BundleFileSetOrdering("js");
bundleFileSetOrdering.Files.Add("~/Scripts/modernizr-*");
bundleFileSetOrdering.Files.Add("~/Scripts/json2.js");
bundleFileSetOrdering.Files.Add("~/Scripts/columnizer.js");
bundleFileSetOrdering.Files.Add("~/Scripts/jquery.ui.message.min.js");
bundleFileSetOrdering.Files.Add("~/Scripts/Shared/achievements.js");
bundleFileSetOrdering.Files.Add("~/Scripts/Shared/canvas.js");
bundles.FileSetOrderList.Add(bundleFileSetOrdering);

1

আপনার ক্যাসেট ব্যবহার করার কথা বিবেচনা করা উচিত http://getcassette.net/ এটি প্রতিটি ফাইলের মধ্যে পাওয়া স্ক্রিপ্ট রেফারেন্সের উপর ভিত্তি করে স্ক্রিপ্ট নির্ভরতা সনাক্তকরণকে সমর্থন করে।

আপনি যদি এমএস ওয়েব অপ্টিমাইজেশন সমাধানের সাথে আঁকতে পছন্দ করেন তবে স্ক্রিপ্টের রেফারেন্সের ভিত্তিতে স্ক্রিপ্টগুলি সাজানোর ধারণার মতো আপনার আমার ব্লগ পোস্টটি http : //blogs.mic Microsoft.co.il/oric/2013/12/27/building-single এ পড়তে হবে -পৃষ্ঠা-অ্যাপ্লিকেশন-বান্ডেল-অর্ডার /


1

@ ডারিন দিমিত্রভের উত্তর আমার পক্ষে নিখুঁতভাবে কাজ করে তবে আমার প্রকল্পটি ভিবিতে লেখা আছে, সুতরাং এখানে তার উত্তরটি ভিবিতে রূপান্তরিত হয়েছে

Public Class AsIsBundleOrderer
    Implements IBundleOrderer

    Public Function IBundleOrderer_OrderFiles(ByVal context As BundleContext, ByVal files As IEnumerable(Of FileInfo)) As IEnumerable(Of FileInfo) Implements IBundleOrderer.OrderFiles
        Return files
    End Function
End Class

এটি ব্যবহার করতে:

Dim scriptBundleMain = New ScriptBundle("~/Scripts/myBundle")
scriptBundleMain.Orderer = New AsIsBundleOrderer()
scriptBundleMain.Include(
    "~/Scripts/file1.js",
    "~/Scripts/file2.js"
)
bundles.Add(scriptBundleMain)

আমি এই ত্রুটিটি পেতে থাকি: Class 'AsIsBundleOrderer' must implement 'Function OrderFiles(context as ....)' for interface 'System.Web.Optimization.IBundleOrderer'কোনও ধারণা?
মার্ক পাইসাক - ট্রিলন.ও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.