文章开始之前先说博主前端时间遇到的一个尴尬的例子,手里有个网站,所有JS效果都是用jQuery写的,由于本人又是个Seoer加强迫症患者,所以对网站的加载速度要求比较高。之前一直没有注意网站的加载速度一个是自己网速还算快,另一个是可能技术水平还不够,没有关注到这里。偶然的机会,我用Google的Page Speed测试了一下网站,发现评分比较低,主要原因都是JS和图片的问题。图片优化我们这里先不说,主要讲讲怎们加载JS。网站加载速度慢,主要原因是我网站的head有个jQuery库需要加载,当这个jQuery没有下载并执行完的时候,页面下面的内容将会停止渲染。那么我首先想到了利用浏览器的标签进行异步加载,在script标签里头使用defer和async=”true”来异步加载jquery,这时候发现jQuery是异步加载了,但是又出现了另外一个问题,就是我下面有依赖jQuery写的脚本,当jQuery异步加载,这些被执行了,就是提交找不到”$”,那么我又想到了把这些jQuery写的脚本也进行异步加载,但是仔细一想,这样也不行,因为虽然都是异步加载,但是到底谁先加载上,这个是不可控的。由于水平有限,再加又亟待解决这个问题,所以我最终的办法就是把jQuery库和脚本都写到网页尾部,这样虽然有点挫,但也不失为黔驴技穷的一种解决方案。
下面再说说require.js. 概念的东西就不讲太多,require.js的主要作用是解决JS模块之间的相互依赖和异步加载问题。主要格式如下
<script src=”require.js” defer async=”true” data-main=”main”></script>
可以看到,require.js和普通的js引用一样,只是在script标签里头多一个data-main标签,data-main标签的main值代表和require.js在同一目录下的main.js,这个main.js就负责模块的加载,main.js的内容如下
require.config({ paths:{ "jquery":"http://code.jquery.com/jquery-1.10.2.min" } }) require(['jquery'],function($){ $("title").text("网页的标题被Jquery该表成这个了"); })
第一到五行用来require.js的参数,paths中,代表jquery模块的路径是网络资源,你也可以指定自己的jquery库的位置。如果自己的jQuery库和require.js,main.js在服务器的同样一个位置,则不用配置路径,require.js会自动查找。还有一点需要主要的是,和python一样,引入的模块名就是模块的文件名称,在配置路径的时候不要填文件后缀。
当这段代码运行之后,我们发现网页的标题被jQuery改变了,而且这个页面的加载速度没有受到任何影响,也不需要用jQuery的document.ready来监测DOM是否加载完毕了(如果没有指定defer和async=”true”,使用jquery操作DOM时,最好使用document.ready)。