我们都知道使用ide编写后端程序时,我们都需要build, 对.net来说,我们一般需要使用visual studio来确保我们的项目编译通过,而且项目编译通过是对所有程序员的基本要求。
但是,由于很多后端程序员对前端的很多东西不了解,导致在做web项目时出现了一些问题。
javascript和css的版本问题 我们都知道 javascript和css属于静态文件,如果地址不变,浏览器会缓存这些文件,那就意味着当我们需要改javascript或者css文件的时候,即使我们后端改了,那么客户端也是看不到,这个在“js一统天下”的时代是不可接受的,因为现在几乎所有的web 程序都严重依赖javascript,而所有的网站都是需要使用css的。在我经历过的项目即使是很多年经验的程序员都出现过javascript和css文件的版本问题,比如客户让修复一个bug,这个bug是javascript引起的,程序员修复了,或者是客户说改一个背景颜色, 可是当我们给客户部署后或者代码交给客户客户部署时,客户说bug依然存在,这个时候程序员经常说的话就会出现了 “我本地是好的呀”,最后再找来别人帮忙后,发现原来是没有清除浏览器的缓存,于是有的程序员就赶紧给客户说:“你需要ctrl+f5 清除浏览器的缓存”。 每当我听到这样的话时就像关上灯留给我一屋子黑,首先,有几个普通用户会使用ctrl+f5? 其次,有几个用户愿意去ctrl+f5?
那么怎么办?我想很多程序员都知道加一个版本号就可以了,这样浏览器就会认为是新的文件,比如原来是 http://www.a.com/app.js你现在只需要把地址改为http://www.a.com/app.js?v=1.0 即可
但是如果这个动作是手动的,那么10次基本上至少有5次程序员会忘掉,那么这就是为什么我们需要前端构建
javascript和css的依赖问题 我们经常出现的另一个问题,就是javascript和css的依赖问题,说的通俗点就是javascript和css的在页面中的顺序问题!
我们经常发现css没起作用,javascript的某个变量和方法找不到,有很多情况都是因为引入javascript或者css的顺序不对,虽然我们可以使用一些requirejs之类的模块管理,但是依然在很多情况下需要引入不同的文件,尤其是css没有一个好的模块化管理的组件。
那么我们就需要有一个统一的地方来管理javascript和css的顺序问题,而构建工具可以大大减少此类问题。
性能优化 我们都知道浏览器请求的文件越多越耗时,请求的文件越大越耗时,尤其是在我们现在很多使用前端mvc, mvvm框架的时候,我们为了前端代码更清晰,结构更合理,我们就由很多js文件,无疑又拖慢了网页的速度。为了解决这个问题,因此我们需要做两件事
文件合并 浏览器需要下载多个js文件,而浏览器是有并发限制,也就是同时并发只能下载几个文件,假如浏览器并发数是5,你有20个js文件,而每5个需要2s, 那么你光下载js文件都需要8s,那么网页的性能可想而知,所以我们需要合并多个文件以减少文件的数量。
文件压缩 我们知道文件越大,下载越慢,而针对javascript和css, 里面的空格,换行这些都是为了让我们读代码时更容易阅读,但是对机器来说,这些对它没有影响,所以为了减少文件大小,一般的情况我们都会用工具去掉空格和换行,有时候我们还会用比较短的变量名(记住这个要让工具最后压缩时做,而源代码一定要保证命名可读性) 来减少文件大小。
而所有的前端构建工具都具有文件合并和压缩的功能。
效率提升 vendor前缀 在css3使用越来越多的时候,我们都知道一些css的特性,不同的浏览器css有不同的前缀,如果我们手工添加将会很繁琐,而如果使用构建工具,很多构建工具可以自动给我添加css的vendor前缀
单元测试 javascript的单元测试在使用mvc或者mvvm的框架后,变得越来越容易,而单元测试是质量保证的一个很重要的手段,所以在提交之前,使用构建工具自动跑一遍我们的单元测试是非常重要的
代码分析 我们写的javascript很多时候会有一些潜在的bug, 比如忘了添加分号,某个变量没有等等,使用一些javascript的代码分析工具,可以很好的帮我们检查一些常见的问题。
html引用javascript或者css文件 比如我们需要使用bower之类来引用前端javascript和css的第三方库,那么如果版本升级,添加移除等都用手工来修改html的话,第一比较耗时,第二比较容易疏漏,尤其是在我们需要切换debug和production版本时将会有很多额外的工作,那么使用前端构建工具可以很好的解决这些问题。
最后 以上我只是列出了前端构建最常用的一些功能,我相信还可以发觉很多构建工具可以替代我们手工做的事,后面我将详细讲讲如何使用gulp这个神器来一一解决我们上面提到的问题。