【问题标题】:How to minify "a priori" php files that output javascript?如何缩小输出javascript的“先验”php文件?
【发布时间】:2018-01-21 04:43:09
【问题描述】:

我们有一些输出 JavaScript 代码的 PHP 文件。我知道事情可能会有所不同,但这是在项目开始时做出的决定。

我们有几个 PHP 文件可以生成 Javascript 文件,例如:

<?php Header("content-type: application/x-javascript");
if(strlen($_GET['country']) != 2){ exit;} //avoids code injection 
include_once($_SERVER['DOCUMENT_ROOT'].'/countries/'.$_GET['country'].'.php');?>

/*Define GLOBAL Javascript variables*/
var COUNTRY = "<?php echo $GLOBALS["country"]; ?>";
/*Language code according to ISO_639-1 codes*/
var LANGUAGE = "<?php echo $lang_CT[$GLOBALS["country"]]; ?>";
...

先验缩小该代码的最佳方法是什么,即不是在调用或回显文件时,而是在服务器上,使用 Javascript 缩小规则?

编辑:我一直在想,事情可能实现起来很复杂,我想象一下这种无效 JS 代码的情况:

var str = <?php echo "'a string';"; ?>

输出有效的 JS 代码

var str = 'a string';

但基本上我想知道是否有任何基本的缩小选项,以删除 双空格、cmets 和断线,这不会影响生成的 JS 代码。

【问题讨论】:

  • 有什么理由要缩小 php 代码吗?由于它无论如何都会在服务器上运行,因此您不需要节省数据传输(缩小代码的主要原因)
  • if(strlen($_GET['country']) != 2){ exit;} 如何避免代码注入?
  • @DanLynch 我相信 OP 想要缩小 php 生成的 Javascript。
  • @BeetleJuice ... 曾经尝试将一些无效的路径名放在两个字符中,以寻址完全不同的文件?
  • @JoãoPimentelFerreira 我一直对你缩小先验的意图感到困惑:你的意思是什么?如果由于某些请求而不想在运行脚本时缩小,您可以使用一些服务器端 CLI 来例如作为安装脚本的一部分运行它。这仍然会在服务器上创建文件,这在创建文件时是完美的。如果在安装脚本中这样做不够灵活,您可能需要使用一些服务器端缓存来缩小文件,除非它在先前的请求中被缩小。这需要将 Javascript 代码再次写入文件。

标签: javascript php minify


【解决方案1】:

AFAIK 不支持将此作为 PHP 的集成功能实现,因为您显然希望缩小由于未驻留在进程指令 &lt;?php?&gt; 中而实际上被 PHP 忽略的代码。因此,您将需要使用另一个工具来处理您的 PHP 代码。如果这也是用 PHP 编写的,我可能会尝试以下代码片段:

$sequence = preg_split( '/()/', $phpFileCode, null, PREG_SPLIT_DELIM_CAPTURE ); $isPHP = 假; foreach ( $sequence as &$segment ) { 开关($段){ 案例 '': $isPHP = 假; 休息; 默认 : if ( !$isPHP ) { $segment = preg_replace(数组( '#\s*/\*.*?\*/\s*#', // 匹配多行 cmets '#\s*//.*$#m', // 匹配单行 cmets '#\s+#', // 匹配任意的空白序列,包括。多个空行 ), 大批( '', '', '', )); } } } $phpCodeMinified = implode('', $sequence);

注意:这段代码只是一个涂鸦......我没有测试过,但我认为它指向了一些非常简单的方法。

可能会采用更精细的方法

  1. 使用此代码将所有 PHP 进程指令序列替换为 Javascript 中的一些特殊全局变量名称,而不是检测不属于 PHP 的段。例如。使用像window.__PHPreplacedXXXX 这样的名称,其中 XXXX 是数组的数字索引,整个替换的 PHP 段已被推送到下面的步骤 3 中以进行恢复。通过使用全局名称,它们不会在下一步中被破坏。

  2. 使用一些 JS 压缩器(例如之前引用的 uglify 或 minify)来处理生成的代码。

  3. 处理生成的缩小 JS 文件并恢复以前用全局名称替换 PHP 序列。

这可能会启用更激进的缩小,但可能会在缩小器优化和重组代码时导致 JS 代码损坏。虽然坚持使用“简单”缩小器时风险并不高。

【讨论】:

    【解决方案2】:

    这就是我要做的;使用Heredoc将所有的Javascript放在一个变量中,例如:

    $js = <<<EOD
    console.log('Valar Morgulis');
    
    console.log('Valar Dohaeris');
    EOD;
    

    然后使用可以在 Github 上找到 hereminify_js() 函数,或类似的东西。函数如下:

    function minify_js($input) {
    if(trim($input) === "") return $input;
    return preg_replace(
        array(
            // Remove comment(s)
            '#\s*("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')\s*|\s*\/\*(?!\!|@cc_on)(?>[\s\S]*?\*\/)\s*|\s*(?<![\:\=])\/\/.*(?=[\n\r]|$)|^\s*|\s*$#',
            // Remove white-space(s) outside the string and regex
            '#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\'|\/\*(?>.*?\*\/)|\/(?!\/)[^\n\r]*?\/(?=[\s.,;]|[gimuy]|$))|\s*([!%&*\(\)\-=+\[\]\{\}|;:,.<>?\/])\s*#s',
            // Remove the last semicolon
            '#;+\}#',
            // Minify object attribute(s) except JSON attribute(s). From `{'foo':'bar'}` to `{foo:'bar'}`
            '#([\{,])([\'])(\d+|[a-z_][a-z0-9_]*)\2(?=\:)#i',
            // --ibid. From `foo['bar']` to `foo.bar`
            '#([a-z0-9_\)\]])\[([\'"])([a-z_][a-z0-9_]*)\2\]#i'
        ),
        array(
            '$1',
            '$1$2',
            '}',
            '$1$3',
            '$1.$3'
        ),
    $input);
    }
    

    minify_js($js); 会为您提供缩小的 JS。您可以在 Heredoc 中使用变量,更多信息here

    【讨论】:

    • 但是当文件被回显时它会缩小,而不是在服务器上先验
    • @JoãoPimentelFerreira 您在服务器上运行 JavaScript 吗?通常 JavaScript 被用作客户端语言,所以在 echo 上缩小它是你想要的。
    • 我知道 Javascript 是客户端,而 php 是服务器端,但是在回显时缩小需要时间,而且处理时间对我们来说非常重要,所以这不是一个选项。我想知道是否有任何基本的缩小选项,例如双空行、cmets 和断线。可以直接对 PHP 文件进行操作。
    • @JoãoPimentelFerreira 所以你的意思是你想缩小 PHP 文件中的所有 JavaScript?类似于将每个生成 js 的 PHP 文件作为生产的一部分传递给一个额外的 PHP 脚本来缩小?
    • @JoãoPimentelFerreira 如果您严重挤压到运行基本正则表达式缩小“太多”的地步,那么您首先不会使用 PHP 生成 JS 文件,您将拥有预生成的JS文件如en.js,fr.js...
    猜你喜欢
    • 2013-01-28
    • 2011-11-26
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多