• 推荐
  • 评论
  • 收藏

【前端优化】通过六种方法提高网站访问速度

2022-11-28    6073次浏览

1.把你的 .js 库文件地址替换成 Google CDN的地址 ::


(google apis目前在中国地区访问不是很稳定,不是很建议使用这条。) 

随着 jquery 和 mootools 等js库的使用需要加载的.js文件越来越多也越来越大,通常传统的网站是上传到网站本身的目录。但对于一个接近70多KB的jquery.js体积确实不利于网站响应速度的提升,此时就应该使用Google API .

把你的 http://www.cnblogs.com/jquery.x.x.js 替换为 http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js的意义在于当一个用户访问过使用 google api 的网站之后,再次访问其他调用了该api地址的网站就不需要再次加载该文件了。从而达到提速的目的。

不单是jquery库,其他诸如mootools  yui 也可以使用这种方式。
推荐一个网站 ( http://scriptsrc.net/  ) 这个网站收集Google 提供的 js API路径。直接点击复制就可以获取到最新版的文件路径。




2.精简和优化你的 js 和 CSS ::

虽然有了缓存和gzip保驾护航,但是对于 js 和 css  的优化却也是必须的。我们写的javascript脚本和 css 代码都是经过缩进和换行的,适合人类阅读,但是浏览器执行这些脚本不并需要这些无意义的空格和换行。所以我们应该去除这一些空格换行,甚至缩短 javascript 和 css 里面的变量。诸如此类的优化工具有 YUI Compressor 和 Closure Compiler 。这两个工具都是基于 java 的,使用应该安装jdk并且设置 JAVA_HOME 。(对于非程序员的网站管理员而言确实有点困难)

推荐一个地址 ( http://scriptcode.info/

此工具可以不用在本地安装jdk,直接上传 js 和 css 文件进行压缩,可选择是采用 YUI Compressor 或 Closure Compiler 。

通过 YUI Compressor 或 Closure Compiler 和 压缩的之后的代码如

function hello(name) {
  alert('hello 博客' + name);
}
hello('园');

它会变成 

function hello(a){alert("hello 博客, "+a)}hello("园")

把你的缩进和空行去掉的同时也缩短里面的变量名称,这种优化方式是不可逆的,所以使用这两种压缩之前请备份一份源文件方便以后的修改。




3.GZIP 压缩你的 JS 和 CSS 文件 ::

压缩js和css可以通过服务器动态脚本进行也可以更简单的使用apache服务器可以在网站根目录 .htaccess 中加入以下代码

<IfModule mod_deflate.c>

AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-javascript application/json
Header append Vary Accept-Encoding
</IfModule>

这段代码的意思是调用服务器的压缩模块对以上文件输出之前进行GZIP压缩,gzip的压缩之后所有文件都应该能减少30%以上的体积。特别是对于大量使用js的博客有了gzip保驾护航之后速度能提高不少。




4.缓存你的 js 和  CSS 文件 ::

在网站根目录 .htaccess 中加入以下代码
<ifmodule mod_expires.c>
<filesmatch "\.(jpg|gif|png|css|js)$">
ExpiresActive on
ExpiresDefault "access plus 1 year"
</filesmatch>

这段代码的意思是对 jpg|gif|png|css|js 发送 header 缓存头,进行一年的缓存、在浏览器不使用 ctrl+F5 强制刷新时,会一直缓存到时间时间结束,唯一遗憾的是如果你更改了js或者css文件必须把以前的路径或者文件名更改,可以这样 base.js?ver=(x) 这种方式下次浏览器就会自动读取并缓存。


5.使用css sprites合并图片

 一个网站经常使用小图标和小图片进行美化,但是很遗憾这些小图片占用了大量的HTTP请求,因此可以采用sprites的方式把所有的图片合并成一张图片 ,http://csssprites.com/ 可以通过这个网址在线合并,也可以在ps中合并。

更多 css sprites 的资料请查看 http://baike.baidu.com/view/2173476.htm

 


6.优化你网站图片(图片)::

大量使用的图片和图标虽然可以给网站带来美轮美奂的效果,图文混编更是一种非常绚丽的博文展现方法。可图片的体积确实不是很给力,jpg是一种有损压缩格式,而png虽然是无损的缺憾是体积颇大。为了减少图片体积达到最快的下载速度,每一张图片上传前应该优化一下体积.专注于前端的 yslow 有一个工具叫  smushit 

http://www.smushit.com/ysmush.it/ 

此工具是一个无损压缩图片的工具,可以把你的图片在保持原质量不变的前提下优化体积。而这种优化体积通常在 10% 以上.意味着
一张30KB的图片优化后只有 27KB 或者更少…… 

 

总结: 

以上6种优化方法都是前端的,前端优化的意义在于减少http请求,减少网站前端程序组成的体积。

其实在后端优化也必不可少减少更多的数据库查询,通过诸如memcache内存缓存进行常调用用的数据缓存才能获得最快的速度。

冒着被人骂的风险发来主页,要是我火星了。请无视我吧……

jquery 1.5 发布的时候 john resig 大神说所用的代码优化程序从Google Closure切换到UglifyJS,新工具的压缩效果非常令人满意。 UglifyJS 是一个服务端node.js的压缩程序。据说很黄很暴力……

我测试了一下压缩率确实比较高。 所以值得写篇文章推荐下。

 

-------------------------------------------------------------------------------------------- 

你也可以尝试一下在线版的Uglifyjs: http://scriptcode.info/

--------------------------------------------------------------------------------------------  

如果你对 uglifyjs 有兴趣可以按照以下安装方式进行安装。

1. 安装 node.js 环境 (这个不用我教了吧,网上教程一大堆哦。) 

2. 进入 https://github.com/mishoo/UglifyJS  右上角 “Download” ZIP下载整个包。

3. 解压打开 UglifyJS/bin/uglifyjs

4. 找到

global.sys = require(/^v0\.[012]/.test(process.version) ? "sys" : "util");
var fs = require("fs");
var uglify = require("uglify-js"), // symlink ~/.node_libraries/uglify-js.js to ../uglify-js.js
    jsp = uglify.parser,

    pro = uglify.uglify; 

 替换为

global.sys = require(/^v0\.[012]/.test(process.version) ? "sys" : "util");

var fs = require("fs");
require.paths.unshift(__dirname + "/../");
var uglify = require("index"),
jsp = uglify.parser,
pro = uglify.uglify;

 5.  cd 命令到 UglifyJS/bin/ 目录。执行 ./uglifyjs  xx.js  如果安装成功会把你的压缩代码直接显示在命令行。

你可以通过如下命令形式  ./uglifyjs 1.js 2.js 把 1.js 压缩后的代码保存到 2.js

  至此 uglifyjs 安装完成,我还写了一个PHP类。可以调用 uglifyjs 进行压缩

<?php
/*
------------------------------------
# code by https://fengyin.name
# DEMO http://sweet.fengyin.name/
# Dual licensed under the MIT
------------------------------------
*/

$uglifyjs = new uglifyjs(array(
 
'node_home'=>'/usr/local/bin/node',
 
'uglifyjs_path'=>'/usr/UglifyJS/bin/uglifyjs', //uglifyjs压缩工具的路径。
 // -------- 附加的参数 --------- //

 'prefix'=>'-b', //输入的参数 -b 是格式化 不输入为压缩,还有更多请参考命令用法。
 'append'=>''//保存文件,如果为空就是直接在命令行输出结果。
 ));
$results =  $uglifyjs ->compress($_FILES['file']['tmp_name']);

//////////////////////////

class uglifyjs{
        
function __construct($options = array()) {
            
$this->options = $options;
        }
       
function args($option) {
            
return $option['node_home'].' '.$option['uglifyjs_path'].' '.$option['prefix'].' '.$option['file'].' '.$option['append'];
   
        }
        
function exec($cmd) {
            
exec($cmd.' 2>&1',$out, $status);
            
return json_encode(array(
            
'shell' => $cmd,
                
'output' => implode("\n",$out),
                
'status' => $status
            ));
        }
        
function compress($file) {
            
$this->options['file'= $file;
            
return $this->exec($this->args($this->options));
        }
    }

?> 

文章最后附上 uglifyjs 的命令行中文说明

限于自己的英语水平超级烂,请诸位将就看看就行。  

有一些我都不明白的,就没有翻译,还有一些翻译错的,请多多包涵,一切以英文原版为准。

以下仅供参考~~ 不对翻译的准确性负责。

) 

使用:
这是一个脚本助手(工具)-bin/uglifyjs-使用这个库可以用来把一个脚本压缩到最小。简介:
uglifyjs [ 选项... ] [ 文件 ]
 文件参数应该放在选项后面,uglifyjs 会读取文件中的javascript代码进行处理。
 如果你不指定输出的文件名,那么他会把处理后的内容输出到命令行中。
 例:  uglifyjs 1.js 2.js   会创建一个 2.js 文件把 1.js处理完毕的内容输入到这里
 例: uglifyjs 1.js        会读取1.js内容,并把结果输出到命令行中。
支持的选项:
-b or --beautify — 参数 -b 或者 --beautify 用于美化(格式化)代码。美化之前会压缩代码(未验证。)
-i N or --indent N — 缩进级别空格数
 
 例:uglifyjs -b 1.js 2.js  会把1.js的内容格式后输出到2.js
-q or --quote-keys — quote keys in literal objects (by default, only keys that cannot be identifier names will be quotes).
 
-nm or --no-mangle — 变量名不缩短,意味着不会把代码的变量名缩短为 abcdefg 
-ns or --no-squeeze — 不使用ast_squeeze()(可以使各种优化之后的代码更小,更具有可读性。)
-mt or --mangle-toplevel — mangle names in the toplevel scope too (by default we don’t do this).
 
--no-seqs — 当ast_squeeze()被调用的时候(除非你添加了--no-squeeze 参数才不会被调用)它将减少在一个代码块中重复声明的行。例如:“a = 10; b = 20; foo();”将被重写为“a=10,b=20,foo();”。在各种场合,这将允许我们丢弃代码块中的括号(在一些语句块变成一个独立的声明行之后)。这是默认的,因为经我们测试,它似乎更安全并且能节省几百bytes,但加上--no-seqs 后将被禁止。
--no-dead-code — 默认情况下,UglifyJS将会删除代码中明显无法访问的语句(如 return , throw , break 或者continue语句 ,以及一些不是函数/变量的的声明)。通过这个选项可以禁用掉这个优化功能。
-nc or --no-copyright — 默认情况下,uglifyjs将在生成的代码中保留初始的一些标记(假设版权信息等)。如果你设置这个参数将被禁止。
 
-o filename or --output filename — 将结果输出到一个指定文件名的文件中。如果没有这个参数,结果将会被输出到命令行
-
-overwrite — 如果代码是从一个文件中读取的(不是直接标准输入的)并且使用了--overwrite参数,那么结果也将会被写进相同的文件中去。
--ast — pass this if you want to get the Abstract Syntax Tree instead of JavaScript as output. Useful for debugging or learning more about the internals.
--ast — pass 如果你要获取一个用来取代javascript输出的抽象语法树,这些参数会在你进行调试或学习内部组件时很有用。
              
-v or --verbose — output some notes on STDERR (for now just how long each operation takes).
-v or --verbose — output 一些标准错误提示(显示每一次花费多久)
--extra — enable additional optimizations that have not yet been extensively tested. These might, or might not, break your code. If you find a bug using this option, please report a test case.
当你发现BUG时你可以增加一个中断点用来对还没有彻底的测试的代码进行优化,你可以使用这个选项来生成一个测试用例。
 --extra — enable 
 
--unsafe — enable other additional optimizations that are known to be unsafe in some contrived situations, but could still be generally useful. For now only this:
foo.toString() ==> foo+””
想foo.toString() 这种用法 也是可行的,但是存在一些人為的不安全的情况,这事也需要添加一些优化比如:  foo+””
 
--max-line-len (default 32K characters) — add a newline after around 32K characters. I’ve seen both FF and Chrome croak when all the code was on a single line of around 670K. Pass –max-line-len 0 to disable this safety feature.
在超过大概32K字节的时候你要增加一行,我有发现过在火狐和chorme下档代码一行超过670K的时候它会发出报警声。通过–max-line-len 0 去静止这个安全属性
--reserved-names — some libraries rely on certain names to be used, as pointed out in issue #92 and #81, so this option allow you to exclude such names from the mangler. For example, to keep names require and $super intact you’d specify –reserved-names “require,$super”.
--reserved-names — 些类库会依赖于特定的名称去使用,比如:#92 和#81 所以这个选项允许你去排除一些关键字。
if ($ != jQuery) { $ = jQuery.noConflict(); } var isLogined = true; var cb_blogId = 42286; var cb_entryId = 1967843; var cb_blogApp = "fengyin"; var cb_blogUserGuid = "724e420b-63cf-dd11-9e4d-001cf0cd104b"; var cb_entryCreatedDate = '2011/3/1 12:04:00'; // ]]>
原文地址:https://www.cnblogs.com/Leo_wl/p/2043841.html