【问题标题】:Detect if javascript is compressed with YIU compressor in Javascript检测是否使用 Javascript 中的 YIU 压缩器压缩了 javascript
【发布时间】:2011-08-03 16:43:22
【问题描述】:

我已经构建了延迟加载 javascript 以加快页面加载的结构。为了部署网站,我使用 YIU 压缩器来最小化脚本,也为了速度。将有两个版本的脚本,一个是压缩的,一个不是原始的。例如:example-min.js 和 example.js。一些 javascripts 只会在一个功能进来时才会被加载,有时它需要更多的脚本(插件的想法)。

无论如何,我想知道(如果需要其他 js 文件)“主机”js 文件是否被压缩,所以当它被压缩时,它会加载 js 文件的缩小版本。如果不是(在开发时)它会加载原始文件。

例如:

function myObject()
{
var o = this;

o.isJsMinified = function()
{ s =  o.isJsMinified.toString(),ss='s=  '; 
  return (s.indexOf(ss+'o.is')<0);
};

o.require = function( s, delay, baSync, fCallback ) // add script to dom
{
 var oo = document.createElement('script'),
 oHead = document.getElementsByTagName('head')[0],
 f = (typeof fCallback == 'function')?fCallback:function(){};
 if( !oHead )
  { return false; }
 oo.onload = function() {oo.id='loaded'; f(oo); };
 oo.type = 'text/javascript';
 oo.async = (typeof baSync == 'boolean')?baSync:false;
 oo.src = s;
 setTimeout( function() { oHead.appendChild(oo); }, (typeof delay != 'number')?delay:1 );  
 return true;
};

.....
.....

if( <new functionality found> )
{
  if( o.isJsMinified() )
   { o.require('new-min.js',800); }
  else { o.require('new.js',800); }
}

.....
.....

}

当您查看 jsIsMinified() 函数时,我使用一个技巧来检测函数本身(源)是否从空格(缩小版)中剥离。但是,firefox 有一个问题,它不会返回原始格式,因此无法检测到任何差异。

例如: // 由 YUI 压缩器压缩:

o.isJsMinified=function(){s=o.isJsMinified.toString(),ss='s=  ';return (s.indexOf(ss+'o.is')<0);};

Firefox 将显示:

function () {
    s = o.isJsMinified.toString(), ss = "s= ";
    return s.indexOf(ss + "o.is") < 0;
}

该函数在 Firefox 中失败,它总是“说”它没有被压缩。有人知道解决方法吗?

【问题讨论】:

  • 为什么 gs 对这个封闭的话题投反对票?
  • 不要篡改您的问题,尤其是已有答案的问题。我已在此处回滚您的编辑,但请不要再这样做了。

标签: javascript firefox tostring detect yui-compressor


【解决方案1】:

我真的认为你在这里把事情复杂化了。哇,你为什么不在你的服务器上创建两个文件夹,比如js/productionjs/debug。您的 javascript 文件中可能有一个标志,可以指示它是否有效或调试。喜欢

if( window.DEBUG ) {
    o.require('/js/debug/new.js',800);
}
else {
    o.require('/js/production/new.js',800);
}

考虑到这一点,即使是那些文件夹也是不必要的。您可以区分.min 与否。您真正需要做的唯一一件事就是在您的代码中设置一个全局 DEBUG 变量。

【讨论】:

  • 我并没有把事情复杂化,也许在我展示的例子中我会的。我明白你在说什么。但我不想用调试之类的东西来标记东西。
  • @Erwinus:问题是,您无法可靠地确定脚本文件是否被压缩。我的意思是,您当然可以尝试找出压缩文件中非常典型的内容,甚至注意压缩器在文件中留下的某种“注释”,但非常不可靠。
  • 它在其他浏览器中也能很好地工作。问题是火狐。 Function.toString() 返回格式化文本而不是“原样”。
  • 为什么不可靠?我总是使用相同的压缩机并获得相同的结果。您不能使用 cmets,因为它会被剥离 amd 这不是我试图比较的。
  • 并且在任何情况下它都不会失败,除非它会加载未压缩的文件。
【解决方案2】:

HTTP 标头将指定是否请求并启用压缩,但 there's no easy way to read them 因此您可能需要一个特殊的 Firefox 扩展来进行开发。

也许进行更改的正确位置是在服务器中,如果给定了某个标头(并且请求者 IP 地址是本地的),则将未缩小的脚本发送出去。

【讨论】:

  • 谢谢,但事实并非如此。您在谈论 gzip 压缩。
猜你喜欢
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 2011-04-04
  • 2010-11-27
  • 1970-01-01
  • 2012-09-17
  • 2012-01-29
  • 1970-01-01
相关资源
最近更新 更多