0

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

无论如何,我想知道(如果需要其他 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);};

火狐将显示:

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

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

4

2 回答 2

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在代码中设置一个全局变量。

于 2011-08-03T16:51:29.440 回答
0

HTTP 标头将指定是否请求并启用压缩,但没有简单的方法来读取它们,因此您可能需要一个特殊的 Firefox 扩展来进行开发。

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

于 2011-08-03T16:47:00.693 回答