ASP.NET рдХреЗ рд╕рд╛рде рдПрдХреНрд╕реНрдЯреНрд░реАрдо рдЬреЗрдПрд╕ рдФрд░ рд╕реНрдиреЗрд╣рд╛ рдЯрдЪ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдиреНрдпреВрдирддрдо рдХрд░рдирд╛

рдпрджрд┐ рдЖрдк ASP.NET MVC рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ ExtJS рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ SenchaCmd рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╕рдордп рдирд╣реАрдВ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдЖрдк рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдорд┐рдирд┐рдлрд╝рд╛рдпрд░ рд▓рд┐рдЦреЗрдВред



рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдЧрд╛
public class BundleConfig { public static void RegisterBundles(BundleCollection bundles) { bundles.Add( new SenchaBundle("~/bundles/my-sencha-app") .IncludeDirectory("~/Scripts/my-sencha-app", "*.js", true) ); } }
      
      







рдкрд╣рдЪрд╛рди



рддреЛ, рдЖрдк рдПрдХреНрд╕рдЯреАрдЬреЗрдПрд╕ 4 рдпрд╛ рд╕реЗрдирдЪреИрдЪ 2 рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рд╕реНрд░реЛрддреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рдЬреЛ рд╕рдВрднрд╡рддрдГ рд▓реЛрдбрд┐рдВрдЧ, рдХреБрдПрдВ рдореЗрдВ рджреЗрд░реА рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЖрдк рдЕрдкрдиреЗ рд╕реБрдВрджрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЪреБрднрддреА рдЖрдВрдЦреЛрдВ рд╕реЗ рдЫрд┐рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред



рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдорди рдореЗрдВ рдЖрддреА рд╣реИ рд╡рд╣ рд╣реИ рд╕реНрдиреЗрд╣рд╛рдХреИрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ - рдПрдХ рдЙрддреНрдкрд╛рдж рдЬрд┐рд╕реЗ рд╕реЗрдВрдЪрд╣рд╛ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣ index.html рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди URL рдлрд╝реАрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╣ рдЖрдЬреНрдЮрд╛рдХрд╛рд░реА рд░реВрдк рд╕реЗ рдкреГрд╖реНрда рд▓реЗрдЧрд╛ рдФрд░ рдЯреНрд░реИрдХ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдереЗ, рдлрд┐рд░ рд╡рд╣ рдЗрд╕реЗ рдорд┐рдиреАрдлрд╝рд╛рдпрд░ рдХреЛ рджреЗ рджреЗрдЧрд╛, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдЖрдкрдХреЛ рд╡рд╣ рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рдереЗред



рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреНрдпрд╛ рд╣реИ? рд░рд╛рдп рдпрд╣рд╛рдБ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди SenchaCmd рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IMHO рдереЛрдбрд╝рд╛ рднрд╛рд░реА рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдиреЛрдбрдЬ рдФрд░ рдлреИрдВрдЯрдордЬ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рджреБрд░реНрд▓рдн рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Index.cshtml рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдЙрд╕реЗ рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ: рд░реЗрдЬрд╝рд░ рдорд╛рд░реНрдХрдЕрдк рд╡рд╛рд▓реЗ рдЕрдиреБрднрд╛рдЧ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдПрдВрдЧреЗред рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ URL рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдкрд╛рд╕ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рднреА рд╕реНрд░реЛрдд рдорд┐рдиреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рдЦрд░рд╛рдм рд╣реИ ред



рдпрд╣ рдХрд╣рдирд╛ рдЕрдзрд┐рдХ рд╕рд░рд▓ рд╣реЛрдЧрд╛: "рдпрд╣рд╛рдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ, рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд╕рдордЭреЗрдВ рдФрд░ рдореБрдЭреЗ рдПрдХ рд╕рдВрдкреАрдбрд╝рд┐рдд рдлрд╝рд╛рдЗрд▓ рджреЗрдВред" рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░, рдпрд╣ рдорд┐рдиреАрдлрд╛рдпрд░реНрд╕ рд╕реЗ рднрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрди рд▓реЛрдЧреЛрдВ рдореЗрдВ рдирд╣реАрдВ, рдЬреЛ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪрд▓реЛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред



рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ



