【问题标题】:Compression interrupting script压缩中断脚本
【发布时间】:2018-03-18 19:54:37
【问题描述】:

我有以下 JS(不是 jQuery),我想对其进行压缩(使用 header('Content-type: text/javascript') 保存在 PHP 文件中):

var $url = window.location.href;

    $url = $url.toLowerCase().replace(/^(http(s)?\:\/\/)/g, ''),
    $url = $url.split('/');

var $current_page = $url[$url.length - 1].replace(/(\?.*)?(\#.*)?/g, ''); // Current Page

document.addEventListener('DOMContentLoaded', function() {
    if ($current_page === 'index.html') {
        if (window.location.hash) {
            var $current_hash = window.location.hash.substring(1);
        } else {
            window.location.hash = '';
        }

        // Ignore the code above, the important part is right below:
        var $fp_imgs = document.querySelectorAll('img.-homepage-poster');
        $fp_imgs.forEach(function($fp_img) {
            var $imgs = [518966, 518967, 518968, 518969],
                $rand = Math.floor($imgs.length * Math.random()),
                $xmhr = new XMLHttpRequest();

            var response = function($e) {
                var $this = this,
                    $url_creator = window.URL || window.webkitURL,
                    $image_url = $url_creator.createObjectURL($this.response);
                $fp_img.src = $image_url;
            }

            $xmhr.open('get', '../imgs/' + $imgs[$rand] + '.jpg', true);
            $xmhr.responseType = 'blob';
            $xmhr.onload = response;
            $xmhr.send();
        });
    }
});

我使用ob_start 和以下正则表达式模式来压缩文件开头的代码:

ob_start(function($code) {
    // return $code; # If the compression causing errors, do not compress
    return preg_replace('(\s{2,})', ' ', preg_replace('/(?:(?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:(?<!\:|\\\|\')\/\/.*))/', '', $code));
});

当它没有被压缩时,一切都很好。但是当我使用该模式时,我在控制台中收到以下错误:

语法错误:意外标记:标识符

“缩小”输出:

var $url = window.location.href; $url = $url.toLowerCase().replace(/^(http(s)?\:\/\/)/g, ''), $url = $url.split('/'); var $current_page = $url[$url.length - 1].replace(/(\?.*)?(\#.*)?/g, ''); document.addEventListener('DOMContentLoaded', function() { if ($current_page === 'index.html') { if (window.location.hash) { var $current_hash = window.location.hash.substring(1); } else { window.location.hash = ''; } var $fp_imgs = document.querySelectorAll('img.-homepage-poster'); $fp_imgs.forEach(function($fp_img) { var $imgs = [518966, 518967, 518968, 518969], $rand = Math.floor($imgs.length * Math.random()), $xmhr = new XMLHttpRequest(); var response = function($e) { var $this = this, $url_creator = window.URL || window.webkitURL, $image_url = $url_creator.createObjectURL($this.response); $fp_img.src = $image_url; } $xmhr.open('get', '../imgs/' + $imgs[$rand] + '.jpg', true); $xmhr.responseType = 'blob'; $xmhr.onload = response; $xmhr.send(); }); } });

我该如何解决这个问题?

非常感谢

【问题讨论】:

  • 你从哪里得到这个压缩代码?
  • @MehdiBounya 移除 js cmets 我用了this answer,剩下的我写了
  • 也许你没有正确缩小 js 代码,你要找的词是 Minify,有一些库可以为你做到这一点
  • @MehdiBounya 可能,但我不是在寻找繁重或复杂的东西,我需要一些简单的正则表达式解决方案。这可能吗?
  • 当您在未压缩代码和压缩代码之间进行比较时,除了删除的 cmets,还有什么变化?你的线索就在那个比较中。

标签: javascript php compression


【解决方案1】:

问题是您的 JavaScript 代码有不正确的语句终止s。这是 JavaScript 缩小和意大利面条内的 PITA 的常见问题。

只是为了好玩,这里是带有您的代码的正则表达式示例: https://regex101.com/r/Iwvo4I/1/

查看上面 JS 中的第一个 var 语句。看来您已经终止了 var,而您并不打算这样做:

这个

var $url = window.location.href; <-----------LOOK HERE

    $url = $url.toLowerCase().replace(/^(http(s)?\:\/\/)/g, ''),
    $url = $url.split('/');

应该是

var $url = window.location.href, <-----------LOOK HERE

    $url = $url.toLowerCase().replace(/^(http(s)?\:\/\/)/g, ''),
    $url = $url.split('/');

下一个

查看response函数表达式的代码:

    var response = function($e) {
       //// ... 
    } // <--- PUT SEMICOLON HERE

因为这是一个 JavaScript 表达式,所以语句应该以分号结束。不是,但它在缩小时导致您的代码中断。

为了清楚起见,请将第一行末尾的 分号 替换为 逗号 以纠正您的编码错误。 并在响应函数声明后加分号

应该可以的。

【讨论】:

  • 仍然出现错误。我会用缩小的代码更新我的问题
  • 分号仍在第一行结束。您没有应用所需的修复程序。
  • 即使我这样做 var $url = window.location.href, $url = $url.toLowerCase().replace(/^(http(s)?\:\/\/)/g, \'\'), $url = $url.split(\'/\'); 我仍然得到错误。问题在于 blob,而不是 $url 变量
  • 您在 javascript 代码中遗漏了第二个分号。请重新阅读我的答案更新。另外,请,请,请发现分离所有这些代码的更好的软件开发概念。你无缘无故地制造了一场噩梦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 2017-10-26
相关资源
最近更新 更多