javascript – 如何在不重新编译的情况下使用ASP.NET捆绑和缩小?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 如何在不重新编译的情况下使用ASP.NET捆绑和缩小?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5644字,纯文字阅读大概需要9分钟。
内容图文
约束:我没有使用MVC,只是在我的网络应用程序中使用常规的’.aspx文件.不使用母版页 – 每个页面都是不同的野兽,因此该解决方案不适合我.
我读过的关于捆绑和缩小的大多数示例都需要一些特殊的MVC标记,或者要求您预先识别捆绑的脚本/样式表,然后参考这些捆绑包.我想避免每次在.aspx页面中添加或修改.js引用时重新编译DLL.
我有点难以阅读Msft文档..是否有一种方法(如ASP.NET控件)我可以包装一系列脚本标签(或CSS的链接标签)来动态创建和使用包?我不想重新发明轮子,但认真考虑创建我自己的用户控件/自定义控件来处理这个问题.还有其他选择吗?
例如,寻找这样的东西:
<asp:AdHocScriptBundle id="mypage_bundle" runat="server">
<script type="text/javascript" src="~/scripts/mypage1.js"></script>
<script type="text/javascript" src="~/scripts/mypage2.js"></script>
<script type="text/javascript" src="~/scripts/mypage3.js"></script>
</asp:AdHocScriptBundle>
当启用捆绑时,会自动使用类似于此的脚本标记替换asp:AdHocScriptBundle的内容:
<script type="text/javascript" src="/webappname/bundles/mypage_bundle.js?v=dh120398dh1298dh192d8hd32d"></script>
当禁用Bundling时,通常输出内容如下:
<script type="text/javascript" src="/webappname/scripts/mypage1.js"></script>
<script type="text/javascript" src="/webappname/scripts/mypage2.js"></script>
<script type="text/javascript" src="/webappname/scripts/mypage3.js"></script>
有什么想法吗?
即将推出我自己的,但如果已有解决方案,请分享,谢谢!
解决方法:
我推出了自己的解决方案,效果很好!我创建了4个可以用作自定义服务器控件的类:
> ScriptBundle
>脚本
> StyleBundle
>链接
这些调用函数围绕我的自定义捆绑库,它本身就是System.Web.Optimization API的包装器.
在渲染ScriptBundle和StyleBundle期间,我检查一个内部设置(我用来在System.Web.Optimization API中设置EnableOptimizations的那个),它告诉页面要么使用捆绑,要么只是写出正常的脚本/链接标签.如果启用了Bundling,它会从我的自定义捆绑库中调用此函数(对于Scripts,类似于Styles的代码.下面的代码中的Bundler是我的自定义捆绑库的类 – 以防Microsoft更改我想要的System.Web.Optimization API介于两者之间的层,以便我不必更改我的代码):
public static void AddScriptBundle(string virtualTargetPath, params string[] virtualSourcePaths)
{
var scriptBundle = new System.Web.Optimization.ScriptBundle(virtualTargetPath);
scriptBundle.Include(virtualSourcePaths);
System.Web.Optimization.BundleTable.Bundles.Add(scriptBundle);
}
为了确保我只创建Bundle(如果它尚不存在),我首先使用此方法检查Bundle(在使用上述方法之前):
public static bool BundleExists(string virtualTargetPath)
{
return System.Web.Optimization.BundleTable.Bundles.GetBundleFor(virtualTargetPath) != null;
}
然后我使用此函数通过使用System.Web.Optimization吐出捆绑的URL:
public static System.Web.IHtmlString GetScriptBundleHTML(string virtualTargetPath)
{
return System.Web.Optimization.Scripts.Render(virtualTargetPath);
}
在我的.aspx文件中,我这样做:
<%@ Register TagPrefix="cc1" Namespace="AdHocBundler" Assembly="AdHocBundler" %>
…
<cc1:ScriptBundle name="MyBundle" runat="Server">
<cc1:script src='~/js/script1.js'/>
<cc1:script src='~/js/utils/script2.js'/>
</cc1:ScriptBundle>
我的诀窍是弄清楚我必须转换脚本和链接标签才能在ScriptBundle和StyleBundle控件中作为列表项工作,但之后它工作得很好而且它让我使用波浪号运算符来相对于app root进行简单的引用(使用Page.ResolveClientUrl(),这有助于创建模块内容).
感谢这个SO答案,帮助我弄清楚如何创建自定义集合控件:How do you build an ASP.NET custom control with a collection property?
更新:为了完全披露,我获得了分享ScriptBundle代码的许可(StyleBundle几乎完全相同,所以没有包含它):
[DefaultProperty("Name")]
[ParseChildren(true, DefaultProperty = "Scripts")]
public class ScriptBundle : Control
{
public ScriptBundle()
{
this.Enabled = true;
this.Scripts = new List<Script>();
}
[PersistenceMode(PersistenceMode.Attribute)]
public String Name { get; set; }
[PersistenceMode(PersistenceMode.Attribute)]
[DefaultValue(true)]
public Boolean Enabled { get; set; }
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
public List<Script> Scripts { get; set; }
protected override void Render(HtmlTextWriter writer)
{
if (String.IsNullOrEmpty(this.Name))
{
// Name is used to generate the bundle; tell dev if he forgot it
throw new Exception("ScriptBundle Name is not defined.");
}
writer.BeginRender();
if (this.Enabled && Bundler.EnableOptimizations)
{
if (this.Scripts.Count > 0)
{
string bundleName = String.Format("~/bundles{0}/{1}.js",
HttpContext.Current.Request.FilePath,
this.Name).ToLower();
// create a bundle if not exists
if (!Bundler.BundleExists(bundleName))
{
string[] scriptPaths = new string[this.Scripts.Count];
int len = scriptPaths.Length;
for (int i = 0; i < len; i++)
{
if (!string.IsNullOrEmpty(this.Scripts[i].Src))
{
// no need for resolve client URL here - bundler already does it for us, so paths like "~/scripts" will already be expanded
scriptPaths[i] = this.Scripts[i].Src;
}
}
Bundler.AddScriptBundle(bundleName, scriptPaths);
}
// spit out a reference to bundle
writer.Write(Bundler.GetScriptBundleHTML(bundleName));
}
}
else
{
// do not use bundling. generate normal script tags for each Script
foreach (Script s in this.Scripts)
{
if (!string.IsNullOrEmpty(s.Src))
{
// render <script type='<type>' src='<src'>/> ... and resolve URL to expand tilde, which lets us use paths relative to app root
// calling writer.Write() directly since it has less overhead than using RenderBeginTag(), etc., assumption is no special/weird chars in the cc1:script attrs
writer.Write(String.Format(Script.TAG_FORMAT_DEFAULT,
s.Type,
Page.ResolveClientUrl(s.Src)));
}
}
}
writer.EndRender();
}
}
public class Script
{
public const String ATTR_TYPE_DEFAULT = "text/javascript";
public const String TAG_FORMAT_DEFAULT = "<script type=\"{0}\" src=\"{1}\"></script>";
public Script()
{
this.Type = ATTR_TYPE_DEFAULT;
this.Src = null;
}
public String Type { get; set; }
public String Src { get; set; }
public String Language { get; set; }
}
内容总结
以上是互联网集市为您收集整理的javascript – 如何在不重新编译的情况下使用ASP.NET捆绑和缩小?全部内容,希望文章能够帮你解决javascript – 如何在不重新编译的情况下使用ASP.NET捆绑和缩小?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。