金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > web前端 > 如何准备前端开发者面试,Web性能优化系列

如何准备前端开发者面试,Web性能优化系列

发布时间:2019-11-03 01:48编辑:web前端浏览(125)

    Web性能优化系列(1):Web性能优化分析

    2015/04/08 · CSS, HTML5, JavaScript · 性能优化

    本文由 伯乐在线 - 鸭梨山大 翻译,sunbiaobiao 校稿。未经许可,禁止转载!
    英文出处:gokulkrishh.github.io。欢迎加入翻译组。

    如果你的网站在1000ms内加载完成,那么会有平均一个用户停留下来。2014年,平均网页的大小是1.9MB。看下图了解更多统计信息。

    图片 1

    网站的核心内容需要在1000ms内呈现出来。如果失败了,用户将永远不会再访问你的网站。通过降低页面加载的时间,很多著名公司的收入和下载量有显著的提升。比如

    • Walmart 每降低100ms的加载时间, 他们的收入就提高1%.
    • Yahoo 每降低400ms的加载时间,他们的访问量就提升9%。
    • Mozilla 将他们的页面速度提升了2.2秒,每年多获得了1.6亿firefox的下载量。

    如何准备前端开发者面试

    2015/04/06 · CSS, HTML5, JavaScript · 面试

    本文由 伯乐在线 - cucr 翻译,黄利民 校稿。未经许可,禁止转载!
    英文出处:blog.jixee.me。欢迎加入翻译组。

    图片 2

    工作面试很让人头疼。说真的。每个人都痛恨面试。虽然潜力的工作机会并不一定能拿到,但这并不意味着你在这方面会做的很差。因此,这里给出了一些如何准备 前端开发者面试的技巧。

    首先明确一下,很多面试因公司、公司规模、面试官以及你获得面试资格的渠道而不同。我曾经经历过这样的面试,在面试官坐下前,他显然并没有看过(或者记得)我的简历内容。另一方面,我也经历过其他一些面试,面试官在面试前已经事先了解了关于我的一切。因此,你对前端开发者面试准备,在实际面试前开始。

    面试前,应该假设一下面试官将会深入调查你。确保你的网上作品集和相关的社会关系网络内容都是最新的。无论是个人网站、Behance、还是Dribbble,确保给人的第一印象是好的。这一点甚至可以在你踏入房间之前就能影响到面试官对你的看法。

    世事多变,这种准备并非包罗万象的。将这些问题作为参考,同时一定记得——放松。

    图片 3

    图片来自NBC《老友记》截屏

    希望你的面试官有点经验,不会用以下这样的问题开场。以防万一,还是准备一些答案。

    • 为什么选择程序员这个职业生涯?
    • 截至目前,你所从事的项目中最喜欢的是哪个?
    • 描述一下你梦想中的研发项目。

    另外一些面试官会问一些通用的技术问题,来测试你的技术能力。有可能部分人不知道这些问题是什么意思,而仅仅是在考察你的能力/竞争力。基于面试官的技术能力级别的不同,你的答案也会有所不同。这些问题简单易答,因此把这些问题记下来。

    • 描述一下创建一个新网页的过程
    • 怎样减少页面加载时间?
    • 标准和标准体(standards and standards bodies)为什么重要?
    • 你使用怎样一个过程来组织代码?
    • 你喜欢用什么工具来测试代码性能?

    既然你从事前端工作,理解CSS会非常重要。因此这里为你准备了一些常见的CSS问题。这是展示你知识储备的重要开始。这些并不是最尖锐或者重要的问题,如果不能回答出来,将对你很不利。

    • CSS 中的 resetting 和 normalizing 之间的区别有哪些?
    • 什么是floats,它是如何工作的?
    • absolute、relative、fixed 和 static 定位的区别是什么?
    • 解释visiblity hidden和display none之间的区别
    • 你是如何修复特定浏览器默认样式的问题?
    • 你是否用过网格系统?目的是?
    • 如果计算CSS权重?
    • 解释如何优化CSS选择器。
    • 为什么需要使用预编译器?
    • 你是如何测试网站的跨浏览器兼容性?

    图片 4

    图片来自Aftercollege.com

    现在我们最基本的任务完成了。谁都能死记硬背这些答案来应付以上问题。即使是新手前端开发者也能出色地回答大部分问题。然而如果想真正让你的面试官印象深刻并证明你的功底深厚,就把下面这些问题牢记在心。

    • 前端开发最好的框架是什么?
    • 响应式web app和原生应用程序的区别是什么?
    • 原生app相对web app的优点是什么?
    • 客户端和服务器端开发的区别是什么?
    • 什么是SASS和LESS?它们是如何工作的?

    面试官会更多关注你是如何表达对这些问题的解释。他们会追问支持你的答案的工作案例。前面的问题你可能可以通过记忆而过关,你可能还会遇到这些问题的扩展,但这些答案的深度,将让你与众不同。通过你参与过的实际项目,来展示你的思考过程。

     图片 5

    图片来自《美国精神病人》的截屏

    当面试(或当你在面试过程中)问题会变得更加具体。你在解释、引用实例、阐明经验教训表现地更好,你更可能会从其他面试者中脱颖而出。在这个点上,并不仅仅是你的答案,而是答案的原因。你在原生app和响应式网站间做出决择的原因是什么?两种答案都是可以接受的,但理解你的逻辑,会帮助面试官做出正确的决定并聘请你!

    赞 6 收藏 评论

    管理页面的 setTimeout & setInterval

    2017/09/28 · JavaScript · setInterval, settimeout

    原文出处: 凹凸实验室   

    图片 6在管理 setTimeout & setInterval 这两个 APIs 时,笔者通常会在顶级(全局)作用域创建一个叫 timer 的对象,在它下面有两个数组成员 —— {sto, siv},用它们来分别存储需要管理的 setTimeoutID / setIntervalID。如下:

    JavaScript

    var timer = { sto: [], siv: [] };

    1
    2
    3
    4
    var timer = {
    sto: [],
    siv: []
    };

    在使用 setTimeout / setInterval 的时候,这样调用:

    JavaScript

    // 标记 setTimeoutID timer.sto.push( setTimeout(function() {console.log("3s")}, 3000); ); // 标记 setIntervalID timer.siv.push( setInterval(function() {console.log("1s")}, 1000) );

    1
    2
    3
    4
    5
    6
    7
    8
    // 标记 setTimeoutID
    timer.sto.push(
    setTimeout(function() {console.log("3s")}, 3000);
    );
    // 标记 setIntervalID
    timer.siv.push(
    setInterval(function() {console.log("1s")}, 1000)
    );

    在页面需要 clearTimeout clearInterval 的时候,这样调用:

    JavaScript

    // 批量清除 setTimeout timer.sto.forEach(function(sto) {clearTimeout(sto)}); // 批量清除 setInterval timer.siv.forEach(function(siv) {clearInterval(siv)});

    1
    2
    3
    4
    // 批量清除 setTimeout
    timer.sto.forEach(function(sto) {clearTimeout(sto)});
    // 批量清除 setInterval
    timer.siv.forEach(function(siv) {clearInterval(siv)});

    网站优化的步骤

    1. 设定性能预算。
    2. 测试当前的性能。
    3. 找出导致性能问题的地方。
    4. 最后,duang,使用优化特技。

    下面有几种方法可以提升你的页面性能,让我们来看看

    关于作者:cucr

    图片 7

    新浪微博:@hop_ping 个人主页 · 我的文章 · 17

    图片 8

    暂停 & 恢复

    近段时间,笔者发现很多业务都需要「暂停」和「恢复」setTimeout & setInterval 的功能,而仅靠原生的四个 APIs(setTimeout / setIntervale / clearTimeout / clearInterval)是不够用的。于是,笔者对 timer 进行了扩展,使它具备了「暂停」和「恢复」的功能,如下:

    JavaScript

    // 暂停所有的 setTimeout & setInterval timer.pause(); // 恢复所有的 setTimeout & setInterval timer.resume();

    1
    2
    3
    4
    // 暂停所有的 setTimeout & setInterval
    timer.pause();
    // 恢复所有的 setTimeout & setInterval
    timer.resume();

    扩展后的 timer对象下面挂载6个基础的 APIs。

    • setTimeout
    • setInterval
    • clearTimeout
    • clearInterval
    • pause
    • resume

    使用 timer.set* & timer.clear* 来代替原生的 set* & clear*。笔者把扩展后的 timer 托管在 GitHub 仓库上,有兴趣的同学可以移步:

    速度指标

    速度指标是指页面的可视部分被呈现在浏览器中的平均速度。表示为毫秒的形式,并且取决于viewport的大小。请看下图(用视频帧的形式展现页面加载时间,以秒为单位)。

    速度指标越低越好。

    图片 9

    速度指标可以通过Webpagetest 来测试(由Google维护)

    CreateJS 的启发

    在使用 CreateJS 开发一些项目的过程中,笔者发现通过设置 createjs.Ticker.paused = true / false,可以暂停/恢复 createjs.Tween 上的动画。于是笔者借用 createjs.Tween 模拟了 setTimeout & setInterval 的功能,如下:

    JavaScript

    // setTimeout createjs.setTimeout = function(fn, delay) { createjs.Tween.get().wait(delay).call(fn); } //setInterval createjs.setInterval = function(fn, delay) { createjs.Tween.get().wait(delay).call(fn).loop = 1; }

    1
    2
    3
    4
    5
    6
    7
    8
    // setTimeout
    createjs.setTimeout = function(fn, delay) {
    createjs.Tween.get().wait(delay).call(fn);
    }
    //setInterval
    createjs.setInterval = function(fn, delay) {
    createjs.Tween.get().wait(delay).call(fn).loop = 1;
    }

    具体的代码笔者托管在:createjs.timer。
    其实就是在 createjs 对象下挂载四个 APIs:

    • setTimeout
    • setInterval
    • clearTimeout
    • clearInterval

    使用方法与原生的 setTimeout & setInterval 一样,如下:

    JavaScript

    let siv = createjs.setInterval(() => console.log("1s"), 1000); createjs.setTimeout(() => createjs.clearInterval(siv), 5000);

    1
    2
    let siv = createjs.setInterval(() => console.log("1s"), 1000);
    createjs.setTimeout(() => createjs.clearInterval(siv), 5000);

    长话短说

    Webpage test 有很多特性,比如在不同的地方用不同的浏览器跑多个测试。 还可以测算其他的数据比如加载时间,dom元素的数量,首字节时间等等…

    例如:查看amazon在webpagetest上的测试结果 。

    可以看看这个视频,了解由 Patrick Meenan 讲解的关于webpagetest的更多信息(需要梯子)。

    时间轴驱动的 timer

    createjs.timer 在 CreateJS 项目的开发给笔者带来了极大的便利,但是它必须依赖 createjs.Tween 模块。于是笔者就在思考能否创建一个跟第三方框架无关并且又可以在第三方框架上使用的 timer

    createjs.Ticker.paused 为什么能暂停 createjs.Tween 上的动画的?
    createjs.Tween 中每一个动画都有一条自己的时间轴,这条时间轴是通过 createjs.Ticker 来驱动的;当 createjs.Ticker 被暂停后,createjs.Tween 中的每个动画的时间轴也会失去动力而暂停下来。

    createjs.Ticker 的作用是提供一个刷新 canvas 画面帧频,通常是使用 requestAnimationFrame or setInterval 来实现的。如果 timer 内部存在一条时间轴,这条时间轴由第三方驱动,那么 timer 就可以与第三方框架状态同步了。

    笔者是这样设计 timer 的结构:

    • queue —— 存放 setTimeout or setInterval 的队列;
    • updateQueue —— 驱动 queue 的内部 API;
    • update —— 外部接口,用于对接第三方 Ticker。

    实现的伪代码如下:

    JavaScript

    /* @queue 成员的结构如下: { fn: fn, // 回调函数 type: "timeout or interval", // 类型 elapsed: 0, // 时间轴进度 delay: delay // 目标时长 } */ let queue = new Map(); function updateQueue(delta) { queue.forEach((item, id) => { item.elapsed += delta; if(item.elapsed >= item.delay) { item.fn(); // 从 queue 中删除 setTimeout 成员,interval 成员继续循环 item.type === "timeout" ? delete(id) : (item.elapsed = 0); } }); } // 对外接口 this.update = function(delta) { updateQueue(delta); }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    /*
    @queue 成员的结构如下:
    {
    fn: fn, // 回调函数
            type: "timeout or interval", // 类型
            elapsed: 0, // 时间轴进度
            delay: delay // 目标时长
    }
    */
    let queue = new Map();
    function updateQueue(delta) {
    queue.forEach((item, id) => {
            item.elapsed += delta;
            if(item.elapsed >= item.delay) {
                item.fn();
                // 从 queue 中删除 setTimeout 成员,interval 成员继续循环
                item.type === "timeout" ? delete(id) : (item.elapsed = 0);
            }
        });
    }
    // 对外接口
    this.update = function(delta) {
    updateQueue(delta);
    }

    timer 的具体实现可以参考:

    timer 与 CreateJS 一起使用:

    JavaScript

    // es6 代码 import timer from './modules/timer'; // 统一 ticker createjs.Ticker.addEventListener("tick", function(e) { e.paused || timer.update(e.delta); });

    1
    2
    3
    4
    5
    6
    // es6 代码
    import timer from './modules/timer';
    // 统一 ticker
    createjs.Ticker.addEventListener("tick", function(e) {
      e.paused || timer.update(e.delta);
    });

    timer 与 PIXI 一起使用:

    JavaScript

    // es6 代码 import timer from './modules/timer'; // 统一 ticker app.ticker.add("tick", function() { timer.update(app.ticker.elapsedMS); });

    1
    2
    3
    4
    5
    6
    // es6 代码
    import timer from './modules/timer';
    // 统一 ticker
    app.ticker.add("tick", function() {
      timer.update(app.ticker.elapsedMS);
    });

    附上 PIXI 的线上 DEMO,二维码如下:

    图片 10

    渲染阻塞

    如果你知道浏览器如何运行,那么你应该知道HTML, CSS, JS是怎么被浏览器解析的以及其中哪个阻塞了页面的渲染。如果你不知道,请看下图。

    图片 11

    点击how a browser works了解更多浏览器工作原理(作者为Tali Garsiel 和Paul Irish).

    总结

    感谢阅读完本文章的读者。本文仅代表个人观点,希望能帮助到有相关问题的朋友,如果本文有不妥之处请不吝赐教。

    1 赞 4 收藏 评论

    图片 12

    本文由金沙国际官网发布于web前端,转载请注明出处:如何准备前端开发者面试,Web性能优化系列

    关键词:

上一篇:没有了

下一篇:没有了