说能告诉我为now是什么意思<%=nowpic%>不显示,并且是空值?

谢邀&br&&br&首先,我们来考虑一下什么是架构:&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/1147116.htm%3Ffr%3Daladdin& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&软件架构_百度百科&/a&&br&&blockquote&软件架构(software architecture)是一系列相关的抽象模式,用于指导大型软件系统各个方面的设计。&br&&/blockquote&传统软件架构描述的对象是直接构成系统的抽象组件,侧重于系统的抽象、拆分、组织方式等。所以如果从传统软件架构定义出发,前端架构可能就是指前端项目的系统设计了。在进行系统设计之前,由于前端开发语言缺乏一定的工程能力,所以&b&&u&web前端架构师相比传统软件架构师还应该能提供以下开发基础的支持&/u&&/b&:&br&&ul&&li&&b&开发规范&/b&:开发规范设计非常重要,设计良好的开发规范应该以实用性为前提,可以提升开发效率,降低维护成本。常见的规范主要是针对模块化开发定义的,想象一下,下面的规范示意图是不是能对开发和维护有极大的帮助:&br&&figure&&img src=&https://pic4.zhimg.com/50/60ead9f4b63f42ae8ad6dd2f59783bde_b.jpg& data-rawwidth=&475& data-rawheight=&423& class=&origin_image zh-lightbox-thumb& width=&475& data-original=&https://pic4.zhimg.com/50/60ead9f4b63f42ae8ad6dd2f59783bde_r.jpg&&&/figure&&br&&/li&&li&&b&开发模型&/b&:主要是模块化开发。前端由于编程语言的问题,没有原生的模块化支持,所以架构师在做架构设计之前,要先提供模块开发体系。模块化开发体系设计挺复杂的,完整的模块化体系要统一js、css和模板的模块化处理,此外,js、css模板中的资源(图片等)引用也是要考虑的问题。此外,模块化框架肩负着资源的加载控制,要面对性能优化,所以,好的架构师给出的模块化方案应该是能把性能优化做到框架中,&b&性能是一个工程问题&/b&!&/li&&li&&b&构建工具&/b&:还是由于前端开发语言的问题,前端还需要构建工具配合,才能完成开发规范、开发模型的落地实现。这部分也许有人认为是非必须的,但是我可以给出完整论证证明&b&标准前端项目必须经过构建&/b&,这里就不展开了。总之,前端架构师在给出规范、模型之后,还要给出配套的工具来保证它们的实现。&/li&&/ul&web前端架构师至少要提供以上3项之后才能开展正式的架构设计,我觉得这部分是衡量一个架构师设计能力的重要指标之一。基础搞定了,架构设计的开展才能顺利。没有标准的模块化支持,架构设计很难做。&br&&br&此外,由于web前端的产品模式与传统软件有很大差异,所以我觉得真正的前端架构师还应该能考虑以下问题:&br&&ul&&li&&b&项目部署&/b&:前端项目部署应该由前端架构师来决定,这里涉及到网络性能优化和开发规范对接的问题,所以前端架构师要理解工程部署的过程,并把开发和部署打通,否则开发受限于部署,架构设计会遇到阻碍。&/li&&li&&b&组件化与组件生态&/b&:由于前端面向的是界面设计,所以在模块化之上还有组件化开发模型需要架构师提供。此外,项目中一些可复用的模块或组件应该有一定的复用渠道,这部分我称之为生态。架构师应该提供这样的渠道来解决多个团队或项目之间的代码复用问题。&/li&&li&&b&前端统计&/b&:前端统计包括性能统计、访问统计、用户行为统计、错误统计、安全监控等,虽然有些统计属于产品指标,但在大数据时代,前端研发的方向应该有一定的数据做指导,前端架构师必须关心统计数据,并能提供统计方案、统计平台是一种衡量指标。&/li&&li&&b&前端安全&/b&:这部分也应该有架构师负责的部分。主要是在开发、统计的过程中对前端安全做保障,比如xss修复、页面脚本注入监控等&/li&&li&&b&系统测试&/b&:很多人总是尝试用API测试方法论中的单元测试来测试前端项目,其实是片面的。前端测试属于GUI测试范畴,前端项目中使用的框架、类库一般由外部提供,已经由API测试做了质量保证,而项目中的测试应该主要集中在GUI测试上,这部分目前没有好的解决方案做支撑,所以也没有什么好的衡量办法。&/li&&/ul&以上就是我觉得衡量前端架构师的基本要求,&u&&b&现在已经不在是“写一个jquery就是架构师”的时代了&/b&&/u&,前端本应该是一个系统化、工程化的理论体系,涉及到很多方面,前端工程师的工程化意识应该加强。&br&&br&&blockquote&或许现在很多企业和团队尚未重视前端工程,或许前端工程在很多人眼里还只是“构建工具”的代名词,又或许未来前端领域的变革使得一切工程问题从根本上得到解决。不管怎样,我只是希望当下能认真的记录自己在前端工程领域的所见所想,与正在经历前端工程化改进,并被此过程困扰的同学交流心得。&/blockquote&
谢邀 首先,我们来考虑一下什么是架构: 软件架构(software architecture)是一系列相关的抽象模式,用于指导大型软件系统各个方面的设计。 传统软件架构描述的对象是直接构成系统的抽象组件,侧重于系统的抽象、拆分、组织方式等。所以…
&figure&&img src=&https://pic3.zhimg.com/v2-ce8eb6aac37b330c4ceccbd_b.jpg& data-rawwidth=&1950& data-rawheight=&1300& class=&origin_image zh-lightbox-thumb& width=&1950& data-original=&https://pic3.zhimg.com/v2-ce8eb6aac37b330c4ceccbd_r.jpg&&&/figure&&p&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-c96ce96973beaf2ceee84ec_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1200& data-rawheight=&169& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&https://pic1.zhimg.com/v2-c96ce96973beaf2ceee84ec_r.jpg&&&/figure&&p&入行7年,可以说阅遍无数效率工具,但对产品经理来说,真正高效的办公软件都有哪些呢?以下工具是我7年经验的良心推荐,谁用谁知道,工作效率提升100%&/p&&p&&br&&/p&&h2&&b&1、交互工具-墨刀 吐血推荐!!!&/b&&/h2&&figure&&img src=&https://pic3.zhimg.com/v2-0adf0db02fb4422_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1915& data-rawheight=&943& class=&origin_image zh-lightbox-thumb& width=&1915& data-original=&https://pic3.zhimg.com/v2-0adf0db02fb4422_r.jpg&&&/figure&&p&我用过很多交互制作软件,包括老牌的Axure/Sketch,还有一些国外交互制作工具,最后还是选择了墨刀,因为这货——&/p&&ul&&li&&b&上手简单:&/b&不用教学文档视频,基本上10分钟上手;&/li&&li&&b&内置控件:&/b&icon和iOS/Android控件;&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/v2-e2e3ab947dd707dccda949_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&804& data-rawheight=&806& class=&origin_image zh-lightbox-thumb& width=&804& data-original=&https://pic2.zhimg.com/v2-e2e3ab947dd707dccda949_r.jpg&&&/figure&&p&&br&&/p&&ul&&li&&b&可加动画:&/b&页面跳转方便,可以加简单的跳转动画&/li&&/ul&&figure&&img src=&https://pic4.zhimg.com/v2-5cefa1cbefaed4dd0f0cca9ffee7e977_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&390& data-rawheight=&692& data-thumbnail=&https://pic4.zhimg.com/v2-5cefa1cbefaed4dd0f0cca9ffee7e977_b.jpg& class=&content_image& width=&390&&&/figure&&ul&&li&&b&网页+PC+手机同步&/b&:手机上可以下载墨刀APP,PC上画好交互,可以直接操作在手机demo上看效果,酷的一逼&/li&&/ul&&figure&&img src=&https://pic4.zhimg.com/v2-3eeb1b2741afdd67e10ee1fe00b93f4f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&459& data-rawheight=&819& class=&origin_image zh-lightbox-thumb& width=&459& data-original=&https://pic4.zhimg.com/v2-3eeb1b2741afdd67e10ee1fe00b93f4f_r.jpg&&&/figure&&p&&br&&/p&&ul&&li&&b&交互输出:&/b&流程交互图也可以直接编辑输出,非常贴心&/li&&/ul&&figure&&img src=&https://pic4.zhimg.com/v2-1df51f8cf2acb35ffe174a07_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1752& data-rawheight=&944& class=&origin_image zh-lightbox-thumb& width=&1752& data-original=&https://pic4.zhimg.com/v2-1df51f8cf2acb35ffe174a07_r.jpg&&&/figure&&ul&&li&&b&中文界面:&/b&我这种学渣的独特需求&/li&&li&&b&免费:&/b&这么好用还免费,不推荐不是人(当然了,也有更高级的收费版)&/li&&/ul&&p&&b&【总体评价】&/b&墨刀也有Axure之类的母版的功能,虽然不如Sketch强大,但对于产品经理,已经绝对够用了,简单+好用+免费,成为我这几年最喜欢的交互软件&/p&&blockquote&PS:墨刀的PC客户端也很好用,也是账号同步,并且支持取色之类的功能&/blockquote&&p&&b&【收费情况】&/b&免费&/p&&p&&b&【推荐指数】★★★★★&/b&&/p&&h2&&b&2、必备TO-Do管理:Trello 吐血推荐!!!&/b&&/h2&&p&做产品的经常会被打断,被各种插入任务,这个工具帮助你整理好自己之后做事情,不重不漏,即使有事情插进来,也可以井然有序,从容不迫。&/p&&p&一件事情一张卡片,做完的事情移动到对应栏或者归档,分享一下我的分类。&/p&&ul&&li&&b&今日计划:&/b&每天来公司的第一件事情,就是清理今日计划栏,确定今天要做的事情&/li&&li&&b&本周计划:&/b&近期要完成的事情,今日计划大多从此栏中挑选放到今日计划&/li&&li&&b&其他工作:&/b&什么信用卡还款,报销之类的,和工作没有直接相关的,我单独列出来,不想干活,想划一划的时候,完成这里的卡片&/li&&li&&b&完成:&/b&做完的事情移到这一栏,一周清理一次。你的周报要写什么,就看这一栏&/li&&li&&b&下周计划:&/b&非本周要完成的工作计划&/li&&li&&b&后续要做的需求:&/b&做产品这一行,动不动就会有一些新点子,先记在这里,之后当你要列FL的时候,可以从里面挑出来一些。&/li&&/ul&&figure&&img src=&https://pic4.zhimg.com/v2-bb813730edfa0e6bba8f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1685& data-rawheight=&853& class=&origin_image zh-lightbox-thumb& width=&1685& data-original=&https://pic4.zhimg.com/v2-bb813730edfa0e6bba8f_r.jpg&&&/figure&&p&&br&&/p&&p&Trello还可以针对不同的卡片增加不同的颜色,一般我会以项目来区分&/p&&p&当然你可以把绿色留给老板,老板布置的任务标记个绿色(为什么是绿色呢?黑人问号?)&/p&&figure&&img src=&https://pic2.zhimg.com/v2-85a7aa5c0bacd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&924& data-rawheight=&657& class=&origin_image zh-lightbox-thumb& width=&924& data-original=&https://pic2.zhimg.com/v2-85a7aa5c0bacd_r.jpg&&&/figure&&p&Trello也有手机版,手机上和网页也是同步的。对了,Trello可以插入图片的,不过我不太用。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-b86d4d50adbcf5c5fb6e7f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1178& data-rawheight=&653& class=&origin_image zh-lightbox-thumb& width=&1178& data-original=&https://pic1.zhimg.com/v2-b86d4d50adbcf5c5fb6e7f_r.jpg&&&/figure&&p&&b&【整体评价】&/b&我之前用过番茄工作法和各种TODoList之类的APP,最终还是选择了Trello,一件事情一张卡片,非常好用,可视化的面板,基本上我现在离开他是挂机的状态。&/p&&p&&b&【收费情况】&/b&免费&/p&&p&&b&【推荐指数】&/b&★★★★★&/p&&h2&&b&3、最强大的截图+后处理工具:Snagit 吐血推荐!!!&/b&&/h2&&p&这款软件是7年前我在微软实习的时候,我的Mentor推荐给我的。结果一用就是7年,好用到爆,我敢说,这个将是你使用过,最好用的截图编辑软件,没有之一。缺点是,这个软件不是免费的……只能免费试用……&/p&&p&对了,这篇文章中所有的图片+Gif的后处理全部都是用Snagit制作的&/p&&ul&&li&&b&常用的功能&/b&&/li&&/ul&&p&&b&-两张图迅速拼在一起:&/b&选中一张复制后,到另一张那边黏贴&/p&&figure&&img src=&https://pic1.zhimg.com/v2-d3fcdaafb4dad48_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&546& data-rawheight=&402& class=&origin_image zh-lightbox-thumb& width=&546& data-original=&https://pic1.zhimg.com/v2-d3fcdaafb4dad48_r.jpg&&&/figure&&p&&b&-增加标注/线框/数字符号等&/b&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-6a399e6e6b0d8e17feba_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&550& data-rawheight=&405& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&https://pic3.zhimg.com/v2-6a399e6e6b0d8e17feba_r.jpg&&&/figure&&p&&b&-模糊/马赛克&/b&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-cea721bfb2acc7b2ecedee1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&561& data-rawheight=&412& class=&origin_image zh-lightbox-thumb& width=&561& data-original=&https://pic2.zhimg.com/v2-cea721bfb2acc7b2ecedee1_r.jpg&&&/figure&&p&&b&-局部剪裁&/b&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-5a7cd2d6f71e3ab55e5128_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&633& data-rawheight=&466& class=&origin_image zh-lightbox-thumb& width=&633& data-original=&https://pic1.zhimg.com/v2-5a7cd2d6f71e3ab55e5128_r.jpg&&&/figure&&p&&b&-资料库回溯:&/b&之前的用Snagit的截图和编辑的图片都在,而且速度一点都不会慢(为了防止暴露隐私,必须加一层模糊了,逃……)&/p&&figure&&img src=&https://pic4.zhimg.com/v2-fd7a093b92bf8ae1b46a7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1185& data-rawheight=&871& class=&origin_image zh-lightbox-thumb& width=&1185& data-original=&https://pic4.zhimg.com/v2-fd7a093b92bf8ae1b46a7_r.jpg&&&/figure&&p&&br&&/p&&ul&&li&&b&不常用,但是超屌的功能&/b&&/li&&/ul&&p&&b&-截取整个网页:&/b&网页一屏展示不下,一键可以滚动截屏,体验贼好&/p&&figure&&img src=&https://pic3.zhimg.com/v2-db35fa86c3adf236a3e6ca0e_b.jpg& data-size=&normal& data-rawwidth=&412& data-rawheight=&800& class=&content_image& width=&412&&&figcaption&避免干扰阅读,这张超长图做了缩小,他是一整屏的知乎&/figcaption&&/figure&&p&&b&-视频录屏:&/b&选择任意区域录屏(可以录制声音),支持Gif的方式输出。这分享里所有的Gif都是Snagit制作的。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-f26d9bddd7955_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&528& data-rawheight=&339& class=&origin_image zh-lightbox-thumb& width=&528& data-original=&https://pic2.zhimg.com/v2-f26d9bddd7955_r.jpg&&&/figure&&p&&b&【收费情况】&/b&收费,小贵&/p&&p&&b&【推荐指数】&/b&★★★★★&/p&&h2&&b&4、脑图/流程图工具-Process On Mind/百度脑图&/b&&/h2&&p&因为我设备比较多,所以软件优选可以在线同步的,尤其是脑图,Process作为我首推的,脑图中该有的风格,插入图片,符号,注释等能力,他也都有。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-b888eff98d324b8fc706a62184dab179_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1915& data-rawheight=&941& class=&origin_image zh-lightbox-thumb& width=&1915& data-original=&https://pic2.zhimg.com/v2-b888eff98d324b8fc706a62184dab179_r.jpg&&&/figure&&p&&br&&/p&&ul&&li&&b&也可以用来画流程图&/b&&/li&&/ul&&figure&&img src=&https://pic1.zhimg.com/v2-156e4a8cca74410badae4_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&828& data-rawheight=&691& class=&origin_image zh-lightbox-thumb& width=&828& data-original=&https://pic1.zhimg.com/v2-156e4a8cca74410badae4_r.jpg&&&/figure&&ul&&li&&b&最大的优势:&/b&稳定,性能好,基本上大型的脑图也不会有卡顿感,分支不会错乱。&/li&&/ul&&figure&&img src=&https://pic1.zhimg.com/v2-ab6af7e61b9_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1280& data-rawheight=&720& data-thumbnail=&https://pic2.zhimg.com/v2-ab6af7e61b9_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic2.zhimg.com/v2-ab6af7e61b9_r.jpg&&&/figure&&p&&br&&/p&&p&Processon的缺点是不完全免费,分享关注公账号后,貌似是可以存10几个免费的文件,再多就要付费了。&/p&&p&&b&【收费情况】&/b&部分免费&/p&&p&&b&【推荐指数】&/b&★★★★&/p&&p&鉴于Processon收费,所以再推荐一款免费的在线脑图:&b&百度脑图&/b&,完全免费。&/p&&p&不过近两年这块百度对于这块资源投入越来越少,所以会出现一些加载资源慢,排版交错类的Bug。但画一些小型不复杂的脑图时挺好用的。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-0a910acd54a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1669& data-rawheight=&950& class=&origin_image zh-lightbox-thumb& width=&1669& data-original=&https://pic3.zhimg.com/v2-0a910acd54a_r.jpg&&&/figure&&p&当然了,毕竟是友商的产品,涉及到我厂敏感信息的脑图我是不会往这儿放的,其他人随意,hiahiahia&/p&&p&&b&【收费情况】&/b&免费&/p&&p&&b&【推荐指数】&/b&★★★☆&/p&&h2&&b&5、素材采集-花瓣 Chrome插件&/b&&/h2&&p&产品经理平时总要收集一些设计很赞的图片/视频,花瓣是国内做的比较好用的收集器,并且上面的资源也挺多的,平时找资源(不是男生想象的那种),可以去花瓣上找,还可以添加标签分类。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-2f83daa8eb67c8f0629fcc4_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1500& data-rawheight=&938& class=&origin_image zh-lightbox-thumb& width=&1500& data-original=&https://pic2.zhimg.com/v2-2f83daa8eb67c8f0629fcc4_r.jpg&&&/figure&&p&但今天要推荐的是花瓣的Chrome插件,也是很好用的,当你发现在花瓣之外的网站有想要采集的图片/视频时,可以快速采集到花瓣,&b&不需要下载/上传等繁琐的操作&/b&。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-f6cde93e69c8ff0b6bc773d8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&800& data-rawheight=&762& data-thumbnail=&https://pic1.zhimg.com/v2-f6cde93e69c8ff0b6bc773d8_b.jpg& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic1.zhimg.com/v2-f6cde93e69c8ff0b6bc773d8_r.jpg&&&/figure&&p&&b&花瓣的Chrome插件下载方式&/b&:Chrome右上角-&更多工具-&扩展程序-&搜索花瓣-&添加即可使用。&/p&&p&&br&&/p&&p&&b&【收费情况】&/b&免费&/p&&p&&b&【推荐指数】&/b&★★★☆&/p&&h2&&b& 6、图片压缩-TinyPNG&/b&&/h2&&p&偶尔要帮开发GG切个图,或者自己要压缩个图的时候,就可以用TinyPNG。&/p&&p&它可以批量上传图(直接拖到虚线框内即可),压缩速度快,压缩算法好,对图片影响小,大部分情况下它可将图片体积减少20-50%,图片质量损失肉眼不可察。小推一下。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-bbcfbe8bccfc5446b4eaeec_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1198& data-rawheight=&737& class=&origin_image zh-lightbox-thumb& width=&1198& data-original=&https://pic1.zhimg.com/v2-bbcfbe8bccfc5446b4eaeec_r.jpg&&&/figure&&p&TinyPNG是一个在线工具,无需下载,&a href=&http://link.zhihu.com/?target=https%3A//tinypng.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&官网在此&/a&。&/p&&p&&b&【收费情况】&/b&免费&/p&&p&&b&【推荐指数】&/b&★★★&/p&&p&&b& 智图&/b&&/p&&p&说到图片压缩,差点忘了自家产品“智图”,这是腾讯ISUX前端团队开发的一个专门用于图片压缩和图片格式转换的平台。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-efb2f2ad1de19fcb86a0a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&2106& data-rawheight=&1850& class=&origin_image zh-lightbox-thumb& width=&2106& data-original=&https://pic3.zhimg.com/v2-efb2f2ad1de19fcb86a0a_r.jpg&&&/figure&&p&和TinyPNG相比,智图能为上传图片自动选择压缩效果最优的图片格式,还提供webp格式可选,压缩效果不相上下,甚至还能选择压缩品质。&/p&&p&不过,虽然也能批量拖拽,但一次只能拖10个,而TinyPDF是20个,鹅厂加油啊,哈哈哈。&/p&&p&&b&【收费情况】&/b&免费&/p&&p&&b&【推荐指数】&/b&★★★&/p&&p&&br&&/p&&p&最后的最后,非常非常欢迎大家在后面评论或者 cue我 &a class=&member_mention& href=&http://www.zhihu.com/people/5331afadbf6d17a03b75fb7f3c0ea464& data-hash=&5331afadbf6d17a03b75fb7f3c0ea464& data-hovercard=&p$b$5331afadbf6d17a03b75fb7f3c0ea464&&@汪倩怡&/a&,推荐你喜欢的软件或者应用,我会定期去看看,好用的话,一起更新到文章中(放心,会注明出处的。哈哈)&/p&
入行7年,可以说阅遍无数效率工具,但对产品经理来说,真正高效的办公软件都有哪些呢?以下工具是我7年经验的良心推荐,谁用谁知道,工作效率提升100% 1、交互工具-墨刀 吐血推荐!!!我用过很多交互制作软件,包括老牌的Axure/Sketch,还有一些国外交互制…
&p&首先,请牢记2点:&/p&&p&&br&&/p&&ul&&li&JS是单线程语言&/li&&li&JS的Event Loop是JS的执行机制。深入了解JS的执行,就等于深入了解JS里的event loop&/li&&/ul&&p&&br&&/p&&p&&b&1.灵魂三问:JS为什么是单线程的?为什么需要异步?单线程又是如何实现异步的呢?&/b&&/p&&p&技术的出现,都跟现实世界里的应用场景密切相关的。同样的,我们就结合现实场景,来回答这三个问题。&/p&&p&(1) JS为什么是单线程的?&/p&&p&JS最初被设计用在浏览器中,那么想象一下,如果浏览器中的JS是多线程的。&/p&&p&场景描述:&/p&&p&那么现在有2个进程,process1 process2,由于是多进程的JS,所以他们对同一个dom,同时进行操作。process1 删除了该dom,而process2 编辑了该dom,同时下达2个矛盾的命令,浏览器究竟该如何执行呢?&/p&&p&这样想,JS为什么被设计成单线程应该就容易理解了吧。&/p&&p&(2) JS为什么需要异步?&/p&&p&场景描述:&/p&&p&如果JS中不存在异步,只能自上而下执行,如果上一行解析时间很长,那么下面的代码就会被阻塞。对于用户而言,阻塞就意味着&卡死&,这样就导致了很差的用户体验&/p&&p&所以,JS中存在异步执行。&/p&&p&(3) JS单线程又是如何实现异步的呢?&/p&&p&既然JS是单线程的,只能在一条线程上执行,又是如何实现的异步呢?&/p&&p&是通过的事件循环(event loop),理解了event loop机制,就理解了JS的执行机制。&/p&&p&&br&&/p&&p&&b&2.JS中的event loop(1)&/b&&/p&&p&例1,观察它的执行顺序&/p&&p&&br&&/p&&ul&&li&
console.log(1)&/li&&li&&br&&/li&&li&
setTimeout(function(){&/li&&li&
console.log(2)&/li&&li&
},0)&/li&&li&&br&&/li&&li&
console.log(3)&/li&&/ul&&p&&br&&/p&&p&运行结果是:1 3 2&/p&&p&也就是说,setTimeout里的函数并没有立即执行,而是延迟了一段时间,满足一定条件后才去执行的,这类代码,我们叫异步代码。&/p&&p&所以,这里我们首先知道了JS里的一种分类方式,就是将任务分为:同步任务和异步任务。&/p&&p&按照这种分类方式:JS的执行机制是:&br&&/p&&p&&br&&/p&&ul&&li&首先判断JS是同步还是异步,同步就进入主进程,异步就进入event table&/li&&li&异步任务在event table中注册函数,当满足触发条件后,被推入event queue&/li&&li&同步任务进入主线程后一直执行,直到主线程空闲时,才会去event queue中查看是否有可执行的异步任务,如果有就推入主进程中&/li&&/ul&&p&&br&&/p&&p&以上三步循环执行,这就是event loop。&/p&&p&所以上面的例子,你是否可以描述它的执行顺序了呢?&/p&&p&&br&&/p&&ul&&li&console.log(1) 是同步任务,放入主线程里&/li&&li&setTimeout() 是异步任务,被放入event table, 0秒之后被推入event queue里&/li&&li&console.log(3 是同步任务,放到主线程里&/li&&/ul&&p&&br&&/p&&p&当 1、 3在控制条被打印后,主线程去event queue(事件队列)里查看是否有可执行的函数,执行setTimeout里的函数。&/p&&p&&br&&/p&&p&&b&3.JS中的event loop(2)&/b&&/p&&p&所以,上面关于event loop就是我对JS执行机制的理解,直到我遇到了下面这段代码。&/p&&p&例2:&/p&&p&&br&&/p&&ul&&li& setTimeout(function(){&/li&&li&
console.log('定时器开始啦')&/li&&li& });&/li&&li&&br&&/li&&li& new Promise(function(resolve){&/li&&li&
console.log('马上执行for循环啦');&/li&&li&
for(var i = 0; i & 10000; i++){&/li&&li&
i == 99 && resolve();&/li&&li&
}&/li&&li& }).then(function(){&/li&&li&
console.log('执行then函数啦')&/li&&li& });&/li&&li&&br&&/li&&li& console.log('代码执行结束');&/li&&/ul&&p&&br&&/p&&p&尝试按照,上文我们刚学到的JS执行机制去分析:&/p&&p&&br&&/p&&ul&&li&setTimeout 是异步任务,被放到event table&/li&&li&new Promise 是同步任务,被放到主进程里,直接执行打印 console.log('马上执行for循环啦')&/li&&li&.then 里的函数是异步任务,被放到event table&/li&&li&console.log('代码执行结束') 是同步代码,被放到主进程里,直接执行&/li&&/ul&&p&&br&&/p&&p&所以,结果是: 马上执行for循环啦---代码执行结束---定时器开始啦---执行then函数啦吗?&/p&&p&亲自执行后,结果居然不是这样,而是: 马上执行for循环啦---代码执行结束---执行then函数啦---定时器开始啦&/p&&p&那么,难道是异步任务的执行顺序,不是前后顺序,而是另有规定?事实上,按照异步和同步的划分方式,并不准确。&/p&&p&而准确的划分方式是:&/p&&p&&br&&/p&&ul&&li&macro-task(宏任务):包括整体代码script,setTimeout,setInterval&/li&&li&micro-task(微任务):Promise,process.nextTick&br&&/li&&/ul&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-f43b7d7fc69fb166dc5fc_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&800& data-rawheight=&658& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic3.zhimg.com/v2-f43b7d7fc69fb166dc5fc_r.jpg&&&/figure&&p&&br&&/p&&p&按照这种分类方式,JS的执行机制是:&/p&&p&&br&&/p&&ul&&li&执行一个宏任务,过程中如果遇到微任务,就将其放到微任务的“事件队列”里&/li&&li&当前宏任务执行完成后,会查看微任务的“事件队列”,并将里面全部的微任务依次执行完&/li&&li&重复以上2步骤,结合event loop(1) event loop(2),就是更为准确的JS执行机制了&/li&&/ul&&p&&br&&/p&&p&尝试按照刚学的执行机制,去分析例2:&/p&&p&&br&&/p&&ul&&li&首先执行script下的宏任务,遇到setTimeout,将其放到宏任务的“队列”里&/li&&li&遇到 new Promise直接执行,打印&马上执行for循环啦&&/li&&li&遇到then方法,是微任务,将其放到微任务的“队列”里。&/li&&li&打印 &代码执行结束&&/li&&li&本轮宏任务执行完毕,查看本轮的微任务,发现有一个then方法里的函数,打印&执行then函数啦&&/li&&li&到此,本轮的event loop 全部完成。&/li&&li&下一轮的循环里,先执行一个宏任务,发现宏任务的“队列”里有一个setTimeout里的函数,执行打印&定时器开始啦&&/li&&/ul&&p&&br&&/p&&p&所以最后的执行顺序是: 马上执行for循环啦---代码执行结束---执行then函数啦---定时器开始啦&/p&&p&&br&&/p&&p&&b&4.谈谈setTimeout&/b&&/p&&p&这段setTimeout代码什么意思? 我们一般说: 3秒后,会执行setTimeout里的那个函数&/p&&p& setTimeout(function(){
console.log('执行了') },3000)
&br&&/p&&p&但是这种说并不严谨,准确的解释是:3秒后,setTimeout里的函数被会推入event queue,而event queue(事件队列)里的任务,只有在主线程空闲时才会执行。&/p&&p&所以只有满足 (1)3秒后 (2)主线程空闲,同时满足时,才会3秒后执行该函数&/p&&p&如果主线程执行内容很多,执行时间超过3秒,比如执行了10秒,那么这个函数只能10秒后执行了。&/p&&p&&br&&/p&&p&作者: ziwei3749&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//segmentfault.com/a/6637& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&segmentfault.com/a/1190&/span&&span class=&invisible&&&/span&&span class=&ellipsis&&&/span&&/a&&/p&
首先,请牢记2点: JS是单线程语言JS的Event Loop是JS的执行机制。深入了解JS的执行,就等于深入了解JS里的event loop 1.灵魂三问:JS为什么是单线程的?为什么需要异步?单线程又是如何实现异步的呢?技术的出现,都跟现实世界里的应用场景密切相关的。同…
&figure&&img src=&https://pic1.zhimg.com/v2-d34e6ffaf32dc2d50cc0a25e2962ac07_b.jpg& data-rawwidth=&2551& data-rawheight=&1417& class=&origin_image zh-lightbox-thumb& width=&2551& data-original=&https://pic1.zhimg.com/v2-d34e6ffaf32dc2d50cc0a25e2962ac07_r.jpg&&&/figure&&blockquote&本文作者:&a href=&http://link.zhihu.com/?target=http%3A//github.com/berwin/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Berwin&/a&,W3C性能工作组成员,360导航高级前端工程师。Vue.js早期用户,《深入浅出Vue.js》(正在出版)作者。&a href=&http://link.zhihu.com/?target=http%3A//github.com/berwin/blog& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&博客链接&/a&&/blockquote&&p&前几天一个朋友问了我一个问题:为什么&code&Object.keys&/code&的返回值会自动排序?&/p&&p&例子是这样的:&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kr&&const&/span& &span class=&nx&&obj&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&
&span class=&mi&&100&/span&&span class=&o&&:&/span& &span class=&s1&&'一百'&/span&&span class=&p&&,&/span&
&span class=&mi&&2&/span&&span class=&o&&:&/span& &span class=&s1&&'二'&/span&&span class=&p&&,&/span&
&span class=&mi&&7&/span&&span class=&o&&:&/span& &span class=&s1&&'七'&/span&
&span class=&p&&}&/span&
&span class=&nb&&Object&/span&&span class=&p&&.&/span&&span class=&nx&&keys&/span&&span class=&p&&(&/span&&span class=&nx&&obj&/span&&span class=&p&&)&/span& &span class=&c1&&// [&2&, &7&, &100&]&/span&
&/code&&/pre&&/div&&p&而下面这例子又不自动排序了?&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kr&&const&/span& &span class=&nx&&obj&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&
&span class=&nx&&c&/span&&span class=&o&&:&/span& &span class=&s1&&'c'&/span&&span class=&p&&,&/span&
&span class=&nx&&a&/span&&span class=&o&&:&/span& &span class=&s1&&'a'&/span&&span class=&p&&,&/span&
&span class=&nx&&b&/span&&span class=&o&&:&/span& &span class=&s1&&'b'&/span&
&span class=&p&&}&/span&
&span class=&nb&&Object&/span&&span class=&p&&.&/span&&span class=&nx&&keys&/span&&span class=&p&&(&/span&&span class=&nx&&obj&/span&&span class=&p&&)&/span& &span class=&c1&&// [&c&, &a&, &b&]&/span&
&/code&&/pre&&/div&&p&当朋友问我这个问题时,一时间我也回答不出个所以然。故此去查了查&a href=&http://link.zhihu.com/?target=https%3A//tc39.github.io/ecma262/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ECMA262规范&/a&,再加上后来看了看这方面的文章,明白了为什么会发生这么诡异的事情。&/p&&p&故此写下这篇文章详细介绍,当&code&Object.keys&/code&被调用时内部都发生了什么。&/p&&h2&1. ***&/h2&&p&对于上面那个问题先给出结论,&code&Object.keys&/code&在内部会根据属性名&code&key&/code&的类型进行不同的排序逻辑。分三种情况:&/p&&ol&&li&如果属性名的类型是&code&Number&/code&,那么&code&Object.keys&/code&返回值是按照&code&key&/code&从小到大排序&/li&&li&如果属性名的类型是&code&String&/code&,那么&code&Object.keys&/code&返回值是按照属性被创建的时间升序排序。&/li&&li&如果属性名的类型是&code&Symbol&/code&,那么逻辑同&code&String&/code&相同&/li&&/ol&&p&这就解释了上面的问题。&/p&&p&下面我们详细介绍&code&Object.keys&/code&被调用时,背后发生了什么。&/p&&h2&2. 当&code&Object.keys&/code&被调用时背后发生了什么&/h2&&p&当&code&Object.keys&/code&函数使用参数&code&O&/code&调用时,会执行以下步骤:&/p&&p&第一步:将参数转换成&code&Object&/code&类型的对象。&/p&&p&第二步:通过转换后的对象获得属性列表&code&properties&/code&。&/p&&blockquote&注意:属性列表&code&properties&/code&为List类型(&a href=&http://link.zhihu.com/?target=https%3A//www.ecma-international.org/ecma-262/%23sec-list-and-record-specification-type& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&List类型&/a&是&a href=&http://link.zhihu.com/?target=https%3A//www.ecma-international.org/ecma-262/%23sec-ecmascript-specification-types& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ECMAScript规范类型&/a&)&/blockquote&&p&第三步:将List类型的属性列表&code&properties&/code&转换为Array得到最终的结果。&/p&&blockquote&规范中是这样定义的:&br&&/blockquote&&ol&&li&调用&code&ToObject(O)&/code&将结果赋值给变量&code&obj&/code&&/li&&li&调用&code&EnumerableOwnPropertyNames(obj, &key&)&/code&将结果赋值给变量&code&nameList&/code&&/li&&li&调用&code&CreateArrayFromList(nameList)&/code&得到最终的结果&/li&&/ol&&h2&2.1 将参数转换成Object(&code&ToObject(O)&/code&)&/h2&&p&&code&ToObject&/code&操作根据下表将参数&code&O&/code&转换为Object类型的值:&/p&&p&参数类型
|&br&--------------|------------------------|&br&Undefined
| 抛出TypeError
| 抛出TypeError
|&br&Boolean
| 返回一个新的 Boolean 对象 |&br&Number
| 返回一个新的 Number 对象
|&br&String
| 返回一个新的 String 对象
|&br&Symbol
| 返回一个新的 Symbol 对象
|&br&Object
| 直接将Object返回
|&/p&&p&因为&code&Object.keys&/code&内部有&code&ToObject&/code&操作,所以&code&Object.keys&/code&其实还可以接收其他类型的参数。&/p&&p&上表详细描述了不同类型的参数将如何转换成Object类型。&/p&&p&我们可以简单写几个例子试一试:&/p&&p&先试试&code&null&/code&会不会报错:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-4c2770d5ddeb2acdf986f0_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1102& data-rawheight=&130& class=&origin_image zh-lightbox-thumb& width=&1102& data-original=&https://pic1.zhimg.com/v2-4c2770d5ddeb2acdf986f0_r.jpg&&&/figure&&p&图1 &code&Object.keys(null)&/code&&/p&&p&如图1所示,果然报错了。&/p&&p&接下来我们试试数字的效果:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-df452c77c89295cff3a1bd7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&298& data-rawheight=&84& class=&content_image& width=&298&&&/figure&&p&图2 &code&Object.keys(123)&/code&&/p&&p&如图2所示,返回空数组。&/p&&p&为什么会返回空数组?请看图3:&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-35fe160b3b74fce8cdcc52a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&524& data-rawheight=&154& class=&origin_image zh-lightbox-thumb& width=&524& data-original=&https://pic3.zhimg.com/v2-35fe160b3b74fce8cdcc52a_r.jpg&&&/figure&&p&图3 &code&new Number(123)&/code&&/p&&p&如图3所示,返回的对象没有任何可提取的属性,所以返回空数组也是正常的。&/p&&p&然后我们再试一下String的效果:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-2cf7c0f57c12c8af7323_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&750& data-rawheight=&132& class=&origin_image zh-lightbox-thumb& width=&750& data-original=&https://pic4.zhimg.com/v2-2cf7c0f57c12c8af7323_r.jpg&&&/figure&&p&图4 &code&Object.keys('我是Berwin')&/code&&/p&&p&图4我们会发现返回了一些字符串类型的数字,这是因为String对象有可提取的属性,看如图5:&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-745da3e8dc058c5c81a964cd76b8a53a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&658& data-rawheight=&456& class=&origin_image zh-lightbox-thumb& width=&658& data-original=&https://pic3.zhimg.com/v2-745da3e8dc058c5c81a964cd76b8a53a_r.jpg&&&/figure&&p&图5 &code&new String('我是Berwin')&/code&&/p&&p&因为String对象有可提取的属性,所以将String对象的属性名都提取出来变成了列表返回出去了。&/p&&h2&2.2 获得属性列表(&code&EnumerableOwnPropertyNames(obj, &key&)&/code&)&/h2&&p&获取属性列表的过程有很多细节,其中比较重要的是调用对象的内部方法&code&OwnPropertyKeys&/code&获得对象的&code&ownKeys&/code&。&/p&&blockquote&注意:这时的&code&ownKeys&/code&类型是List类型,只用于内部实现&/blockquote&&p&然后声明变量&code&properties&/code&,类型也是List类型,并循环&code&ownKeys&/code&将每个元素添加到&code&properties&/code&列表中。&/p&&p&最终将&code&properties&/code&返回。&/p&&blockquote&您可能会感觉到奇怪,ownKeys已经是结果了为什么还要循环一遍将列表中的元素放到&code&properties&/code&中。&br&这是因为EnumerableOwnPropertyNames操作不只是给Object.keys这一个API用,它内部还有一些其他操作,只是Object.keys这个API没有使用到,所以看起来这一步很多余。&/blockquote&&p&所以针对&code&Object.keys&/code&这个API来说,获取属性列表中最重要的是调用了内部方法&code&OwnPropertyKeys&/code&得到&code&ownKeys&/code&。&/p&&p&其实也正是内部方法&code&OwnPropertyKeys&/code&决定了属性的顺序。&/p&&p&关于&code&OwnPropertyKeys&/code&方法&a href=&http://link.zhihu.com/?target=https%3A//tc39.github.io/ecma262/%23sec-ordinary-object-internal-methods-and-internal-slots-ownpropertykeys& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ECMA-262&/a&中是这样描述的:&/p&&p&当&code&O&/code&的内部方法&code&OwnPropertyKeys&/code&被调用时,执行以下步骤(其实就一步):&/p&&ol&&li&&code&Return ! OrdinaryOwnPropertyKeys(O).&/code&&/li&&/ol&&p&而&code&OrdinaryOwnPropertyKeys&/code&是这样规定的:&/p&&ol&&li&声明变量&code&keys&/code&值为一个空列表(List类型)&/li&&li&把每个Number类型的属性,按数值大小升序排序,并依次添加到&code&keys&/code&中&/li&&li&把每个String类型的属性,按创建时间升序排序,并依次添加到&code&keys&/code&中&/li&&li&把每个Symbol类型的属性,按创建时间升序排序,并依次添加到&code&keys&/code&中&/li&&li&将&code&keys&/code&返回(&code&return keys&/code&)&/li&&/ol&&p&&b&上面这个规则不光规定了不同类型的返回顺序,还规定了如果对象的属性类型是数字,字符与Symbol混合的,那么返回顺序永远是数字在前,然后是字符串,最后是Symbol。&/b&&/p&&p&举个例子:&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&nb&&Object&/span&&span class=&p&&.&/span&&span class=&nx&&keys&/span&&span class=&p&&({&/span&
&span class=&mi&&5&/span&&span class=&o&&:&/span& &span class=&s1&&'5'&/span&&span class=&p&&,&/span&
&span class=&nx&&a&/span&&span class=&o&&:&/span& &span class=&s1&&'a'&/span&&span class=&p&&,&/span&
&span class=&mi&&1&/span&&span class=&o&&:&/span& &span class=&s1&&'1'&/span&&span class=&p&&,&/span&
&span class=&nx&&c&/span&&span class=&o&&:&/span& &span class=&s1&&'c'&/span&&span class=&p&&,&/span&
&span class=&mi&&3&/span&&span class=&o&&:&/span& &span class=&s1&&'3'&/span&&span class=&p&&,&/span&
&span class=&nx&&b&/span&&span class=&o&&:&/span& &span class=&s1&&'b'&/span&
&span class=&p&&})&/span&
&span class=&c1&&// [&1&, &3&, &5&, &a&, &c&, &b&]&/span&
&/code&&/pre&&/div&&p&属性的顺序规则中虽然规定了&code&Symbol&/code&的顺序,但其实&code&Object.keys&/code&最终会将&code&Symbol&/code&类型的属性过滤出去。(原因是顺序规则不只是给&code&Object.keys&/code&一个API使用,它是一个通用的规则)&/p&&h2&2.3 将List类型转换为Array得到最终结果(&code&CreateArrayFromList( elements )&/code&)&/h2&&p&现在我们已经得到了一个对象的属性列表,最后一步是将List类型的属性列表转换成Array类型。&/p&&p&将List类型的属性列表转换成Array类型非常简单:&/p&&ol&&li&先声明一个变量&code&array&/code&,值是一个空数组&/li&&li&循环属性列表,将每个元素添加到&code&array&/code&中&/li&&li&将&code&array&/code&返回&/li&&/ol&&h2&3. 该顺序规则还适用于其他API&/h2&&p&上面介绍的排序规则同样适用于下列API:&/p&&ol&&li&&code&Object.entries&/code&&/li&&li&&code&Object.values&/code&&/li&&li&&code&for...in&/code&循环&/li&&li&&code&Object.getOwnPropertyNames&/code&&/li&&li&&code&Reflect.ownKeys&/code&&/li&&/ol&&blockquote&注意:以上API除了&code&Reflect.ownKeys&/code&之外,其他API均会将&code&Symbol&/code&类型的属性过滤掉。&/blockquote&&p&&br&&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//weixin.qq.com/r/nUObg3zEZyEYrTjg9xaP& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&weixin.qq.com/r/nUObg3z&/span&&span class=&invisible&&EZyEYrTjg9xaP&/span&&span class=&ellipsis&&&/span&&/a& (二维码自动识别)&/p&&p&《奇舞周刊》是360公司专业前端团队「&b&奇舞团&/b&」运营的前端技术社区。关注公众号,及时获取更多原创文章。&/p&
本文作者:,W3C性能工作组成员,360导航高级前端工程师。Vue.js早期用户,《深入浅出Vue.js》(正在出版)作者。前几天一个朋友问了我一个问题:为什么Object.keys的返回值会自动排序?例子是这样的:const obj = {
100: '一百',
2: '二',…
&figure&&img src=&https://pic1.zhimg.com/v2-f3b2e13e983ca9dde736_b.jpg& data-rawwidth=&658& data-rawheight=&411& class=&origin_image zh-lightbox-thumb& width=&658& data-original=&https://pic1.zhimg.com/v2-f3b2e13e983ca9dde736_r.jpg&&&/figure&&p&【小宅按】 这些书籍适合中级前端开发者阅读,初级前端开发人员买来除了自我安慰和垫高显示器以外可能没什么用处。说是推荐书单,实际上是笔者自己的读书计划。欢迎你在阅读中与笔者交流。&br&&br&&b&1. 《Redis实战》&/b&&br&&b&推荐理由&/b&: Redis是服务端的缓存技术。&b&缓存&/b&可以说只在性能优化阶段才有明显的作用,项目初期往往用不到。大多数使用&code&node.js&/code&进行后端开发的前端开发者实际上更多地是做中间层或者直接做后端服务,缓存技术对自己来说是技术盲区,私以为对许多开发者来说也是盲区。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-cf4abf4a918a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&465& data-rawheight=&588& class=&origin_image zh-lightbox-thumb& width=&465& data-original=&https://pic3.zhimg.com/v2-cf4abf4a918a_r.jpg&&&/figure&&p&&br&&b&2. 《大话数据结构》&/b&&br&&b&推荐理由&/b&:技术决定你能走多快,数据结构和算法决定你能走多远。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-a458dfba21a45f9fd7d1e28_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&434& data-rawheight=&606& class=&origin_image zh-lightbox-thumb& width=&434& data-original=&https://pic4.zhimg.com/v2-a458dfba21a45f9fd7d1e28_r.jpg&&&/figure&&p&&br&&b&3. 《算法图解》&/b&&br&&b&推荐理由&/b&:技术决定你能走多快,数据结构和算法决定你能走多远。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-4739cba4d0cae_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&357& data-rawheight=&507& class=&content_image& width=&357&&&/figure&&p&&br&&b&4. 《CSS世界》&/b&&br&&b&推荐理由&/b&:&code&CSS&/code&和&code&javascript&/code&一样,都是很容易上手,却很难精通的。&code&CSS&/code&几乎可以说是我们全团队的软肋,包括前端人员在内,敢说自己精通&code&js&/code&的大有人在,但敢说自己精通&code&CSS&/code&的寥寥无几。这本是前端知名博主张鑫旭的书籍,好评很多,讲的很细致。如果你更倾向一些CSS的使用技巧,可以去看《CSS揭秘》这本书,许多实现方法会改变你对&code&CSS&/code&的理解。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-a1a4a69de40ee2b7315af8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&439& data-rawheight=&558& class=&origin_image zh-lightbox-thumb& width=&439& data-original=&https://pic3.zhimg.com/v2-a1a4a69de40ee2b7315af8_r.jpg&&&/figure&&p&&br&&b&5.《javascript框架设计(第二版)》&/b&&br&&b&推荐理由&/b&:司徒正美的书,他的博客也是非常知名的。每个框架都有其优点和不足,如何在开发中扬长避短是非常考验基本功的。这本书会让你了解如何去设计一个框架,徒手打造简易版的&code&jQuery&/code&,&code&angularjs&/code&,&code&vue.js&/code&,&code&react.js&/code&并不是高不可攀,而当你能亲手造出一个简单框架时,你对它的理解必将到达另一个层次。你会发现,其实所有前端框架的架构都差不多,而核心的区别几乎全部集中在&b&算法&/b&上。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-779f75fefc_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&252& data-rawheight=&327& class=&content_image& width=&252&&&/figure&&p&&br&&b&6. 《javascript设计模式与开发实践》&/b&&br&&b&推荐理由&/b&:前端设计模式类的书本来就很少,这本是腾讯前端AlloyTeam团队出品,综合讲述前端的设计模式,设计原则,编程技巧,代码重构等等。&code&AlloyTeam&/code&有自己的资源站,感兴趣的读者可以自行搜索,资源还有博客非常多,质量也很高。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-c4cd49acca0cc5d088c0ef_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&345& data-rawheight=&482& class=&content_image& width=&345&&&/figure&&p&&br&&b&7. 《Node.js:来一打C++扩展》&/b&&br&&b&推荐理由&/b&:公众号&code&前端之巅&/code&上周推荐的书籍之一。我特别佩服那些在简历上将&i&使用&code&Express&/code&起一个后端服务&/i&写成&i&精通node.js&/i&的人。&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-ddec8c900df_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&411& data-rawheight=&551& class=&content_image& width=&411&&&/figure&&p&&br&&b&8. 《告别失控 软件开发团队管理必读》&/b&&br&&b&推荐理由&/b&:计算机类图书销售榜排名第5的技术管理类书籍,不想当将军的士兵不是好士兵,其他的不多说。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-f026ae88adba405c2014289b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&346& data-rawheight=&489& class=&content_image& width=&346&&&/figure&&p&&br&&b&9. 《视界·无界:写给UI设计师的设计书》&/b&&br&&b&推荐理由&/b&:没有审美的前端不是好架构师。读设计类的书不是让你抢设计师的饭碗(实际上你也抢不了),而是下次再有人说你的界面不好看时,你可以用“不懂审美”噎死他。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-e25ce4ad5f226b21f15b4d21b7455610_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&427& data-rawheight=&581& class=&origin_image zh-lightbox-thumb& width=&427& data-original=&https://pic3.zhimg.com/v2-e25ce4ad5f226b21f15b4d21b7455610_r.jpg&&&/figure&&p&&br&&b&10. 《前端工程化体系设计与实践》&/b&&br&&b&推荐理由&/b&:如果你不想永远只是写页面,就需要面对从开发者到工程师的思维转变。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-4e3b355dfd4b3a95fed96_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&415& data-rawheight=&557& class=&content_image& width=&415&&&/figure&&p&&br&&b&11.《企业IT架构转型之道 阿里巴巴中台战略思想与架构实践》&/b&&br&&b&推荐理由&/b&:曾经有一个前端大神说过,如果你想成为前端架构师,首先你得忘记自己是个前端。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-f3b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&274& data-rawheight=&381& class=&content_image& width=&274&&&/figure&&p&更多精彩内容,请滑至顶部点击右上角关注小宅哦~&/p&&figure&&img src=&https://pic3.zhimg.com/v2-84a72da1d78eebf64d5d1a9cc0cab8e3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&300& data-rawheight=&300& class=&content_image& width=&300&&&/figure&&hr&&p&文章转载自华为云社区&/p&&a href=&https://link.zhihu.com/?target=https%3A//bbs.huaweicloud.com/blogs/cfae11e89fc57ca23e93a89f& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic2.zhimg.com/v2-0b05df45acbdbe9bdf1e07eba12df1d5_ipico.jpg& data-image-width=&118& data-image-height=&119& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&2018年8月中级前端开发推荐书籍_云博客_云社区-华为云&/a&&p&&/p&
【小宅按】 这些书籍适合中级前端开发者阅读,初级前端开发人员买来除了自我安慰和垫高显示器以外可能没什么用处。说是推荐书单,实际上是笔者自己的读书计划。欢迎你在阅读中与笔者交流。 1. 《Redis实战》 推荐理由: Redis是服务端的缓存技术。缓存可以说…
&p&首先分享一位学长写的头条前端面经,是校招面试的,可能难度会稍微比实习生大一些,但也可以大概看到头条一般会考察前端的哪些知识:&/p&&blockquote&作者:牛客6124480号&br&来源:牛客网&/blockquote&&p&一面主要问了我一些关于安全方面的知识,XSS、CSRF等等,另外线上做了几道题,一道是分析 this 的指向,另一道是一个算法题,印象中是统计字符串中每个字符出现的频率。&/p&&p&一面过了立即通知等待二面。&/p&&p&二面问了一些实习的经历,因为有些到前端模版,所以着重问了一些对于模版的看法。&/p&&p&然后依然是线上写代码,实现一个 Node 中的 on,submit,off事件,需要考虑多种错误情况的处理,这块当时考虑的太少,很多情况都没有处理,然后也没有继续面,过了两天hr***姐通知挂掉了,不过头条的hr还是不错的,结果都有通知。&/p&&p&这位学长还分享了很多其他公司的前端面经,也可以作为参考:&/p&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/52390& data-draft-node=&block& data-draft-type=&link-card& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&感谢牛客,回馈一波前端面经_笔经面经_牛客网&/a&&hr&&p&接着再分享一位学长今日头条前端面经,也是校招的,同样难度可能比之实习生大一些,但也可以作为参考:&/p&&blockquote&作者:koshima&br&来源:牛客网&/blockquote&&h2&一面&/h2&&ol&&li&node.js microtask和task&/li&&li&css保持宽高比&/li&&li&跨域&/li&&li&性能优化&/li&&li&缓存&/li&&li&状态码&/li&&li&KSUM&/li&&li&数组去重&/li&&/ol&&h2&二面&/h2&&ol&&li&Nginx&/li&&li&thinkjs原理&/li&&li&负载均衡&/li&&li&设计模式&/li&&li&发布订阅的实现&/li&&/ol&&p&其他的有点忘了,不过二面面试官超级nice&/p&&h2&三面&/h2&&ol&&li&web安全,XSS,CSRF,SQL注入,点击劫持,HTTP劫持,DNS劫持,DNS污染&/li&&/ol&&p&&br&&/p&&p&跟上一位学长一样,这位学长还分享了很多其他公司的前端面经,也可以作为参考:&/p&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/50654& data-draft-node=&block& data-draft-type=&link-card& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&从实习到秋招的机器学习面试纪录_笔经面经_牛客网&/a&&hr&&p&最后再给题主分享一下今日头条的其他岗位面经,可以大概看看,了解一下头条面试的一些风格等,希望能对题主有所帮助~&/p&&ol&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/52700& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&2018实习+校招面经_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/52516& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&2018校招总结(外企,国内大公司,国内创业公司)_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/52419& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iOS秋招总结 = 面经 + 闲言碎语 (不断更新)&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/52390& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&感谢牛客,回馈一波前端面经_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/52210& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&秋招各个公司 算法工程师 面经(微软,百度,头条,美团等)&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/52168& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&渣硕面筋release v1.0(Google已跪)&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/51968& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&今日头条加面(第五面)已跪_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/50923& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&非科班渣硕秋招总结-回馈牛客_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/50654& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&从实习到秋招的机器学习面试纪录_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/50571& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&春招0 offer的渣渣,是如何在秋招找到自己满意的工作!!&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/50209& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&渣硕C++秋招笔经面经全纪录_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/54432& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&头条西安站后台开发三面跪面经_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/53512& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&头条面试被血虐_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/54432& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&头条西安站后台开发三面跪面经_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/49895& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&渣渣硕分享下测开的面经-努力坚持就有收获_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/49345& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&漫漫求职路全记录(长文慎入)_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/56144& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&今日头条测开视频面试面经_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/57239& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&非科班生的Android秋招求职经历_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/56712& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&安卓面经:百度腾讯滴滴美团头条网易搜狐华为链家小米拼多多_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/58508& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&秋招面经_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/58052& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&写一篇不常见题目面经大杂烩(算法岗)_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/57775& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&秋招总结(测试开发岗)_笔经面经_牛客网&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/57673& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&头条三面面经_笔经面经_牛客网&/a&&/li&&/ol&&p&&br&&/p&&p&最后,祝题主面试成功~~&/p&&p&悄悄地:欢迎题主面试完了来&a href=&//link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&牛客讨论区&/a&发面经呀~&/p&
首先分享一位学长写的头条前端面经,是校招面试的,可能难度会稍微比实习生大一些,但也可以大概看到头条一般会考察前端的哪些知识:作者:牛客6124480号 来源:牛客网一面主要问了我一些关于安全方面的知识,XSS、CSRF等等,另外线上做了几道题,一道是分…
&figure&&img src=&https://pic2.zhimg.com/v2-6bee96adbfb19_b.jpg& data-rawwidth=&710& data-rawheight=&355& class=&origin_image zh-lightbox-thumb& width=&710& data-original=&https://pic2.zhimg.com/v2-6bee96adbfb19_r.jpg&&&/figure&&h2&如果你和我一样一直在关注CSS Grid布局的话,你应该知道@Rachel Andrew和@Jen Simmons都是CSS Grid 布局的布道师。两位女士一直都在推进Grid的特性和完善相关的特性。这几天看到@Jen Simmons录了一个视频,聊了一下CSS Grid布局相关的误区。&/h2&&h2&前言&/h2&&p&在Web世界中,大家都知道,使用任何一项新技术都易于犯错,特别是像CSS Grid这样的与过去有很大变化的东西。初学者或者有一定经验的Web开发人员,都无法一时之间就能把控所有。@Jen Simmons录制了一个视频,向大家阐述了&b&使用CSS Grid的九大误区&/b&,也是使用CSS Grid布局易犯的错误,并且在视频中提出了一些相关的建议,让大家在使用CSS Grid布局的时候能尽量的避免这些误区,甚至可以帮助一些同学改掉一些旧习惯。&/p&&blockquote&如果你英文够好,建议先直接观看下面这段视频。接下来的视频都来自于@Jen Simmons录制的视频,都放置在Youtube网站上的免费视频。不过需要正常观后的话,需要自备天梯。&/blockquote&&p&&br&&/p&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/0Gr1XSyxZy0& data-draft-node=&block& data-draft-type=&link-card& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&youtu.be/0Gr1XSyxZy0&/span&&span class=&invisible&&&/span&&/a&&p&接下来简单的看看这九个误区,以及相对应的一些资源,希望接下来的内容能更好的帮助大家理解这几个误区,以及增强这方面的知识点,更好的避开这些误区。&/p&&h2&误区一:认为CSS Grid就是神&/h2&&p&在《&a href=&http://link.zhihu.com/?target=https%3A//www.w3cplus.com/css/guide-css-layout.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSS布局指南&/a&》一文中已经提到过,对于Web的布局,它将是一个永恒的话题。如果你对布局相关的知识有所了解,你应该知道,在CSS Grid出来之前,所有的布局方案都是针对的。直到CSS Grid出来之后,才有了二维的布局。就在此时,CSS Grid布局能解决很多以前一直无法解决的布局方案。&/p&&p&就因为CSS Grid布局具有二维布局特性,造成了大家对CSS Grid的第一个误区:&b&认为CSS Grid布局就是一神器,无所不能&/b&。事实上,这是一种对CSS Grid认识的误区。虽然CSS Grid布局能实现大部分的Web布局,但并不代表所有的布局都应该用CSS Grid来实现。正确的做法是:&/p&&blockquote&在适当的项目采用适当的布局方案。&/blockquote&&p&也因为这个误区,社区对这个现象有过很多的讨论,比如“Flexbox和Grid布局,哪个更好?”:&/p&&p&&br&&/p&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/hs3piaN4b5I& data-draft-node=&block& data-draft-type=&link-card& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&youtu.be/hs3piaN4b5I&/span&&span class=&invisible&&&/span&&/a&&p&&br&&/p&&p&有关于这方面的讨论还可以阅读:&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//hackernoon.com/the-ultimate-css-battle-grid-vs-flexbox-d40da0449faf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The ultimate CSS battle: Grid vs Flexbox&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//tutorialzine.com/2017/03/css-grid-vs-flexbox& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSS Grid VS Flexbox: A Practical Comparison&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//rachelandrew.co.uk/archives//should-i-use-grid-or-flexbox/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Should I use Grid or Flexbox?&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//redonion.se/flexbox-vs-css-grid-when-to-use-what-2/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Flexbox vs. CSS Grid, When to use what?&/a&&/li&&/ul&&p&正因为这样的讨论,在社区有一个共识。在Web布局当中,我们应该根据实际情况:&b&Flexbox和Grid布局结合在一起使用&/b&:&/p&&p&&br&&/p&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/dQHtT47eH0M& data-draft-node=&block& data-draft-type=&link-card& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&youtu.be/dQHtT47eH0M&/span&&span class=&invisible&&&/span&&/a&&p&&br&&/p&&p&特别是在Card组件方面的布局,把Flexbox和Grid结合在一起将更显优势:&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//www.w3cplus.com/css3/solving-problems-with-css-grid-and-flexbox-the-card-ui.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&使用CSS Grid和Flexbox制作Card&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//www.w3cplus.com/css3/css-grid-flexbox-solving-real-world-problems.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSS Grid和Flexbox解决实际的布局问题&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//medium.com/%40petermouland/css-grid-flexbox-solving-real-world-problems-1cce3ecb2b51& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSS Grid + Flexbox Solving Real-world Problems&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//getflywheel.com/layout/combine-flexbox-and-css-grids-for-layouts-how-to/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&How to combine Flexbox and CSS grids for efficient layouts&/a&&/li&&/ul&&p&另外一方面,哪所现在的布局效果大部分是规规矩矩的正方形,但在不久的将来,Web的布局将会实现类似于杂志的布局效果。面对这样的布局效果,CSS Grid就显得心有余而力不足。从这一方面来说,CSS Grid并不是像大家所说的,它是万能的。&/p&&p&&br&&/p&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/pOB75oTNhw0& data-draft-node=&block& data-draft-type=&link-card& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&youtu.be/pOB75oTNhw0&/span&&span class=&invisible&&&/span&&/a&&p&&br&&/p&&p&对于要实现类似于杂志风格的布局,那么还是需要&code&&a href=&http://link.zhihu.com/?target=https%3A//www.w3cplus.com/blog/tags/431.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&clip-path&/a&&/code&、&code&&a href=&http://link.zhihu.com/?target=https%3A//www.w3cplus.com/css3/css-masking.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&mask&/a&&/code&和&code&&a href=&http://link.zhihu.com/?target=https%3A//www.w3cplus.com/blog/tags/418.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&shape-outside&/a&&/code&相关的属性的结合 。特别是离不开&code&&a href=&http&/code&s://www.w3cplus.com/blog/tags/418.html&&shape-outside特性&/a&。&/code&&/p&&h2&误区二:只使用百分比设置尺寸大小&/h2&&p&Web的布局并不是一直都是固定宽度水平居中的布局,很多时候是有自适应的布局。实现自适应(流式布局)布局,在大家的脑海中应该是使用百分比来实现布局。但在CSS Grid布局中,并非一尘不变。主要是因为在CSS Grid的布局中,可以使用&code&min-content&/code&、&code&max-content&/code&和&code&minmax()&/code&相关的特性:&/p&&p&&br&&/p&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/lZ2JX_6SGNI& data-draft-node=&block& data-draft-type=&link-card& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&youtu.be/lZ2JX_6SGNI&/span&&span class=&invisible&&&/span&&/a&&p&有关于这方面的更详细的介绍还可以阅读下面相关的文章:&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//www.w3.org/TR/css-sizing-3/%23column-sizing& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSS Intrinsic & Extrinsic Sizing Module Level 3&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//alligator.io/css/css-grid-layout-minmax-function/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSS Grid Layout: The Minmax Function&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//www.hongkia%3Ccode%3Et.com/bl%3C/code%3Eog/css-grid-layout-minmax/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSS Grid Layout: How to Use minmax()&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/mVQiNpqXov8& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MinMax in CSS Grid&/a&&/li&&/ul&&p&除此之外,还可以使用CSS Grid布局独有的&code&fr&/code&单位。也可以帮助我们实现类似于百分比的布局:&/p&&p&&br&&/p&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/ZPtpzuRajzM& data-draft-node=&block& data-draft-type=&link-card& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&youtu.be/ZPtpzuRajzM&/span&&span class=&invisible&&&/span&&/a&&p&&br&&/p&&p&有关于&code&fr&/code&单位更多的介绍可以阅读:&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//css-tricks.com/introduction-fr-css-unit/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Introduction fr CSS unit&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//www.hongkiat.com/blog/css-grid-layout-fr-unit/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Guide to CSS Grid Layout Fr Unit&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//hackernoon.com/understanding-css-grids-fractional-units-fr-the-easy-way-5f43ee008f29& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Understanding CSS Grids Fractional Units (FR) the easy way&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//medium.com/flexbox-and-grids/what-you-didnt-know-about-the-css-fractional-unit-580bd62647e8& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&What You Didn’t know about the CSS Fractional Unit&/a&&/li&&/ul&&h2&误区三:需要断点&/h2&&p&&b&断点&/b&是&a href=&http://link.zhihu.com/?target=https%3A//www.w3cplus.com/blog/responsive& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Web响应式设计&/a&中的一个概念。借用媒体查询在不同的断点处实现不一样的布局效果。因此,很多同学一直误以为,在CSS Grid布局中实现响应式布局也需要通过媒体查询来实现。而事实上并非如此。&/p&&p&CSS Grid布局中有“&b&隐式&/b&”和“&b&显式&/b&”网格线的概念,同时在CSS Grid布局中使用&code&grid-template-columns: repeat(auto-fit, minmax(200px, fr))&/code&这样的代码,在不使用媒体查询的情况下就可以很轻易的实现响应式布局。&/p&&p&&br&&/p&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/tFKrK4eAiUQ& data-draft-node=&block& data-draft-type=&link-card& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&youtu.be/tFKrK4eAiUQ&/span&&span class=&invisible&&&/span&&/a&&h2&误区四:被网络线编号搞糊涂&/h2&&p&在CSS Grid布局中,网格线编号是一个很重要的概念。很多时候实现布局,都会借助网格线来实现。特别是在控制Web元素放置在具体的位置的时候,就可以使用网格线编号的特性。&/p&&p&另外在CSS Grid布局中,对于网格线还有两个非常重要的概念,那就是&b&隐式&/b&和&b&显式&/b&网格线的编号。另外在布局时,除了使用显式的网格线编号之外,还会根据你的布局区域,创建隐式网格线。也就是说,自动创建隐式网格线。&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//www.smashingmagazine.com/2017/10/naming-things-css-grid-layout/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Naming Things In CSS Grid Layout&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//bitsofco.de/css-grid-terminology/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSS Grid Layout Terminology, Explained&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//webdesign.tutsplus.com/tutorials/quick-tip-name-your-css-grid-lines-just-in-case--cms-27844& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Quick Tip: Name Your CSS Grid Lines, Just in Case&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//www.w3cplus.com/css3/explicit-and-implicit-grid.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSS Grid布局:显式和隐式网格线&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/-hmOZU7Zk10& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Innovative & Practical Graphic Design with CSS Grid&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/FEnRpy9Xfes& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Basics of CSS Grid: The Big Picture&/a&&/li&&/ul&&h2&误区五:总是使用12列网格&/h2&&p&&br&&/p&&p&&br&&/p&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/ZPtpzuRajzM& data-draft-node=&block& data-draft-type=&link-card& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&youtu.be/ZPtpzuRajzM&/span&&span class=&invisible&&&/span&&/a&&p&&br&&/p&&p&十二列网格,最早出处应该是&a href=&http://link.zhihu.com/?target=https%3A//960.gs/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&960gs网格系统&/a&。在众多CSS Framework系统中都源于960gs创建了自己的网格系统。估计也是因为这个原因,很多使用CSS Grid布局的同学都误以为,它是12列网格系统的一种变身,而事实并非如此。CSS Grid 布局是单独的一个CSS模块。除了具备12列网格系统的功能之外,还具有独特的网格特性。&/p&&h2&误区六:忽略行的幂值&/h2&&p&在网格布局中,总是脱离不开行的概念。一般情况下,四条边可以组成一个行,而且在一个行中有N个单元格。而在CSS Grid布局中,可以使用&code&fr&/code&、&code&minmax()&/code&、&code&max-content&/code&和&code&auto&/code&组合在一起定义CSS Grid布局中的行。这样就可以让内容在不同的视窗大小实现较好的布局效果。从而将响应式设计提高到一个全新的水平。&/p&&p&&br&&/p&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/EEOJZy_Gge4& data-draft-node=&block& data-draft-type=&link-card& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&youtu.be/EEOJZy_Gge4&/span&&span class=&invisible&&&/span&&/a&&p&&br&&/p&&p&另外,使用CSS Grid进行布局,在Web布局上可以真正的提供空白区域。这也正是行改变这一切的。&/p&&p&&br&&/p&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/YfIjFeBLhyA& data-draft-node=&block& data-draft-type=&link-card& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&youtu.be/YfIjFeBLhyA&/span&&span class=&invisible&&&/span&&/a&&p&&br&&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//www.slideshare.net/rachelandrew/unlocking-the-power-of-css-grid-layout& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unlocking the Power of CSS Grid Layout&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//www.smashingmagazine.com/2017/11/css-grid-supporting-browsers-without-grid/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Using CSS Grid: Supporting Browsers Without Grid&/a&&/li&&/ul&&h2&误区七:一个框架&/h2&&p&刚才提到了CSS Framework中的网格系统。这也造成一个误区,CSS Grid布局就是一个框架,一个布局框架。事实上,CSS Grid布局除了具有CSS Framework中的网格系统特性之外,还具备其他特性。这些特性是网格系统无法达到的。因为CSS Grid布局是一个二维布局,而网格系统事实是一个一维布局。&/p&&h2&误区八:等待IE11的消亡&/h2&&p&任何一个CSS特性,很多同学惧怕使用的原因之一就是浏览器支持度。那么CSS Grid的布局同样面临这样的问题。其实,最早提出CSS Grid布局模块是微软提出的功能模板,只不过后面其他的浏览器支持力度更快,造成一个现实就是其他浏览器比IE更早的实现CSS Grid布局的特性。&/p&&p&&br&&/p&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/7msERxu7ivg& data-draft-node=&block& data-draft-type=&link-card& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&youtu.be/7msERxu7ivg&/span&&span class=&invisible&&&/span&&/a&&p&&br&&/p&&p&面对不能支持的浏览器,对于前端的同学而言再正常不过了。对于CSS Grid布局也是类似的。你只需要按这&a href=&http://link.zhihu.com/?target=https%3A//www.youtube.com/playlist%3Flist%3DPLbSquHt1VCf1kpv9WRGMCA9_Nn4vCLZ9Y& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&七个方面去做&/a&,就可以解决相应的浏览器兼容问题。&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//rachelandrew.co.uk/archives//should-i-try-to-use-the-ie-implementation-of-css-grid-layout/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Should I try to use the IE implementation of CSS Grid Layout?&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//medium.com/%40elad/supporting-css-grid-in-internet-explorer-b& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Supporting CSS Grid in Internet Explorer&/a&&/li&&/ul&&h2&误区九:犹豫不决&/h2&&p&像CSS Grid布局这样的布局新技术使用得实现旧的设计更加容易。更令人兴奋的是,我们可以做一些新的事情 —— 把网页上的平面设计提升到一个新的高度。那么使用CSS Grid布局,可以让我重新创作,实现更为复杂而又有意义的布局。通过这样的方式来了解CSS Grid布局的特性,以此更好地理解它对设计的意义。&/p&&p&&br&&/p&&a href=&http://link.zhihu.com/?target=https%3A//youtu.be/qNtJ5p3h2A4& data-draft-node=&block& data-draft-type=&link-card& class=& external& target=&_bl

我要回帖

更多关于 now 的文章

 

随机推荐