【问题标题】:Including all /javascript/*.js from a directory包括目录中的所有 /javascript/*.js
【发布时间】:2011-09-16 13:35:11
【问题描述】:

谁能告诉我在目录中包含一组文件的最佳做法?

例如,如果我有一个 /javascript 目录,其中有 10 个 javascript 文件,我将如何加载整个目录?

这个问题现在没有实际意义,但供将来参考;

我使用以下方法以相同的方式读取文件:

<?php
    session_start();

    // Auto import all js files in the directory.

            $files = glob("*.js");
            sort($files);                   

            $jsFiles = array();
            for($i = 0; $i < count($files); $i++){
                error_log('Auto-Opening: '.$files[$i]);
                $tempString = file_get_contents($files[$i]);
                //error_log('Auto-Opened Content: '.$tempString);
                array_push($jsFiles, $tempString);
            }
?>

对不起,我想这需要澄清一下:

我包含的代码用于我项目的一个完全独立的部分,它包含用于我处理目的的 javascript 文件目录的 RAW 字符串格式。你不必担心我为什么要这样做。

可以使用它来添加script 标签,并回显这些文件,但我正在寻找一种更快更优雅的方式来包含目录。与上面的代码不同(我的代码永远不会执行其 javascript。我只是从文件中创建字符串并将其发送给 JS 进行解析)。

还请注意,如建议的那样:

$files = glob("{directory/*.js}",GLOB_BRACE);
                for($i = 0; $i < count($files); $i++){
                    include($files[$i]);
                }

只会将这些文件回显到屏幕上,没有script 标记。

【问题讨论】:

  • 您阅读内容而不是输出&lt;script src="..."&gt; 标签是否有原因?
  • 我想它是串联;十点提供一份文件。
  • 如果你想做一个包含,例如在文件中使用一些函数 -> 创建一个 single_file.php 并调用其中的所有内容,使用
  • 也许他想减少http请求的数量:)
  • 是的,所以这三件事都不是。我正在将目录作为字符串读取,因为我正在使用原始 JS 进行一些解析(但这与我在这里所做的事情是分开的)。我知道使用 php 通过静态编码来包含一堆文件,我想在动态的目录基础上进行。

标签: php javascript include


【解决方案1】:

我只会在文件上调用include(),而不是调用file_get_contents()。这有两个主要原因/好处:

  • 在输出文件之前,您没有将文件加载到内存中(无论如何在 PHP 中)。这样可以节省服务器资源(尽管数量很少)。
  • 您可以将 PHP 代码放入您的 JS/CSS 等并对其进行评估。这意味着您可以通过 PHP 在服务器端预定义 JS 变量,将颜色主题应用于您的 CSS 以及许多其他事情。

【讨论】:

  • 你是说如果我循环访问 $files 并调用 include($files[i]),它应该能按我的预期工作吗?
  • readfile() 我相信比file_get_contents() 更快,并且不会像include 那样执行PHP(如果出于某种原因,有的话)。
  • 是的,就像 HTML 模板一样。归根结底,这一切都只是纯文本......在包含之间输出一个 CRLF 可能是值得的,这样您就不会破坏没有尾随新行的文件中的任何内容。
  • @Wesley 提出了一个很好的观点 - 如果您不想评估文件中的任何 PHP 代码,readfile() 会更好/更快。差异是微不足道的,但一切都加起来......
  • 仅供参考,include 相当于:eval('?&gt; . file_get_contents('file.php') . '&lt;?php;');,并且可以慢 20%。
【解决方案2】:

PHP 不会为您输出&lt;script&gt; 标签。它不知道 JS 是什么,除了一大块文本。您的 glob 版本很接近,但必须是:

$files = glob("{directory/*.js}",GLOB_BRACE);
for($i = 0; $i < count($files); $i++){
    echo '<script type="text/javascript">';
    include($files[$i]);
    echo '</script>';
}

【讨论】:

    【解决方案3】:

    我可以用它来添加脚本标签,并回显这些文件,但我是 寻找一种更快更优雅的方式来包含目录。不像 上面的代码(我的代码永远不会执行其 javascript。我 只需从文件中创建字符串并将其发送到 JS 解析)。

    如果您希望 PHP 脚本的输出作为 javascript 执行,您需要添加适当的标头:

    header("Content-type: text/javascript");
    foreach (glob('/path/to/files/*.js') as $file)
    {
        readfile($file);
    }
    

    我正在将目录读取为字符串,因为我正在做一些解析 使用原始 JS(但这与我在这里所做的事情是分开的)。一世 知道使用 php 通过静态编码来包含一堆文件 在,我想按目录进行,这是动态的。

    除非您有某种文件命名约定,否则请记住,文件的顺序将基本上仅限于您可以使用 php 的文件名数组排序函数执行的操作。 JS 和 CSS 通常非常依赖于以特定顺序执行或读取的代码或文件,因此取决于您实际尝试完成的是什么(仍然很不清楚),这可能是一个糟糕的想法。

    【讨论】:

    • 不抱歉,我已经输出缓冲,我正在寻找相反的东西。我希望 php 文件打印并执行 javascript。
    • 好的,然后从示例中删除ob_* 函数,然后怎么回事?哦,等等,我想我明白了 - 请参阅编辑。
    • 我想你可能就在这里。我会看看添加标题是否有效。我理解您对执行顺序的担忧,这是有效的。然而,允许我这样做的目录的不同性质,因为每个目录只包含同一“级别”上的类,因此可以按任何顺序执行。
    • 只有 如果您将 php 脚本引用为 javascript 文件,即 &lt;script src="/js/dir/my-script.php"&gt;&lt;/script&gt;,标头才有效。仍然真的不清楚您要做什么,您在哪里以及如何运行脚本,以及您对输出做了什么。我不在乎你用它做什么,但是当问一些模糊的问题时,你不能只是假设其他人都知道你在追求什么。你必须明白你的想法是非常不正统的,有很多很好的理由。
    • 明确一点:我不在乎为什么,但我需要知道如何才能回答这个问题。如果您include 将带有 php 的 glob 运行到您的 HTML 中的文件,那就是一个答案。如果您使用脚本标记引用文件,那是另一个答案。你没有具体说明。无需对试图帮助您的人大发雷霆,例如在您的帖子中大喊大叫。
    【解决方案4】:

    不要。

    使用 Closure compiler 将您的 Javascript 文件编译成一个单一的、缩小的源代码,并使用您的 HTML 引用来代替。

    【讨论】:

    • @nephi12:哎呀!对不起。我想你写错给我了,或者我看错了。现在我已经删除了整个内容。该死的......
    • 我只是说你是对的,OP 应该向你道歉,他们表现得像个孩子。我应该说“对 OP .....”但我没有。对不起。
    • @nephi12:感谢您支持我。 :-) 你是对的,我现在觉得很傻。
    • Yay 用于 Stack Exchange 数据资源管理器! Comments immortalised
    • 哇。 1. 我不知道存在... 2. 嗯...这是否意味着...再见!
    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2023-01-04
    • 2017-03-25
    • 2010-11-19
    • 1970-01-01
    • 2018-05-02
    相关资源
    最近更新 更多