在ASP.NET / MVC5中提供动态样式表的标准或快速方法是什么?

时间:2014-11-12 16:40:07

标签: css asp.net angularjs asp.net-mvc-5 less

对于使用ASP.net,MVC5和Angular JS的大型单页Web应用程序,我希望提供动态生成的样式表。该应用程序将拥有大量用户(> 1000s),这些用户可以单独设置大约10个变量。这些包括一些颜色和徽标。这些颜色和徽标将在较少的样式表中使用,以生成许多类/样式。样式表是从很多文件中编译出来的,大约有50个.less文件。

我打算使用以下方法:

  1. 在加载index.html后,在用户登录后,我调用ASP操作来加载样式表<link href="Give/Me/My/Dynamic/Stylesheet/For/User/12122312">
  2. 控制器操作将发挥作用并从数据库中获取10个用户变量
  3. 服务器将使用.dotless来编译less to css
  4. 服务器返回字符串
  5. 这种方法可行,但恐怕性能不会那么好。我的问题:

    1. 无点是最快的编译方式吗?
    2. 数据库调用+编译需要多长时间?
    3. 这是其他应用程序执行此操作的方式吗?
    4. 我正在寻找是否有办法缓存css请求 - 也许检查自上次编译css以来是否有变化。
    5. 什么行不通:

      1. 将less编译为css,然后更改css中的变量(每次保存编译)。样式表中的一些颜色将基于变量。 (例如减轻(#333,0.3)等。)
      2. 使用静态样式表,然后在HTML文档的头部覆盖这些样式表。将涉及全部定制样式!
      3. 其他一些想法:

        This solution似乎做同样的事情,但是在构建时编译:

        This solution将变量保存到静态文件中并将其用于编译。这样可以节省数据库调用,但是目录会挤满大量用户。

1 个答案:

答案 0 :(得分:2)

您计划的方法听起来不错。至于你的具体问题:

  1. 无点是最快的编译方式吗?

    “最快”是相对而有争议的。要知道的唯一方法是使用某种基准测试在您的生产机器上运行此选项和任何可用的替代方法。即使这样,外部因素,例如服务器获得多少负载,同时处理多少请求等,也会影响这些基准测试。例如,可能一种解决方案是“更快”处理理想情况,但是当服务器实际上被征税时,它具有很大的开销导致它比另一种解决方案运行得慢得多。总的来说,任何人都不可能给你任何明确的答案,实际上,即使是那个担心这个问题的人也可能为时过早。如果它成为生产中的问题,那么你可以开始研究替代品。

  2. 数据库调用+编译需要多长时间?

    任何人都完全不可能给出明确的答案。在这个相对简单的问题中涉及的变量太多了。你用的是什么数据库?什么版本?它正在运行的服务器的规格是什么。该服务器上还运行了什么?你是如何配置数据库服务器的?你在运行什么样的查询?涉及多少个表?返回的结果集的大小是多少?有哪些类型的网络基础设施?你的延迟是多少?您的网络基础架构处理负载的能力有多大?如果我足够长并且那只是数据库调用部分,那么我可能会问更多问题。我不指望回答这些问题;我只想指出1)没有人可以为你回答这个问题2)你将不得不做大量的研究来自己提出这些答案。

  3. 这是其他应用程序执行此操作的方式吗?

    这是高度投机的。首先,它假设这有点普遍,当它可能是什么时候。在我20多年的网络开发中,我还没有遇到需要动态样式表的场景。当然,这些年来很大一部分样式表甚至都不存在或至少没有大量使用,仅仅因为我没有需要并不意味着它仍然没有完全有效的商业案例。我理解想要找到一个可接受的模式或最佳实践的愿望,但这里的样本集可能很小,没有这样的东西存在。相信你的直觉。以有意义的方式构建事物。然后测试,改进和重构。这真的是我能给你的最佳建议。

  4. 我正在寻找是否有办法缓存css请求 - 也许检查自上次编译css以来是否有变化。

    这个很容易。只需确保在返回响应之前设置相应的响应标头。 Expires真的是你的首选。如果样式表几乎从未针对用户进行更改,那么您可以设置远期Expires标头,并且客户端的浏览器应该缓存它,要求所有这些基础架构不需要再做一段时间。如果变更能力是可变的(任何时候用户更新设置,他们需要一个新版本,这可能是一时兴起),那么你仍然可以使用远期Expires标头并使用缓存-busting querystring param,它将强制浏览器获取新的副本。在渲染样式表的链接时,一个不错的选择可能是为设置添加上次修改日期。如果用户未修改任何内容,则日期不会更改,并且将使用原始缓存版本。但是如果日期发生了变化,它将看起来像是浏览器的新URL,并且会以新的方式获取。