рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдЧрд╛
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 рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред
рд╕реНрдкрд╖реНрдЯ:
- Ext.require рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдб рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ
- рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд░реНрдЧ рдХреА рд╡рд┐рдиреНрдпрд╛рд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
рдирд┐рд╣рд┐рдд (рдХреЗрд╡рд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЧреБрдг):
- рдЬрдм рд╡рд┐рд░рд╛рд╕рдд - рд╡рд┐рд╕реНрддрд╛рд░
- рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп - рдорд┐рд╢реНрд░рдг
- рднрдВрдбрд╛рд░рдг рдореЙрдбрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп - рдореЙрдбрд▓
- рдЬрдм рджреГрд╢реНрдп, рдореЙрдбрд▓ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рднрдВрдбрд╛рд░рдг рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ - рд╡рд┐рдЪрд╛рд░ , рдореЙрдбрд▓ , рд╕реНрдЯреЛрд░
- рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп - рдирд┐рдпрдВрддреНрд░рдХ
- рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡реНрдпреВрдкреЛрд░реНрдЯ - autoCreateViewport рдмрдирд╛рддреЗ рд╕рдордп: рд╕рдЪ
рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рд╣реЛрдЧреА - рдХреЛрдб рдореЗрдВ рдХреЛрдб рдХрд╛ рдорддрд▓рдм рд╣реИред рдмрд╛рдХреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕реМрд╣рд╛рд░реНрджрдкреВрд░реНрдг рд╣реИрдВред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдВред рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдХрдИ рд╡рд░реНрдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдЕрдиреНрдп рдХрдХреНрд╖рд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ:
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 рдлреНрд░реЗрдорд╡рд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдорд╛рдирдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдиреБрдХрд╕рд╛рди рдХреНрдпрд╛ рд╣реИрдВ? рдЙрдирдХреЗ рдкрд╛рд╕ рднреА рд╣реИ:
- рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЦрдирди рдХреЗ рджреМрд░рд╛рди рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреБрдЫ рджреЗрд░реА рд╣реЛрддреА рд╣реИред
- рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, autoCreateViewport: рд╕рдЪ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖ рдЬрд╛рдПрдЧрд╛, рдФрд░ autoCreatViewViewport:! 0 - рдЕрдм (рдмрд┐рдирд╛ dopilivaniya)ред
- ExtJS рдпрд╛ SenchaTouch рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХ Ext.application рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдЦреНрддреА рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдорд┐рдирд┐рдлрд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдЕрдЬреАрдм рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рд╣реИред рдЕрд╕рд▓ рдореЗрдВ, рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╡реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╢реБрд░реВ рд╣реЛ рдЧрдП, рд▓реЗрдХрд┐рди рдЙрд╕ рдЕрдЬреАрдм рддрд░реАрдХреЗ рд╕реЗ рдореБрдЭреЗ рд╕реНрдкреЗрдЧреЗрдЯреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдореЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред
рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛
- NuGetред SenchaMinify рдкреИрдХреЗрдЬ ред
- рдбреЗрдореЛ рдХреЗ рд╕рд╛рде GitHub рдкреНрд░реЛрдЬреЗрдХреНрдЯ ред
Github рдореЗрдВ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди ( SenchaMinify.Cmd ) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди exe рдлрд╝рд╛рдЗрд▓ рднреА рд╢рд╛рдорд┐рд▓ рдереАред рддреЛ рдЬреЛ рд▓реЛрдЧ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд╕реНрд╡рдЪрд╛рд▓рди рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореБрдЭреЗ рд░рдЪрдирд╛рддреНрдордХ рд╡рд┐рдЪрд╛рд░реЛрдВ рдпрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред