将您的Javascript放在.php文件中有什么好处?

时间:2009-06-15 19:17:40

标签: php javascript

我偶尔会遇到通过PHP文件包含一些Javascript的页面:

<html>
  <head>
    <script type="text/javascript" src="fake_js.php"></script>
  </head>
  <body onload="handleLoad();">
  </body>
</html>

fake_js.php 的内容可能如下所示:

<?php header('Content-type:  text/javascript') ?>

function handleLoad() {
    alert('I loaded');
}

包含这样的Javascript有哪些优点(或缺点)?

7 个答案:

答案 0 :(得分:13)

可以很容易地从服务器端设置javascript变量。

var foo = <?=$foo?>

我的项目中通常有一个php / javascript文件,我用它来定义需要在javascript中使用的任何变量。这样我就可以在javascript中轻松访问服务器端使用的常量(css颜色,非敏感站点属性等)。

编辑:例如,这是我正在处理的项目中config.js.php文件的副本。

<?php
require_once    "libs/config.php";
if (!function_exists("json_encode")) {
    require_once    "libs/JSON.php";
}
header("Content-type: text/javascript");
echo "var COLORS = ". json_encode($CSS_COLORS) .";\n";
echo "var DEBUG = ". ((DEBUG == true) ? "true" : "false").";";


?>

答案 1 :(得分:8)

如果您不需要,请不要使用它:

  

您需要保留的第一件事   心灵是 YAGNI 你不会   需要它。直到某个功能,   原则或指南变得有用   并且相关,不要使用它。

<强>缺点:

  • 增加了复杂性
  • 比静态文件慢。
  • 缓存问题(服务器端)
  • 可伸缩性问题(负载均衡器从繁重的PHP / Apache等进程中卸载静态文件)

<强>优点:

  • 用户特定的javascript - 可以通过在HTML的<head> </head>部分中使用正确的变量/参数进行初始化来实现
  • 页面特定的javascript - JS也可以推广使用参数
  • 从数据库创建的JSON(通常通过AJAX请求)

除非javascript真正独特(即JSON,参数/变量),否则你不会获得太多收益。但在每种情况下,您都应该最小化服务器端生成的JS数量,并最大化静态文件中的代码量。不要忘记,如果它是动态的,它必须一次又一次地生成/下载,所以它不是一个繁重的过程。

同时

  • 这也可用于最小化服务器配置量(例如,如果Web服务器不提供具有正确内容类型的file.js)

答案 2 :(得分:1)

上面给出的示例没有任何好处(除了可以访问.php文件的特殊部署方案,而不是.js文件,这些文件很疯狂但不是闻所未闻)。

也就是说,这种方法允许您通过php解析器传递JS - 这意味着您可以根据服务器变量动态生成JS。

答案 3 :(得分:1)

同意tj111。除了tj提到的,我还发现php生成的javascripts是一个很好的武器来对抗浏览器的缓存技巧。就在不久之前,我正在诅​​咒整个javascript,因为它经常被浏览器缓存。刷新页面对我没有帮助,不得不清除整个缓存以强制浏览器重新加载javascript文件。只要我在javascripts前面构建了一个php墙:

fake_js.php:

<?php 

header('Content-type:  text/javascript') 
include('the_real_javascript.js');

?>

一个全新的javascript总是出现在客户端。然而,这种方法显然只有在开发阶段才有用,因为它可以让开发人员在浏览器中加载正确的 javascript时非常头疼。当然,当连接到localhost时,重复加载同一文件的代价并不大。

在实时Web应用程序/站点中,欢迎使用客户端缓存来减少网络流量和整体服务器负载。

答案 4 :(得分:0)

Advantage(不是特定于PHP的 - 我在EmbPerl和JSP中使用这种技术)将能够在服务器端动态生成或调整/自定义JavaScript代码。

示例用法是基于DB表内容的数组填充。 或者应用本地化技术。

答案 5 :(得分:0)

如果您没有完整的服务器访问权限且无法打开gzip编码,那么将以下内容放入您的javascript文件中非常有用(注意:需要重命名为file.js.php或解析为PHP通过.htaccess指令):

<?php
ob_start( 'ob_gzhandler' );
header("Content-type: text/javascript");
?>
// put all your regular javascript below...

您还可以将其用于更好的缓存控制,访问者跟踪等,以代替服务器控制的解决方案。

答案 6 :(得分:-1)

绝对没有,恕我直言。我使用我编写的js框架来处理我需要访问的任何服务器端变量的设置。它基本上与在JavaScript中嵌入PHP相同,但更不含糊。使用此方法,您还可以将服务器端逻辑与html完全分开,远离javascript。这样可以产生更清晰,更有条理,耦合度更低的模块化代码。

您可以在html中执行以下操作:

<script type="text/javascript">

registry = {
    myString : '<?php echo $somePhpString; ?>',
    myInt    : <?php echo $somePhpInteger; ?>
}

</script>

然后在你的js中做这样的事情:

if (registry.myInt === 1) {
    alert(registry.myString);
}