准备好知道这十二个问答吗?

106 阅读6分钟

1.现在大家都在用各式各样的前端框架了,jQuery过时了吗?

框架没有好与不好,只有合适与不合适。如果你用框架,那你应该花更多时间去研究这个框架,例如阅读它的源码,然后更高性能地使用它。如果你不用框架,只用原生或者jQuery,那你应该多花时间研究怎么更好地组织你的代码,更深入地了解浏览器的特性。这一方面,不管你用不用框架都应该去了解,只是如果你用了框架,它会帮你屏蔽掉了这些细节。jQuery改变了写前端的方式,而现在新的框架又再一次改变了写前端的方式,并且几乎推翻了传统的写前端的形式。但是,形式的东西不管怎么变,思想的东西肯定是不会变的,例如低耦合高内聚的思想、设计模设的思想、面向对象的思想等。

2.一些CSS3和HTML5的东西,在老浏览器上无法运行。不用兼容老的浏览器吗?

如果你的项目需要兼容IE8,那么确实不能用。你可能在开发一个供银行或者医院使用的网页,这些机构很多确实还在用WindowsXP系统,使用IE8。但是如果老想着向下兼容,不去使用新技术,那么新技术如何发展?HTML5已经发展了这么多年,你还不敢用,也不去了解,那就真得太浪费,太可惜了。

3.CSS伪元素有这么多好处,是不是要用再所有能用到的地方上?

并不是,伪元素适用于那种页面辅助性的视觉元素,如果内容本身是正常的页面内容,那还是用正常的标签吧。不能仅仅只是出于节省一个标签的目的,走向另一个极端,全部都用伪元素。

4.既然推荐用强类型的风格写,那干脆用微软的typescript?

这个得看具体的项目。微软的typescript要求用强类型的语法写,这样就保证了代码在变成正常的JS之前帮你做了个类型检查,提前避免一些在运行的时候才发现的错误。这种就比较适用于比较大型的应用,如用JS写桌面的应用、大型的网页游戏。而在平时的Web开发,可以酌情考虑。毕竟它无疑增加了开发成本,并且“违背”了JS弱类型的根本。

5.可以放心地使用ES6吗,万一客户的浏览器比较老怎么办?

caniuse.com上面可以查看ES6的支持情况,IOS9和Android4的支持性都不是很好,例如不支持箭头函数和let定义变量。现在很多人都采用了webpack+babel的开发模式,babel把ES6转化成ES5的语法,写的是ES6,但运行的是ES5,这是一种折中的方法。

6.缓存使用到了Nginx,Nginx不是后端的么,这个对前端的要求太高了吧?

如果你认为前端就是写HTML/CSS/JS的,那你的思想就有点局限了。虽然我们是做前端的,但是视野要放宽一点,例如你得去了解HTTP协议吧,你为了实践HTTP协议的缓存机制,你不搞个Nginx怎么玩。

7.没有加上async和defer的script为什么是并行加载的,理论上不应该先加载执行完一个JS再接着写一个script吗?

最开始的浏览器是这么处理的,只要遇到一个JS,则后面的资源都不会去加载了,只有等到这个JS执行完了,才会继续解析DOM,继续加载其他资源。但是早在2008年的IE8等浏览器都支持了一个叫做“推测加载”的策略---在遇到一个JS的时候,虽然DOM停止构建了,但是会去分析后面的标签有哪些资源需要加载,提前放到加载队列里面,而不用等到堵塞的JS完成了。这样大大提高了网页的整体加载速度。

8.UI和产品并没有要求加一些效果,自己胡乱添加一些效果真的好吗?

如果你加了一个不好的效果,画蛇添足,那还不如不加。加这种效果的前提是确实能够提升体验,而不是为了显示我的技术有多厉害,能够做出这么酷炫的效果。如果你不确定这个效果好不好,那就和其他人商量一下。

9.很多网站还在使用雪碧图,使用图标字体会有什么坑吗?

有一个坑就是在安卓上,通过外链引入的图标字体的加载经常会慢于HTML的加载,字体没加载好,安卓上会先使用一个默认字体来替代无法显示的字体,而图标字体的编码可能刚好就是某一个繁体字的编码,导致了刷新页面的时候先图标变成繁体字然后在变成正常图标的问题。把图标字体转成base64然后用内联的方式就可以解决这个问题。因为这个字体本身就不大,再加上gzip压缩,不会给HTML增加很多的体积。而IOS和电脑浏览器上是先显示一个方框,等字体加载好了,在变成正常图标,使用内联的方式也可以避免这种奇怪的显示方式,刷页面的时候图标就跟着出来了,这样显示得比较自然。

10.当我访问HTTP时,如www.baidu.com,为什么会自然跳转到https?

这是后端做的重定向,通常使用Nginx的rewrite或者return规则做的重定向,返回3开头的状态码让浏览器重定向。

11.节流的实现为什么要让第一次立刻触发?防抖和节流有什么区别?

因为这会比较符合实际的场景,例如用户最大化了窗口,触发了一次resize,这个时候不应该等500ms再执行,可以立刻执行回调。

防抖是只执行重复操作的最后一次,而节流是每多少单位时间内只执行一次。

12.什么是测试驱动开发,有什么意义?

所谓测试驱动开发就是在开发前写好测试用例,当开发完成后,测试用例也就都通过了。使用测试驱动开发TDD的好处是可以让你很清楚地记住你要开发什么功能,相当于开发前先规划好。