我相信有两个动机(通常基于之前关于该主题的对话)
- 每页都有ac#项目太痛苦了。
- 您希望最小化每个页面中加载的脚本数量。
为了解决#1,曾经有一个解决方案可以将单个 c# 项目编译成位以生成多个脚本,但现在已经不存在了。它消失的原因是,由于 c# 编译器一次编译一个完整的项目,而 script# 一次编译项目的一部分,因此很容易拥有不同的语义。然而,一切都没有丢失 - 你有几个选择。
自定义 msbuild 过程 - 专门更改 csproj 以使用代码子集多次调用 ScriptCompilerTask。您负责确保每个代码子集都能成功编译,因为 c# 编译器提供的验证意义不大。
使用 Script# 编译器 API 编写自定义 msbuild 任务。您可以在 github [1] 的 script# 存储库中看到 msbuild 任务的实现,并以此为基础……您甚至可以回顾源代码的历史,了解 msbuild 任务是如何提供此功能的。
要解决 #2,最好根据您的应用场景考虑哪些有意义的脚本集并以这种方式加载它们,而不是每页严格地一个特定的脚本文件(一旦考虑到缓存、http 请求等)。 )。
因此,假设您将多个页面的脚本组合成一个脚本。现在解决您在给定页面的情况下加载正确脚本的问题。这是我所做的:
在我的页面中,我这样注释 body 标签:
<body id="editPage">
在我的脚本#中,我有以下内容:
internal static class EditPage {
static EditPage() {
jQuery.OnDocumentReady(delegate() {
if (Document.BodyElement.ID == "editPage") {
// Code you want to run on editPage
}
});
}
}
有多种方法可以实现这一点,但您不必严格地在每个页面中编写一点代码来调用正确的 API。希望这可以让您了解脚本中所有逻辑自包含的替代方案。
script# 中的一个示例(请参阅https://github.com/nikhilk/scriptsharp/blob/cc/samples/AroundMe/AroundMe/Page.cs#L38)执行类似于有条件运行代码的操作。
这样做的一个很好的副作用是您的大部分代码都可以转换为内部类,因为视图永远不会直接调用脚本。而是脚本以不显眼的方式向页面添加行为。好处当然是大大增加了脚本的最小化。
[1] https://github.com/nikhilk/scriptsharp