ASP.NET рд╕реНрдЯреИрдХ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд╡рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рдЦрдирди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ - рдмрдВрдбрд▓реНрд╕ ред рдЙрд╕реЗ рдХреЗрд╡рд▓ рдереЛрдбрд╝реА рдорджрдж рдХреА рдЬрд░реВрд░рдд рд╣реИ - рдЕрд░реНрдерд╛рддреН, рд╕реНрд░реЛрдд рдХреЛ рдЧреЛрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдмрддрд╛рдирд╛ рд╣реИред



BundleConfig.cs
 public class BundleConfig { public static void RegisterBundles(BundleCollection bundles) { bundles.Add( new ScriptBundle("~/bundles/my-sencha-app") { Orderer = // ? } .IncludeDirectory("~/Scripts/my-sencha-app", "*.js", true); ); } }
      
      





рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП! рдЖрдЗрдП рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдСрд░реНрдбрд░рд░ рдкрд░ред



IBundleOrderer
 public interface IBundleOrderer { IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files); }
      
      





рдЗрдирдкреБрдЯ рдкрд░, рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ - рднреА, рдХреЗрд╡рд▓ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЖрдЗрдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред ExtJS рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред



рд╕реНрдкрд╖реНрдЯ:



рдирд┐рд╣рд┐рдд (рдХреЗрд╡рд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЧреБрдг):



рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рд╣реЛрдЧреА - рдХреЛрдб рдореЗрдВ рдХреЛрдб рдХрд╛ рдорддрд▓рдм рд╣реИред рдмрд╛рдХреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕реМрд╣рд╛рд░реНрджрдкреВрд░реНрдг рд╣реИрдВред



рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдВред рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдХрдИ рд╡рд░реНрдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдЕрдиреНрдп рдХрдХреНрд╖рд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ:



SenchaFile.cs
 public class SenchaFile { /// <summary> ///    /// </summary> public IEnumerable<SenchaClass> Classes { get; set; } /// <summary> ///   /// </summary> public virtual IEnumerable<SenchaFile> Dependencies { get; set; } }
      
      





SenchaClass.cs
 public class SenchaClass { /// <summary> ///   /// </summary> public string ClassName { get; set; } /// <summary> ///   /// </summary> public IEnumerable<string> DependencyClassNames { get; set; } }
      
      





рдЕрдм рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдХрдХреНрд╖рд╛рдПрдВ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдХреМрд╢рд▓ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рджреВрдВрдЧрд╛ред рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Microsoft.Ajax.Utilities рд╕реЗ JSParser рд╣реИред рдпрд╣ рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмреНрд▓реЙрдХ рдХреЗ рдкреЗрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЙрд▓, рдЖрджрд┐ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдХрд╣рд╛рдБ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ (Ext.application), рдХрдХреНрд╖рд╛рдПрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ рдпрд╛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рд╣реИрдВ (Ext.define, Ext.override):



SenchaFile.cs
 public class SenchaFile { // .. /// <summary> ///  ,    /// </summary> protected virtual IEnumerable<SenchaClass> GetClasses() { var extApps = this.RootBlock.OfType<CallNode>() .Where(cn => cn.Children.Any()) .Where(cn => cn.Children.First().Context.Code == "Ext.application") .Select(cn => cn.Arguments.OfType<ObjectLiteral>().First()) .Select(arg => new SenchaClass(arg) { IsApplication = true }); var extDefines = this.RootBlock.OfType<CallNode>() .Where(cn => cn.Arguments.OfType<ConstantWrapper>().Any()) .Where(cn => cn.Arguments.OfType<ObjectLiteral>().Any()) .Where(cn => { var code = cn.Children.First().Context.Code; return code == "Ext.define" || code == "Ext.override"; }) .Select(cn => { var className = cn.Arguments.OfType<ConstantWrapper>().First().Value.ToString(); var config = cn.Arguments.OfType<ObjectLiteral>().First(); return new SenchaClass(config) { ClassName = className }; }); foreach (var cls in extApps.Union(extDefines)) { yield return cls; } } }
      
      





рдЕрдЧрд▓рд╛ рдЪрд░рдг рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рди JSParser рд▓реЗрдВ рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрдзрд╛рд░рдг (рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд) рдХреЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рд╕реЗ рдЧреБрдЬрд░реЗрдВред рдореИрдВ рд▓реЗрдЦ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирд╣реАрдВ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рд░ рд╕рдорд╛рди рд╣реИ: рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдЧреБрдгреЛрдВ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдмреНрд▓реЙрдХ рдЯреНрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╡рд░реНрдЧреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред



рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреА рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВред рдФрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдПрдХ рддрдерд╛рдХрдерд┐рдд рд╕рд╛рдордпрд┐рдХ рдЫрдБрдЯрд╛рдИ рд╣реИ ред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд░рд▓ рд╣реИ рдФрд░ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдирд▓рд╛рдЗрди рдбреЗрдореЛ рд╣реИ :







SenchaOrderer.cs
 public class SenchaOrderer { /// <summary> ///     /// </summary> /// <param name="node">,   </param> /// <param name="resolved">    </param> protected virtual void DependencyResolve<TNode>(TNode node, IList<TNode> resolved) where TNode: SenchaFile { //        node.Color = SenchaFile.SortColor.Gray; //     foreach (TNode dependency in node.Dependencies) { //        ( ),   if (dependency.Color == SenchaFile.SortColor.White) { DependencyResolve(dependency, resolved); } //    (),   :    else if (dependency.Color == SenchaFile.SortColor.Gray) { throw new InvalidOperationException(String.Format( "Circular dependency detected: '{0}' -> '{1}'", node.FullName ?? String.Empty, dependency.FullName ?? String.Empty) ); } } //  ,    ... //        ,      . node.Color = SenchaFile.SortColor.Black; resolved.Add(node); } /// <summary> ///      /// </summary> /// <param name="files">  </param> /// <returns>  SenchaFileInfo</returns> public virtual IEnumerable<TNode> OrderFiles<TNode>(IEnumerable<TNode> files) where TNode: SenchaFile { var filelist = files.ToList(); //        IList<TNode> unresolved = filelist; IList<TNode> resolved = new List<TNode>(); TNode startNode = unresolved .Where(ef => ef.Color == SenchaFile.SortColor.White) .FirstOrDefault(); while (startNode != null) { DependencyResolve(startNode, resolved); startNode = unresolved .Where(ef => ef.Color == SenchaFile.SortColor.White) .FirstOrDefault(); } return resolved; } }
      
      







рдмрд╕ рдЗрддрдирд╛ рд╣реАред рд╕реЗрд╡рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдФрд░ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



BundleConfig.cs

 public class BundleConfig { public static void RegisterBundles(BundleCollection bundles) { bundles.Add( new SenchaBundle("~/bundles/my-sencha-app") .IncludeDirectory("~/Scripts/my-sencha-app", "*.js", true) ); } }
      
      







Index.cshtml

 ... <script src="@Url.Content("~/bundles/my-sencha-app")" type="text/javascript"></script>
      
      







рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░



рдРрд╕реЗ рдлреИрд╕рд▓реЗ рдХреЗ рдХреНрдпрд╛ рдлрд╛рдпрджреЗ рд╣реИрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ: ASP.NET рдлреНрд░реЗрдорд╡рд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдорд╛рдирдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдиреБрдХрд╕рд╛рди рдХреНрдпрд╛ рд╣реИрдВ? рдЙрдирдХреЗ рдкрд╛рд╕ рднреА рд╣реИ:



рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдорд┐рдирд┐рдлрд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдЕрдЬреАрдм рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рд╣реИред рдЕрд╕рд▓ рдореЗрдВ, рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╡реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╢реБрд░реВ рд╣реЛ рдЧрдП, рд▓реЗрдХрд┐рди рдЙрд╕ рдЕрдЬреАрдм рддрд░реАрдХреЗ рд╕реЗ рдореБрдЭреЗ рд╕реНрдкреЗрдЧреЗрдЯреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдореЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред



рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛



  1. NuGetред SenchaMinify рдкреИрдХреЗрдЬ ред
  2. рдбреЗрдореЛ рдХреЗ рд╕рд╛рде GitHub рдкреНрд░реЛрдЬреЗрдХреНрдЯ ред


Github рдореЗрдВ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди ( SenchaMinify.Cmd ) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди exe рдлрд╝рд╛рдЗрд▓ рднреА рд╢рд╛рдорд┐рд▓ рдереАред рддреЛ рдЬреЛ рд▓реЛрдЧ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд╕реНрд╡рдЪрд╛рд▓рди рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдореБрдЭреЗ рд░рдЪрдирд╛рддреНрдордХ рд╡рд┐рдЪрд╛рд░реЛрдВ рдпрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред



All Articles