在网站开发与维护过程中,前端优化是至关重要的,JavaScript(JS)和CSS(层叠样式表)的过滤是提升页面加载速度和用户体验的关键步骤,以下是对如何过滤JS和CSS的详细探讨。
过滤JavaScript(JS)
压缩与合并
压缩 :通过移除不必要的空格、注释和缩短变量名,可以减少JS文件的大小,这可以通过工具如UglifyJS或Google Closure Compiler实现。
合并 :将多个JS文件合并成一个,可以减少HTTP请求的次数,从而加快页面加载速度。
| 工具 | 功能 |
|---|---|
| 压缩和混淆JavaScript代码 | |
| Google Closure Compiler | 压缩、混淆和优化JavaScript代码 |
异步加载
对于非关键JS文件,可以使用异步加载技术,如或属性,来确保它们不会阻塞页面的渲染。
使用CDN分发网络(CDN),可以将JS文件分发到全球多个节点,从而减少加载时间。
过滤CSS
压缩
与JS类似,CSS也可以通过压缩来减少文件大小,工具如CSS Minifier可以帮助实现这一点。
优化选择器
选择器优化可以减少浏览器的计算量,从而提高渲染速度,避免使用过于复杂的选择器,如深层的嵌套或通配符。
使用CSS预处理器
CSS预处理器如Sass或Less可以提供变量、嵌套、混合等功能,有助于编写更可维护的CSS代码。
| 工具 | 功能 |
|---|---|
| CSS Minifier | 压缩CSS代码 |
| 使用预处理器编写CSS | |
| 使用预处理器编写CSS |
实践案例
以下是一个简单的示例,展示如何使用Gulp来压缩和合并JS和CSS文件。
const gulp = require('gulp');const concat = require('gulp-concat');const uglify = require('gulp-uglify');const cleanCSS = require('gulp-clean-css');gulp.task('compress-js', () =>gulp.src('src/**/*.js').pipe(concat('bundle.js')).pipe(uglify()).pipe(gulp.dest('dist')));gulp.task('compress-css', () =>gulp.src('src/**/*.css').pipe(concat('bundle.css')).pipe(cleanCSS()).pipe(gulp.dest('dist')));gulp.task('default', gulp.series('compress-js', 'compress-css'));
Q1:为什么需要过滤JS和CSS? A1:过滤JS和CSS可以减少文件大小,减少HTTP请求次数,提高页面加载速度,从而提升用户体验。
Q2:除了上述方法,还有哪些优化JS和CSS的方法? A2:除了压缩和合并,还可以考虑使用缓存策略、懒加载、使用响应式图片等技术来进一步优化网站性能。
fiddler filter过滤后怎么再显示未过滤前的请求
对于这种,我说两种方法:1、将你所有的JSP页面单独放在一个文件夹里(假如jspPage),jspPage文件夹里可根据类别分若干子文件夹,再把相对应的JSP放在子文件夹里;JS、CSS及图片等分别放在外面的文件夹里(与文件夹jspPage并列)再:/jspPage/*就行了一般用的就是这种2、在过滤的JAVA文件中,在doFilter方法里进行判断,将后缀名为、等直接设置为通过就行了,这种较为复杂,在一些特殊情况下才用到,一般不推荐
如何优化网页从dom css js
一、页面级优化1. 减少HTTP请求数这条策略基本上所有前端人都知道,而且也是最重要最有效的。 都说要减少HTTP请求,那请求多了到底会怎么样呢?首先,每个请求都是有成本的,既包含时间成本也包含资源成本。 一个完整的请求都需要经过DNS寻址、与服务器建立连接、发送数据、等待服务器响应、接收数据这样一个”漫长”而复杂的过程。 时间成本就是用户需要看到或者”感受”到这个资源是必须要等待这个过程结束的,资源上由于每个请求都需要携带数据,因此每个请求都需要占用带宽。 另外,由于浏览器进行并发请求的请求数是有上限的(具体参见此处),因此请求数多了以后,浏览器需要分批进行请求,因此会增加用户的等待时间,会给用户造成站点速度慢这样一个印象,即使可能用户能看到的第一屏的资源都已经请求完了,但是浏览器的进度条会一直存在。 减少HTTP请求数的主要途径包括:(1). 从设计实现层面简化页面如果你的页面像网络首页一样简单,那么接下来的规则基本上都用不着了。 保持页面简洁、减少资源的使用时最直接的。 如果不是这样,你的页面需要华丽的皮肤,则继续阅读下面的内容。 (2). 合理设置HTTP缓存缓存的力量是强大的,恰当的缓存设置可以大大的减少HTTP请求。 以有啊首页为例,当浏览器没有缓存的时候访问一共会发出78个请求,共600多K数据(如图1.1),而当第二次访问即浏览器已缓存之后访问则仅有10个请求,共20多K数据(如图1.2)。 (这里需要说明的是,如果直接F5刷新页面的话效果是不一样的,这种情况下请求数还是一样,不过被缓存资源的请求服务器是304响应,只有header没有Body,可以节省带宽)怎样才算合理设置?原则很简单,能缓存越多越好,能缓存越久越好。 例如,很少变化的图片资源可以直接通过HTTP Header中的Expires设置一个很长的过期头;变化不频繁而又可能会变的资源可以使用Last-Modifed来做请求验证。 尽可能的让资源能够在缓存中待得更久。 关于HTTP缓存的具体设置和原理此处就不再详述了,有兴趣的可以参考下列文章:HTTP1.1协议中关于缓存策略的描述Fiddler HTTP Performance中关于缓存的介绍(3). 资源合并与压缩如果可以的话,尽可能的将外部的脚本、样式进行合并,多个合为一个。 另外,CSS、Javascript、Image都可以用相应的工具进行压缩,压缩后往往能省下不少空间。 (4). CSS Sprites合并CSS图片,减少请求数的又一个好办法。 二、代码级优化1. Javascript(1). DOMDOM操作应该是脚本中最耗性能的一类操作,例如增加、修改、删除DOM元素或者对DOM集合进行操作。 如果脚本中包含了大量的DOM操作则需要注意以下几点:a. html Collection在脚本中、、getElementsByTagName()返回的都是HTMLCollection类型的集合,在平时使用的时候大多将它作为数组来使用,因为它有length属性,也可以使用索引访问每一个元素。 不过在访问性能上则比数组要差很多,原因是这个集合并不是一个静态的结果,它表示的仅仅是一个特定的查询,每次访问该集合时都会重新执行这个查询从而更新查询结果。 所谓的”访问集合”包括读取集合的length属性、访问集合中的元素。 因此,当你需要遍历HTML Collection的时候,尽量将它转为数组后再访问,以提高性能。 即使不转换为数组,也请尽可能少的访问它,例如在遍历的时候可以将length属性、成员保存到局部变量后再使用局部变量。 b. Reflow & Repaint除了上面一点之外,DOM操作还需要考虑浏览器的Reflow和Repaint,因为这些都是需要消耗资源的,具体的可以参加以下文章:如何减少浏览器的repaint和reflow?Understanding Internet Explorer Rendering BehaviourNotes on HTML Reflow(2). 慎用with with(obj){ p = 1}; 代码块的行为实际上是修改了代码块中的执行环境,将obj放在了其作用域链的最前端,在with代码块中访问非局部变量是都是先从obj上开始查找,如果没有再依次按作用域链向上查找,因此使用with相当于增加了作用域链长度。 而每次查找作用域链都是要消耗时间的,过长的作用域链会导致查找性能下降。 因此,除非你能肯定在with代码中只访问obj中的属性,否则慎用with,替代的可以使用局部变量缓存需要访问的属性。 (3). 避免使用eval和Function每次 eval 或 Function 构造函数作用于字符串表示的源代码时,脚本引擎都需要将源代码转换成可执行代码。 这是很消耗资源的操作 —— 通常比简单的函数调用慢100倍以上。 eval 函数效率特别低,由于事先无法知晓传给 eval 的字符串中的内容,eval在其上下文中解释要处理的代码,也就是说编译器无法优化上下文,因此只能有浏览器在运行时解释代码。 这对性能影响很大。 Function 构造函数比eval略好,因为使用此代码不会影响周围代码;但其速度仍很慢。 此外,使用eval和Function也不利于Javascript压缩工具执行压缩。 (4). 减少作用域链查找前文谈到了作用域链查找问题,这一点在循环中是尤其需要注意的问题。 如果在循环中需要访问非本作用域下的变量时请在遍历之前用局部变量缓存该变量,并在遍历结束后再重写那个变量,这一点对全局变量尤其重要,因为全局变量处于作用域链的最顶端,访问时的查找次数是最多的。
如何直接调试线上页面的JavaScript和C
一个典型的工作场景是:线上的某个页面出现了bugs,需要紧急修复。 这时候有个简单的传统做法是,将问题页面另存为本地html文件,然后疯狂的寻找并修复bugs,等弄好了,再将修改后的js和css上传到线上并检查校验bugs是否已修正。 上面的方法,对于简单页面,是够用的。 但是对于稍微复杂的页面,IE的另存为经常不保真,如果页面中涉及Ajax等bugs,保存到本地更是难以调试。 这时有个很自然的做法是,将开发环境Run起来,当时怎么开发的,现在就怎么调试。 这样做肯定能解决问题,但要调动很多资源,后台开发工程师、前台开发工程师等等都要参与。 对于小团队来说,也许是可行的,对于大团队来说,如此大动干戈,除非到了最后,是不会这样做的。 那我们应该怎么做呢?先来看一个工具: Web开发中有个大名鼎鼎的工具:Fiddler. Fiddler是一个http调试代理,它能够记录你电脑和互联网之间的所有http通讯。 Fiddler可以让你检查所有的http通讯,设置断点,以及Fiddle(Fiddle的英文意思是胡乱修改,很幽默的表达Fiddler的用途)所有“进出”的数据(指cookie,html,js,css等数据)。 嘿嘿,是否从上面的介绍中嗅探到了某种解决方案?Fiddler可以让我们Fiddle所有”进出“的数据!我们要调试线上页面的bugs时,可以先分析是什么文件引起的,找出这些嫌疑文件,下载到本地,然后利用Fiddler将线上的请求Fiddle到本地的对应文件。 这样我们就可以随心所欲的修改这些嫌疑文件了,直接刷新线上的页面就可以看到效果,烦人的环境问题根本就不用考虑,而且一切都是高保真的。 上面说的是思路,下面我会举个例子来说明。 举例子之前,请先安装Fiddler(怎么下载安装就不多了,一路Next)。 安装好后,在IE的工具条上会出现Fiddler2图标,点击启动Fiddler. 启动后,通过IE访问任何网站时,所有http进出数据都会在Fiddler上显示出来。 但是等等,怎么老说IE呢?虽然在IE上能通过IE Developer Toolbar和来调试CSS和JS,但被firebug宠坏了的我们,总期望着Firefox上能搞定的问题绝不通过IE去调试。 为了我们的美好期望,根据Fiddler的官方说明,我们只要简单的进行以下操作即可: 首先将要调试的文件下载到本地,启动Fiddler,在AutoResponder栏勾选启用,并添加替换规则: 如上图添加两条规则后,刷新页面,上面两个js文件就从本地获取了,嘿嘿。 接下来,用喜欢的文本编辑器尽情的调试吧,就像当初开发时一样。 等把bugs解决了,压缩并上传相应的js文件,并通知后台开发者修改vm中js文件的时间戳,然后等着发布就行。 CSS也是一样的调试,不赘述。 在firefox、Safari、Opera中的的使用方法类似,不多说。 其它和前端开发调试密切相关的技巧: 2.使用DIFF比较http包的统计数据; 3.使用Filter过滤信息。 比如禁用JS, 设置断点等等。 4.使用bpu + Inspectors动态修改Response. 比如修改页面中的JS代码片段等等,非常有用。 5.使用request Buidler测试请求。 可以很方便的测试ajax代码(可惜不支持断点)。 6.使用Statistics + Timeline + neXpert查看性能等统计数据,可以分析网页加载慢的原因。 7.使用CustomRules, 自定义配置和命令等。 比如修改var m_DisableCaching: boolean = false;的值为true, 就可以默认禁止缓存。 还可以自定义命令等等。 8.开发自己的扩展。














发表评论