为什么不';用于(自定义)CSS和JS的PHP文件?

为什么不';用于(自定义)CSS和JS的PHP文件?,php,javascript,css,Php,Javascript,Css,为什么人们不为他们的

为什么人们不为他们的
CSS
文件制作文件?

添加到文件中可以让浏览器读取,您可以通过将
内容类型
属性设置为
文本/css
对css文件执行相同的操作

它允许您在其他语言中使用PHP的所有变量和方法。例如,允许您根据css中的用户首选项更改主题主颜色,或者预加载javascript在加载文档时可以使用的数据


使用这种技术有什么不好的方面吗?

PHP经常被用作生成动态内容的处理器。处理一个页面然后发送它需要时间。为了提高效率(包括服务器和编程时间),只有在静态文件无法成功实现预期目标的情况下,才会创建动态JS或CSS文件


我建议您仅在绝对需要动态数据库驱动处理器的帮助时才这样做。

运行PHP引擎无论在时间还是CPU方面都不会有零成本。由于CSS和JavaScript文件通常很少更改,让它们在引擎中运行以完全不做任何事情是毫无意义的;最好让浏览器在适当的时候缓存它们。

有时您可能需要动态创建javascript或样式


问题是Web服务器被优化为提供静态内容。使用php动态生成内容可能会带来巨大的性能损失,因为每次请求都需要生成内容。

有些人会这样做,更好的做法是使用php生成JS/CSS脚本并将其缓存到文件中


如果您使用PHP提供所有CSS/JS文件,那么您必须更多地调用PHP,这会产生更多的开销(cpu和内存),这在提供静态文件时是不必要的。最好让web服务器(Apache/nginx/lighttpd/iis等)完成它们的工作,为您提供这些文件,而不需要PHP。

坏的一面:很多,但仅举几个例子:

  • 这将非常缓慢:为每个请求构建自定义样式表会给服务器带来巨大的负载,而不是您想要的

  • 设计师创建CSS文件,程序员不应该(在某些情况下不应该被允许)。这不是他们的工作/专长

  • 在我看来,混合使用JS和PHP是我们可能犯的最大错误之一。由于jQuery是一个非常流行的库,使用
    $
    符号,它可能是bug和语法错误的巨大来源。除此之外:JS是一种完全不同于任何其他编程语言的语言。很少有人知道如何最大限度地利用它,让PHP开发人员编写大量JS脚本常常以眼泪告终
    JavaScript是一种功能性OO(原型)语言。不完全理解这些关键差异的人会编写糟糕的代码。我知道,因为我写了很多糟糕的JS代码

  • 实际上,你为什么要这么做?PHP允许您在生成页面时更改所有元素的类,只需确保这些类在css文件中具有相应的样式规则,并且颜色将根据您的需要进行更改,而不必发送各种文件、弄乱标题以及这种做法带来的所有头痛问题


如果你想知道更多不应该这样做的理由,我至少可以想出几十个
也就是说:我只能想到一个您考虑这样做的原因:它使客户端缓存脚本引起的问题变得不那么重要。这并不是说一开始就应该成为一个问题,但嘿…

人们做这件事的频率比你想象的要高。您根本看不到它,因为通常这种技术与URL重写结合使用,这意味着浏览器无法区分静态服务的.css文件和PHP脚本生成的动态样式表

然而,有几个强有力的理由不这样做:

  • 在默认配置中,Apache将PHP脚本输出视为“随时可能更改”,并设置适当的头以防止缓存(否则,动态内容将无法真正工作)。然而,这意味着浏览器不会缓存你的CSS和javascript,这是不好的——它们会在网络上为每一个页面加载重新加载。如果你每秒有几百次页面加载,这些内容绝对重要,即使你没有,页面的响应性也会受到相当大的影响
  • CSS和Javascript一旦部署,很少会发生更改,而使其动态化的原因也非常少
  • 运行PHP脚本(即使只是启动解释器)比只提供静态文件要昂贵,因此除非绝对必要,否则应该避免使用它
  • 要确保您输出的Javascript是正确和安全的,这是非常困难的;为Javascript转义动态值并不像您想象的那么简单,如果这些值是用户提供的,那么您就是在自找麻烦
还有一些更容易设置的替代方案:

  • 编写一些样式表,并动态选择正确的样式表
  • 根据类名制定样式表规则,并在HTML中动态设置这些规则
  • 对于javascript,在包含静态脚本之前,在父文档中定义动态部分。最典型的场景是在文档中设置一些全局变量,并在静态脚本中引用它们
  • 作为构建/部署过程的一部分,将动态脚本编译为静态文件。通过这种方式,您可以在CSS中轻松使用PHP,但仍然可以提供静态文件
如果您想使用PHP动态生成CSS:

  • 覆盖缓存头以允许浏览器和代理