如果不能站在这个时代的无知与傲慢最前端,那么终将被 来自

对武昌火车站杀人事件的思考:尊严在这个时代太过稀缺
我的图书馆
对武昌火车站杀人事件的思考:尊严在这个时代太过稀缺
文、沈彻今天看了一个新闻,是发生在武昌火车站的杀人案件,平安武昌的微博更新:“2月18日中午12时25分,犯罪嫌疑人胡某(男,22岁)因口角纠纷,持面馆菜刀在武昌区武南一村71号一面馆门口,将面馆业主姚某砍死。民警快速出警,现场将犯罪嫌疑人抓获,目前案件正在审查中。”之前的口角有这么一个情节,不知是真是假:“武昌站东广场炸酱面管刚刚发生一起凶杀案,炸酱面管老板被人把脑袋割下来了!据旁边围观的人讲,就因为结账时别人问怎么这么贵,他说吃不起别吃!那人就抽刀子出来把他砍死,脑袋丢垃圾桶里了。”这个事情如此荒唐,刚过完年的两件事,一是逃票被老虎咬死,一是口角杀人砍头,似乎就已经把今年定格在了荒唐之中。2017主旋律:荒唐。记得之前看过一篇文章,讲述杀人的事情大多出现在一时冲动之下,往往不是严密的计划才杀人的,因为口角,气愤上头,控制不住自己的情绪,便杀了人。如果是严密的计划杀人占主要部分,那我想很多贪官早就被计划死了,悲剧就在这里,生活中很多不痛快不如意的人受着生活的压力,得不到最起码的尊重,不知道什么时候因为一件小事就可能爆发出这种激情来,造成“激情杀人”的后果,杀人和被杀的人都是社会的悲哀,可怜又荒诞。我看了那个犯罪嫌疑人的照片,给我的感觉就是他的心态非常坦然,淡定。一般来讲,面对死亡,能够做到淡定的只有三种可能,一种是看破生死,对人生有足够深度的理解,一种是为自己的人生目的努力过,不管实现还是没有实现,都已经没有遗憾,还有一种是活着没有快乐,没有希望,感觉活着就是一种痛苦。显然,这位年轻人属于第三者,他活着得不到尊重,倘若能感受到一丝的温暖,也绝不会去如此淡定,也必然在他的眼神中可以看到深深的悔恨和懊恼。被他砍死的那位,其实很像被老虎咬死的游客,谁会想到逃票一下子就逃到了老虎身边?谁会想到不尊重的这位顾客被自己的最后一棵“不尊重的稻草”所触怒激情?如此不尊重顾客的餐馆在这片土地上其实有很多,我记得有次,我去一个的饭店里,结果却只点了一份面,服务员都大概是老板的女儿,就对我冷眼相加,我等了很久才把面端上来,这个事情我印象深刻,以至于我记得到现在都记得那个餐馆在哪里,却从来都没再去过。不过好在我的人生还有很多值得留恋的东西,还有很多想要去做的事情,否则,在这种没有尊严的时代,我感觉也没什么意思。尊严,这真是一个说滥的词汇,却是一件稀缺的事情。体制让我们每个人都变的没有尊严,大家只在乎物质上的面子,而忘了真正尊严的含义。张维迎谈到社会合理性和合法性冲突时说:“合理性与法律的矛盾到一定程度就可能摧毁了道德边界。举一个例子:一个医生的合理报酬是多少,应该由市场决定。假定他的合理报酬应该是50万。但政府规定他只能拿5万,这时候就出现了合理与合法的冲突。如果他意识到自己受到不公平待遇,他就可能收红包,但收取红包之后,他的职业道德观念就跟原来不一样了。如果他可以合法地每年拿50万薪水,他会觉得自己有尊严,从事的是一种神圣的职业,他的敬业精神就会非常好。但如果他偷偷摸摸拿钱,即便最后拿到80万、100万,他也觉得自己活得没有尊严,医生这个职业不再神圣,这时候他的职业道德就很可能出问题。”事实上这样的事情在各行各业都普遍存在,就算不是做企业或者创业的老板,只是一个小小的员工,只要了解到自己为行贿的老板打工,都会改变从前在学校里对社会的认知尊严便将荡然无存,剩下的只是攀比身上的名牌,出行的车子,老婆的美丑。很多朋友谈论找老婆要找一个有内涵的老婆时,我内心就会冷笑:难道这片土地上真的存在有尊严的女人吗?连尊严都谈不上,又何谈内涵?谈一谈在这样的悲催的时代,如何相互理解彼此仅存的一点儿正义感还比较实在。正义,其实更加稀缺。当大家都一门心思顾及物质上的面子时,已然不知道顾及他人的感受,失去了理解他人的能力,进而导致整个社会都“闷声发大财”,制造一个个势利眼的机器。从这个角度来看,目前社会还不如过去社会,在过去的时候,坏人知道自己坏,做坏事则找“上有老下有小”的借口,只有特别的大恶人才会理直气壮地犯坏,当今社会的人坏,却已经不知道自己有多坏,哪怕是一个小民,也认为自己的恶行不是恶行,而是理所当然。人人有罪,却人人都自觉无罪。杀人的人之所以如此淡定,或许还有另外一层原因,那即是他终于用他的行动挽回了尊严。一个把强奸自己老婆当场杀死都叫犯罪的国度,法理和合理如此在人性中冲突,犯法往往成为了一件挽留尊严的行为。人性中真正在意的不一定是金钱、权力、面子,而很多人真正看重的是尊严,是他的爱好和兴趣。杀人,挽回了尊严,在特定的时刻,比一切都值得,在特定的时代,让人过了那一刻也绝不后悔。到底是什么让那个人因为这么一点儿口角就要了人的命?且杀人之后如此淡定?到底是什么让那个老板因为这么一点口角就送了命?且身为老板如此对待顾客?身为人却如此对待他人?要是因为利益争执产生口角还情有可原,只是因着一碗面,因着不尊重就产生口角……我不想看见什么事都埋怨社会,但是我实在不得不说:这是一个弱肉强食的社会,遵循着原始的自然法则,适者生存,优胜劣汰,直到没命,可是我们的宣传却说这不是一个弱肉强食的社会,而是铺满了玫瑰花,于是凯恩斯说了那么一句话,原话我忘了,大概是这样的:“通往地狱的道路,铺满了玫瑰花。”凯恩斯是上个世纪的经济学家,这片土地上的人民依然没有学会借鉴历史。【作者微信号】shenches关注公众号:沈彻有关自由 有关逻辑有关永远跳动并沸腾的心脏阅读&79396922投诉精选留言写留言&225?&?&明明就是我&?一个有思想的人才会幸福,一个有思想的人才明白尊严是幸福的基础。可悲的是我们这国度的教育的目标:让国民不能有思想。3天前&167天理人心这是一个让普通民众深恶痛绝的社会,有钱人的任性和极端及不可一世似乎成了一种社会正能量,一切向钱看的思想将会颠覆所有善良的美好的人伦道德,也正好应验了那句老话:自己作死合情合理。3天前&133老多胡姓青年的斩首行动确实惊悚了一点,姚姓老板也为他的野蛮付出的代价确实太大了一点,但这是尊严与野蛮战斗过程中发生的意外结果。这种意外的结果在血腥地传递着这样的警示:践踏尊严就是践踏生命,当有被践踏者认为尊严比命贵时,他就会宁要尊严不要命。一个国家“视尊严比命贵”的人多了,野蛮就会自动遁形,这就叫国家文明。3天前&118季风东来一个有思想的人活在当下20世纪时期的中国是件很痛苦的事!这是一个颠倒黑白,谎言漫天,心灵扭曲,数典忘祖,认贼作父,是非颠倒,谬论横行,唯利是图,道德沦丧。中华民族处在虚假繁荣,实则走向万劫不复的衰亡时代!3天前&110莲心~暖牛总代【诚招代理】当尊严随时被践踏得一文不值,剩下的就只有戾气了。3天前&101青天白日对于杀人者为什么如此坦然的而分析的三个原因是高见!3天前&29作者回复3天前&96苏绒??仁通会计代理&岳阳&潍坊生无所依,死又何惧!是绝望杀人?压力杀人?痛苦杀人?是要命的生存环境!大家都没有幸福感,性格都变得暴躁、乖戾、麻木、冷漠!& &&&&&从另一方面讲,火车站一直是欺生的高发地。也以此告诫更多火车站附近的店主,不要失去诚信谋利,任何的一次诚信缺失和嘴上无德都有可能遇到无妄之灾! &&&&既然都没法摆脱底层人民的痛苦,就都互相体谅一下,好好说话!3天前&78江の涛从书面的人人平等,到现实的等级森严,所有人的人格或许都经历过严重的扭曲和撕裂。能够康复的只是少数……3天前&66?在中国,的确可以对人性弱点理解的更加透彻。 千奇百怪的思维方式,有时真的让人匪夷所思。 比如这个叫(远)的人,说作者整天胡说八道。 说明他经常看沈彻老师的文章。同时也说明没有一篇能入他的法眼。这就奇怪了,既然不喜欢,却又经常看,然后写评论,生气,明天接着看,还是生气,哪天气个好歹,沈老师是否该负责任?所以劝你还是看看于丹大师的鸡汤文,那多受用?3天前&64JACK历经残酷洗礼,这片土地上的人们终于会醒悟,尊严和自由就是人的价值。奴才不是真正意义上的人,奴隶主同样不是人。这片土地需要新的制度。时间已经走到节点,但愿人们早日醒来。大时代变革的时候,醒悟的人越多。代价越少。否则,将有更多的头颅作为这个时代的祭品。 13天前&64顺哥本人跑过船,印象较深的一次去日本名古屋,找了一辆大巴载大家去逛街。一行十五人,每个人上车和下车的时候,司机都是礼貌性的向每个人点一下头!3天前&61.小小鸟有多少人能够做到,对总统和乞丐都保持一样的笑容。我就能做到。3天前&59半个行者金钱社会!缺乏信仰!3天前&43佳宁作者有些太偏激,可能也是受到打击太多3天前&49作者回复我受到打击有多么多呢?3天前&49家园作者是位清醒者,是有良知有担当好公义的人!3天前&48一匹马2?1?分析的很合理3天前&34作者回复你头脑清楚,眼光不错。3天前&47沧海一粟尊严这个词太神圣了,没有信仰没有底线的中国人承受不起啊!3天前&45Jack中国法学会的年度工作计划也是一个超级荒唐的证明!3天前&38风雪浪中国人的戾气越来越重,可以为一点小事杀人,而且手法越来越残忍,为什么?3天前&36堃伦士医生的价值是给他定位50万,你以为他不会收吗贪吗,中央最高层省部级高官钱少官小吗,你给他每年100万他不会贪吗,一样他们会照收不误。他们的人性已决定他们必须收与贪。关键还是中国的教育与监督体制问题,如果教育与体制还是老样子,这个国家的所有人只要有机会都会照贪不误!3天前&36永年不过,因为别人的一句话杀掉这个人其实是一件很两败俱伤的事情,是拿别人的错误惩罚自己……这个世界傻逼太多,跟傻逼较真就会忽略掉世界上本应该值得美好的事情……尊严是自我肯定的,不是他人可以否定的。3天前&36二姐分析的透彻3天前&35懂你那个老板该杀,我去吃过炸酱面,贵到不是主要的,主要是态度极其恶劣,脾气大得不得了,完全不能问为什么,我吃了一次就不去吃了,当时真的好想搞死他,恶有恶报。3天前&33理疗师好文章,一针见血3天前&32张立我赞同作者的观点。3天前&32天蝎菩提本无树,明境亦非台;&本来须尊重,何苦搭命来!3天前&32Jack严重同意“2017的主旋律:荒唐”的说法!可惜无法贴图跟帖!否则可以将我看到的一个荒唐场景也发上来接龙,配以说明文字,形成一个荒唐的大证据链集合!3天前&31??&?&错就错了吧?&?&?不同意作者觀點的人,似乎自覺自己是很有尊嚴的活著,其實是自欺欺人!3天前&28福慧宝地而今没钱没势中国中国人正生活在没有希望的环境里,有钱的靠钱出国,有权势的贪污出国,更有裸官用贪污受贿的钱把妻儿送出国,法律制定者又制定了一些媚外的规定……。国内电视台报纸又天天鼓吹虚假,全不想想给百姓留下的什么,所以失望,慢慢的就会变成绝望,生无可恋,那就快意恩仇吧!3天前&26心悦我们活在一个没有敬畏谦卑尊重感恩的没有底线的社会,好恐怖。礼仪廉耻正在消亡,人类终会为此付出代价,甚至万劫不复的境地!!!3天前&26amanda周只是因为杀人者和被杀者的性格问题,那至于上升到社会如何不好,如何不堪的。社会都是被作者这样的人舆论导向坏的。什么都能延伸到社会高度、人性高度,能够以点带面反应问题吗3天前&26VVP社会扭曲3天前&26舞王网友?说的很有道理丶那个呌的“远“的人,不配读沈老师的文章,你智力不够,去看于丹的鸡汤补补大脑如何?3天前&25今夜有雨当下中国的法律,保护的是权,钱,地痞,和一切社会垃圾人。3天前&24苹果一派为什么我会觉得老板是自己作死活该呢?是我心理有问题么?3天前&23风车火车站附近宰客欺客太多了,轻的言语威胁,重的打骂,只是这次碰上一个对生活绝望的人,丢了性命。前年温州服务生把火锅浇到一个女顾客头上,就是女的不尊重服务员引起的,所以,不要以为自己有钱,有地位,就不尊重底层人,要吃亏的。3天前&23Wjue变态对变态,必将干变态,变态成变态,反正是变态!哈哈哈,我对变态国无语!3天前&22心路历程:&绝不认命,挑战生活在中国人与人之间根本就没尊重、何谈尊严呢。每个中国人眼里只认钱、为了钱、亲情不再亲、爱情都是假、友情也不真。总而言之、中国现在的社会、什么都是假的、只有钱才是真的。3天前&21漂泊西南胡姓砍人者是个精神病患者,在这个国里也只有疯子才会用铁血手段去捍卫自己的尊严。悲哀……3天前&21心路历程:&绝不认命,挑战生活这样不尊重他人的人是该杀、我刚来美国的时候、由于人生地不熟、我的女同学带我去唐人街一家广东人的餐厅、我对我朋友说、不要吃太贵的、我现在没什么钱。餐厅的一个服务老头就接话说、没钱就不要吃了、、、、我当时也很气、、、、、我女朋友就劝我说算了、、、她请客。如何我是个男的、如果这样的事发生在中国、我看我不把那个服务员杀死、我也会砍他重伤去医院的。毕竟我是女的、刚来美国才一个月不到、那个老头就是欺负我一个人。这样的事情在中国太多太多了、有钱的就是大爷、没钱的就是孙子。那个老板就该为他的言行付出代价。3天前&21xhaudio2010为了极端利己的尊严或面子,可以剥夺别人的尊严甚至生命!这是长期仇恨,暴力教育的结果!君不见,被推崇的影视作品中,充斥满眼的都是对敌人残酷无情,杀人如麻,并因此获得极大的满足。只要认为你是敌人,就可以立马无情取其狗命!常此教育,造就了一批视生命如草芥,杀人如走路,视人如草芥的炮灰,有人需要他们。3天前&21撇捺人生&&&WM此文很好,赞!赞!赞!&& 此老板该死!!还有很多为富不仁者、贪腐弄权者、欺压迫害百姓者等……,这些不能算人的东西,都该死!支持此文作者,把丑恶爆在阳光下,让这些不可见光的东西早日全部死光光!3天前&21zhl远整天胡说八道!3天前&20刘飞制定规则的人不尊重规则,就会死于规则。3天前&18众木成林流氓横行,真的是因为我们消灭了贵族。3天前&18普杰(一平交流)一种是看破生死,对人生有足够深度的理解,一种是为自己的人生目的努力过,不管实现还是没有实现,都已经没有遗憾,还有一种是活着没有快乐,没有希望,感觉活着就是一种痛苦。——写得好!3天前&17Allen十分认同“暖心牛总代”的评论,也是我想表达的:当尊严随时被践踏得一文不值,剩下的就只有戾气了。你这个面馆老板有多牛逼?定价贵说是房租贵税收重不就行了?为何要打击你的顾客?你这样随口便来的人身攻击之前肯定也激怒了很多人,反倒为二十出头的小伙子惋惜,这么有骨气,争气一点将来何愁没有自己的一片天地?3天前&16?&【娄底家园】毛毛哥武昌\汉口火车站商铺专欺负外地口音,希望诚信经商。天上九头鸟,地上湖北佬。玩的是雕虫小技,耍小聪明。3天前&16依安贤车泽国土地上的历史都是被装扮包裹阉割和扭曲的历史,借鉴的全是这些玩意3天前&15梦向蔚蓝拼命为罪犯开脱,寻找各种合理化的理由,借此抨击社会,有意思不?如果被害人是你亲人,你会觉得他的尊严就得让别人去死,甚至人头落地、扔进垃圾桶?把杀人犯无罪化乃至英雄化,是病,得治!3天前&14园园生命只有一次钱可以再挣。互相尊重。3天前&13石头中国人活的有一点人格和尊严么?3天前&13陈宇峰毁了社会的GG的公权傲慢,起着引领作用。如不得妄议3天前&13锐不可挡文如其名3天前&12邬师以你的年龄能够把问题分析得这么透切!中国人就已经有希望了。必须给你赞3天前&12小小但愿每个有良知的人依然拥有理性3天前&11漫漫人生路中国发展的快,这就是代价。更可怕的是现在吃的东西,呼吸的空气,随着时间的沉淀,癌症患者急剧上升,花光积蓄,被病痛折磨致死!2017&&H7N9又会是怎样?3天前&11暴力小伙每件事都有两面性,我们管不了别人,却能让自己变得豁达,善良,且行且珍惜。谢谢老师文章3天前&11云飞扬看评论看得我胆战心惊,智商堪忧啊,怎么真么多人没看懂就喷。3天前&10大风歌只要一天没有百姓的尊严你当官的尊严也自然也不存在!看看全世界?比比发达国家这浅浅的道理你还真不明白?!3天前&10今夜有雨对当下社会,人性分柝的很透彻。3天前&10不大不小从某些留言的内容看,明明是个傻逼,还装作很道学的,是并不懂得尊严两个字的。他诘问作者“有意思吗”,当然,只代表他根本没有懂得作者什么意思。3天前&8舒情作者分析的很透彻,只能说都是钱惹的祸,还有一个问题必须要引起重视,为什么会发生在火车站,因为像一些车站,里面的消费确实很贵。3天前&8渔民&南律师改革开放以来,现实中缺少的就是公平和尊严,短期是无法改变了,原因太多,长期下去,危险。??3天前&8悟空在这个公婆各说各理的社会中,公婆都在坚持自己的观点,几乎没有讨论商量的余地,有的是由不同看法发展成矛盾激化,最后分庭抗礼,过不到一起,又分不开。这日子实在是冷!冷!冷!3天前&8山人闲斋尊严与正义这对难兄难弟生在拆哪实在是投错了胎!你若没了尊严便可苟且愚乐!你若没了正义便可闷声发财!为了那一点点珍稀的尊严而让正义蒙上了羞辱!3天前&8代胜,,,浏阳蒸菜你的意思,杀人者还有一丝道理??姚老板半夜会敲你家门滴!3天前&7嘟嘟小元子尊严,这个很神圣的词,有些事,比方说强奸自己的老婆,即使犯罪,也要去做一些男人做的事儿,无外乎犯罪与否!3天前&7amanda周我身边就发生过类似的事情,朋友因为上厕所时间太长,外面的人不耐烦,使劲敲门。因而发生口角,最后也是发生人命官司。这都是十几年前的事了,活着的依然坦然,觉得死的该死。也如这个故事的人都是性格使然。都认为在外面混的不能怂罢了。3天前&7球霸完全是胡说八道,可以说是父母教导的主因。3天前&6懂你老板是个坏人,该杀3天前&6Wuyun弱肉强食,祸从口出,杀人偿命,欠债还钱。天使或魔鬼,一切皆是最好安排。3天前&6张家界这已是17年我所知道的第二起割头事件!确实是荒唐3天前&5摆渡人你可以在幕后歧视我,但我也有尊严!3天前&5Carrie杀人者是精神病人,呵呵3天前&5岁月不要抱怨,努力成为强者,只要不做丧尽天良之事。3天前&5.F重点在于杀人者这么淡定从容,显然对生活失去了信心,求死又不甘的节奏3天前&4铁拳最新消息:杀人者是精神病,还负刑事责任吗?3天前&4AOA李建文+尊严是否重要,可见一斑,人人贱别人,最后害自己。我看你不爽,你看我讨厌,今天人们互相厌恶已经觉得人不如狗了,人性渐渐褪去,除了躯壳,连禽兽都不如,实在可悲啊!3天前&4节能大兵(钮怀明)LED照明这两人800年前有仇,今日得报,此事己了,3天前&4迂回的温暖老板不懂得尊重别人'杀人者心胸狭隘3天前&4谭庆荣杀人有理,中国特色。天经地义,谁人能敌。流点血有什么,和日本帝国主义那么大的仇恨都要和解。宝鸡法官的官论,除了包庇罪犯天经地义,强迫受害人流血流泪加活该以外,还有什么?和中国草民说尊严,多事。3天前&4small&tiger真是吓鸡巴乱扯,没有任何关系的偶然事件被你硬扯到一起,吃饱撑的吧3天前&4风往北吹被杀的面馆老板真的强奸了杀人者的老婆吗?如果是,分析成立,如果不是,你就是胡扯。3天前&3王安学觉得我也有文中所说的尊严伤害了,无由来的厌气深重3天前&3青青一碗面至于杀人而且砍脑袋,凶手精神有大问題,不可思义。3天前&3信仰猪一样的思维&&只能接受猪一样的命运!3天前&3陈大善人杀人的人表现出的对生命的漠视/是教育的失败3天前&3小迪无语3天前&3美尚佳人文壁纸&&壁画&&&朱小川正义的法门在于尊重他人的人身权利,生命无价...3天前&2英俊郎才致ZhⅠ远:连真面目都不敢视人,却敢说别人胡说八道,真不要脸。3天前&2刘恒呵呵了,行凶的是个农村的精神病残疾人!3天前&2死心乐我发现你什么都没说,成。3天前&2大湖这个社会我们不能只说它不好,不比总是哀叹:世风日下,人心不古,毕竟它在发展,科技越來越先进,物质赳來越丰富,但是鱼与熊掌不可兼得,我们需要反思的是,什么才是完整的进步?我们的价值取向在哪里?继而联系到教育,舆论导向,法制建设等等,建设一个健全的社会体制,不能眼睛只盯着经济,不能过度地强调速度,而应着眼國情,统筹兼顾,不是早就強调两手抓吗?中华民族的传统美德丟得差不多,文明古國在西方现代文明面前常显得相形见拙,我们的人民在文化建设,文明程度,方面还任重道遠,两百年怎么样?反正我看不到了。3天前&2明日阴晴未定amanda周,你说的为上厕所引发的人命案是发生在武汉的吗?3天前&2?迫在眉睫??无言以对3天前&1王龙有些分析正确,有些非也,价值观和人生观不是一个尊严能左右的,3天前&上档键2中快输。分析下美帝吧3天前以上留言由公众号筛选后显示了解留言功能详情
TA的推荐TA的最新馆藏[转]&[转]&
喜欢该文的人也喜欢6273被浏览364699分享邀请回答2K169 条评论分享收藏感谢收起2.9K180 条评论分享收藏感谢收起前端周刊前端周刊在前端领域跟上时代的脚步,广度和深度不断精进关注专栏更多最新文章{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&title&:&前端周刊第56期:应接不暇的技术大会&,&author&:&wangshijun&,&content&:&\u003Cblockquote\u003E\u003Cp\u003EWannaCry 病毒的事情我们就不提,本周各科技公司、技术社区的大会真是让人应接不暇,\u003Ca href=\&https:\u002F\\u002Fio\u002Fschedule\u002F?section=may-17\& data-editable=\&true\& data-title=\&Google IO\&\u003EGoogle IO\u003C\u002Fa\u003E、\u003Ca href=\&https:\u002F\\u002F\& data-editable=\&true\& data-title=\&MicroSoft Build\&\u003EMicroSoft Build\u003C\u002Fa\u003E、\u003Ca href=\&https:\u002F\u002Fwww.react-europe.org\u002F#day-2017-May-17\& data-editable=\&true\& data-title=\&React Europe\&\u003EReact Europe\u003C\u002Fa\u003E、\u003Ca href=\&https:\u002F\u002Fjuejin.im\u002Fpost\u002F591fa2d0a0bb9f005f3ccd1b\& data-editable=\&true\& data-title=\&Vue Conf\&\u003EVue Conf\u003C\u002Fa\u003E,每个里面都有不少前端工具、框架、演进方向的干货,好学的你怎么错过?下面是本周精选内容,请享用。\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Ch2\u003E技术动态\u003C\u002Fh2\u003E\u003Ca href=\&https:\u002F\\u002Fplaylist?list=PLOU2XLYxmsIKC8eODk_RNCWv3fBcLvMMy\& data-editable=\&true\& data-title=\&Google I\u002FO 2017 视频列表\&\u003EGoogle I\u002FO 2017 视频列表\u003C\u002Fa\u003E\u003Cp\u003EGoogle I\u002FO 2017 可以说是整个互联网的盛宴,关于它的报道已经很多了,这里搜罗了全部的视频,里面关于前端的内容比较值得关注,比如 Polymer、Dev Tools、PWA 等,工程师不光要埋头做事,还要抬头看路,大的科技公司则走在我们前面。\u003C\u002Fp\u003E\u003Ca href=\&https:\u002F\u002Fzeit.co\u002Fblog\u002Fnext3-preview\& data-editable=\&true\& data-title=\&Next.js 3.0 预览版发布\&\u003ENext.js 3.0 预览版发布\u003C\u002Fa\u003E\u003Cp\u003ENext.js 是基于 React 的支持服务端渲染的开发框架,本周发布 3.0 预览版,支持动态 import。服务端渲染虽然提了很长时间,但是到目前为止还处在看上去很美、用起来性能达不到要求的阶段,不过社区的努力会带来好的结果。\u003C\u002Fp\u003E\u003Ca href=\&https:\u002F\u002Fjuejin.im\u002Fpost\u002F591fa2d0a0bb9f005f3ccd1b\& data-editable=\&true\& data-title=\&Vue Conf 2017 参会笔记\&\u003EVue Conf 2017 参会笔记\u003C\u002Fa\u003E\u003Cp\u003E掘金编辑产出的参会笔记,全球首届 Vue.js 开发者大会,尤雨溪介绍了 Vue.js 的演进之路和今年的版本迭代计划,狼叔对前后端分离的大前端技术架构给出了良方,张耀春则分享了非常多 Webpack 用在实际项目中的技巧,掘金的创始人在现场做了他前端生涯的最后一次技术分享,可惜没有直播。\u003C\u002Fp\u003E\u003Ca href=\&https:\u002F\u002Fwww.react-europe.org\u002F#day-2017-May-17\& data-editable=\&true\& data-title=\&React Europe 2017 大会议程\&\u003EReact Europe 2017 大会议程\u003C\u002Fa\u003E\u003Cp\u003EReact Europe 2017 大会也是本周举行,程序员界的漫画天才 Link Clark 又做了逆天的分享,她用漫画图解 Redux、GraphQL、React Fiber 让我在迅速理解这些概念的同学也为她的才华做震撼,有点跑题了,React Europe 中除了她的演讲,还有很多值得关注学习的内容,怎么挑出高质量的?相信你有自己的办法。\u003C\u002Fp\u003E\u003Ch2\u003E文章教程\u003C\u002Fh2\u003E\u003Ca href=\&http:\\u002F\& data-editable=\&true\& data-title=\&CSS Grid 学习指南\&\u003ECSS Grid 学习指南\u003C\u002Fa\u003E\u003Cp\u003ECSS Grid 是比 Flexbox 更强大的布局特性,如果你还徘徊在门外,何不打开这篇教程研究下,作者对内容的组织非常的用心,你应该半小时就能学完。\u003C\u002Fp\u003E\u003Ca href=\&https:\\u002F@adiramsalem\u002F8-npm-tricks-you-can-use-to-impress-your-colleagues-dbdae1ef5f9e\& data-editable=\&true\& data-title=\&8 个能让你惊艳同事的 npm 技巧\&\u003E8 个能让你惊艳同事的 npm 技巧\u003C\u002Fa\u003E\u003Cp\u003E工程师不光要技术扎实,对工具也要练习、练习、再练习,这里是几个 npm 的小技巧,跟你的日常工作关系紧密,但是你可能还不知道,在同事面前表演下,估计他们会被惊艳到。\u003C\u002Fp\u003E\u003Ca href=\&https:\u002F\u002Fmp.\u002Fs?__biz=MzA3NDM0ODQwMw==&mid=&idx=1&sn=ebbd4ade70&chksm=bbbaef4d921fe65fe82cfba9cfe&mpshare=1&scene=24&srcid=0512xD7mWOH0riOVoTkmFf72&key=fac364d3ab4\& data-editable=\&true\& data-title=\&程序人生:服务性能 101\&\u003E程序人生:服务性能 101\u003C\u002Fa\u003E\u003Cp\u003E来自我非常敬佩的程序人生的微信公号,虽然前端对性能的关注不需要到服务级别,但是培养一种思维方式还是非常有用的。比如什么时候该严肃地考虑性能问题?如何衡量和优化服务的性能?有兴趣的同学可以阅读原文看他的分享 Slide。\u003C\u002Fp\u003E\u003Ca href=\&http:\u002F\\u002Fblog\u002F\u002Ffish_shell.html\& data-editable=\&true\& data-title=\&阮一峰:Fish shell 入门教程\&\u003E阮一峰:Fish shell 入门教程\u003C\u002Fa\u003E\u003Cp\u003E早些时候有推过一篇文章说:为什么优秀的程序员都爱命令行?Phodal 在他的长文\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&《在工作头三年里如何快速成长》\&\u003E《在工作头三年里如何快速成长》\u003C\u002Fa\u003E中提到的要尽早开始拥抱命令行、纯键盘操作,慢慢你会发现过多使用鼠标会使你的效率下降,这点我深有体会,也非常赞同,但是你的命令行工具箱也是需要不断打磨的,如果你还没开始行动,那这篇文章可以入门。\u003C\u002Fp\u003E\u003Ch2\u003E开发工具\u003C\u002Fh2\u003E\u003Ca href=\&https:\u002F\\u002F\& data-editable=\&true\& data-title=\&静态网站生成(SSG)工具大搜罗\&\u003E静态网站生成(SSG)工具大搜罗\u003C\u002Fa\u003E\u003Cp\u003E国外大行其道的一键部署服务 Surge、Now 是在静态网站生成器大背景下的商业产品,你也想部署纯净太的网站?需要先挑选一个 SSG 工具,然后挑个服务商,这个小站列出几乎所有的 SSG 工具。\u003C\u002Fp\u003E\u003Ca href=\&https:\\u002Fliriliri\u002Feruda\& data-editable=\&true\& data-title=\&Eruda:把开发者工具带到移动端\&\u003EEruda:把开发者工具带到移动端\u003C\u002Fa\u003E\u003Cp\u003E你有没有吐槽过为啥移动端浏览器没有类似与 Chrome 开发者工具这样的调试利器?有人已经做了尝试和努力,Eruda 可以在移动端浏览器中给你类似的调试功能,官方 README 尾部的那段接入代码要仔细看。\u003C\u002Fp\u003E\u003Ca href=\&https:\u002F\u002Fgithub.atom.io\u002F\& data-editable=\&true\& data-title=\&Atom 新版集成 GitHub 功能\&\u003EAtom 新版集成 GitHub 功能\u003C\u002Fa\u003E\u003Cp\u003EAtom 的最新版中集成了常用的 Git 功能你可以方便的在 GUI 上操作分支、查看日志、做代码的提交和拉取。已经抛弃 Atom 的同学可以绕路了。\u003C\u002Fp\u003E\u003Ca href=\&https:\u002F\\u002Fen\u002Fcompare\& data-editable=\&true\& data-title=\&测量并对比你和竞品的网站性能\&\u003E测量并对比你和竞品的网站性能\u003C\u002Fa\u003E\u003Cp\u003E在网站性能测试工具里面 WebPageTest 是当之无愧的榜首,但是用它来对比两个网站(比如说你相对比自己和竞品的性能)操作略麻烦,这个工具能让你一键完成对比。\u003C\u002Fp\u003E\u003Ch2\u003E视频教程\u003C\u002Fh2\u003E\u003Ca href=\&https:\u002F\\u002Fwatch?v=GLdH9SMG97o\& data-editable=\&true\& data-title=\&让代码检查不再痛苦\&\u003E让代码检查不再痛苦\u003C\u002Fa\u003E\u003Cp\u003E为 Andrey Okonetchnikov 在 React Amsterdam 上做的分享,列出了现有的代码风格检查(Code Linting)方案的集成痛点,并给出了非常不错的解决方案,我们团队已经用上了,如果你还不知道啥是 Code Linting,得抓紧学了。\u003C\u002Fp\u003E\u003Ca href=\&https:\u002F\u002Fegghead.io\u002Flessons\u002Fjavascript-introduction-to-abstract-syntax-trees\& data-editable=\&true\& data-title=\&抽象语法树(AST)入门\&\u003E抽象语法树(AST)入门\u003C\u002Fa\u003E\u003Cp\u003E抽象语法树是啥?有什么用?如果你好奇过各种预编译工具(比如 babel、postcss、eslint 等)是怎么工作的,这个教程能让你知其然还支持所以然。\u003C\u002Fp\u003E\u003Ch2\u003E精彩问答\u003C\u002Fh2\u003E\u003Ca href=\&https:\u002F\\u002Fen-us\u002FHT204948\& data-editable=\&true\& data-title=\&Mac 中如何让两个应用并排全屏?\&\u003EMac 中如何让两个应用并排全屏?\u003C\u002Fa\u003E\u003Cp\u003E我喜欢在超大的显示器上同时开着 Vim 和 iTerm,一个用来写代码,一个用来调试或者操作 Git,那么如何让两个应用并排全屏好使我沉浸在编码中呢?需要用到 Mac 系统的一个特性,非常简单,1 分钟就学会。\u003C\u002Fp\u003E\u003Ca href=\&http:\u002F\u002Fcost-of-\u002F\& data-editable=\&true\& data-title=\&如何知道 npm 模块的资源消耗?\&\u003E如何知道 npm 模块的资源消耗?\u003C\u002Fa\u003E\u003Cp\u003E前端网上流传一张图对比了各种语言包管理机制的深度,npm 是被黑的最狠的,有国外的朋友在 Twitter 上发文说清理 node_modules 让他的 Mac 增加了 15G 磁盘空间,真有这么严重?你用的最多的包到底会占用多少空间?安装时需要下载多少东西?这个小工具可以帮你计算。\u003C\u002Fp\u003E\u003Ch2\u003EOne More Thing\u003C\u002Fh2\u003E\u003Cp\u003E本文作者王仕军,商业转载请联系作者获得授权,非商业转载请注明出处。如果你觉得本文对你有帮助,请点赞!如果对文中的内容有任何疑问,欢迎留言讨论。想知道我接下来会写些什么?欢迎订阅我的\u003Ca href=\&https:\u002F\u002Fjuejin.im\u002Fuser\u002F57a7f634d342dd\& data-editable=\&true\& data-title=\&掘金专栏\&\u003E掘金专栏\u003C\u002Fa\u003E或\u003Ca href=\&https:\u002F\\u002Ffeweekly\& data-editable=\&true\& data-title=\&知乎专栏\&\u003E知乎专栏\u003C\u002Fa\u003E:《前端周刊:让你在前端领域跟上时代的脚步》。\u003C\u002Fp\u003E&,&updated&:new Date(&T13:25:10.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:8,&likeCount&:59,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T21:25:10+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\\u002Fv2-c4d93e8db_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:8,&likesCount&:59},&&:{&title&:&用 husky 和 lint-staged 构建超溜的代码检查工作流&,&author&:&wangshijun&,&content&:&\u003Cblockquote\u003E\u003Cp\u003E具备基本工程素养的同学都会注重编码规范,而代码风格检查(Code Linting,简称 Lint)是保障代码规范一致性的重要手段,你的工作流中有 Lint 环节么?有的话你用的爽么?你在团队中推广过 Lint,但是大家都不买账?究竟是为啥?\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Ch2\u003ELint 是什么?\u003C\u002Fh2\u003E\u003Cp\u003E探讨怎么做之前,我们很有必要给 Lint 来个清晰、准确的定义,\u003Ca href=\&https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLint_(software)\& data-editable=\&true\& data-title=\&wikipedia 的定义\&\u003Ewikipedia 的定义\u003C\u002Fa\u003E如下:\u003C\u002Fp\u003E\u003Cblockquote\u003E\u003Cp\u003EIn computer programming, lint is a Unix utility that flags some suspicious and non-portable constructs (likely to be bugs) in C
generically, lint or a linter is any tool that flags suspicious usage in software written in any computer language. The term lint-like behavior is sometimes applied to the process of flagging suspicious language usage. Lint-like tools generally perform static analysis of source code.\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Cp\u003E简单来说,Lint 就是对代码做静态分析,并试图找出潜在问题的工具,实战中我们也用 Lint 来指使用工具的过程。\u003C\u002Fp\u003E\u003Ch2\u003E为什么要 Lint?\u003C\u002Fh2\u003E\u003Cp\u003E使用 Lint 会有什么好处呢?在我看来至少具有如下 3 点:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E更少的 Bug,剑桥大学的\u003Ca href=\&http:\u002F\\u002Freleases\u002F\u002Fprweb.htm\& data-editable=\&true\& data-title=\&研究\&\u003E研究\u003C\u002Fa\u003E发现,全世界每年因为软 Bug 造成的经济损失约 3120 亿美金;\u003C\u002Fli\u003E\u003Cli\u003E更高的开发效率,工程师平均会花掉 50% 的工作时间定位和解决各种 Bug,其中不乏那些显而易见的低级错误,而 Lint 很容易发现低级的、显而易见的错误;\u003C\u002Fli\u003E\u003Cli\u003E更高的可读性,代码可读性的首要因子是“表面文章”,表面上看起来乱糟糟的代码通常更难读懂;\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E可以毫不客气的说,如果你不做 Lint,就是在浪费自己的时间,浪费公司的资源。既然做 Lint 的预期效果很好?该怎么做呢?\u003C\u002Fp\u003E\u003Ch2\u003E提交后 Lint:反馈链条太长?\u003C\u002Fh2\u003E\u003Cp\u003E说到怎么做,多数人会自然而然的想到各种 Lint 工具,目前社区中针对各种语言都开发了 Lint 工具,前端能用到的就有大把:\u003Ca href=\&http:\u002F\u002Feslint.org\u002F\& data-editable=\&true\& data-title=\&ESLint\&\u003EESLint\u003C\u002Fa\u003E、\u003Ca href=\&https:\\u002Findex.html\& data-editable=\&true\& data-title=\&Standard\&\u003EStandard\u003C\u002Fa\u003E、\u003Ca href=\&https:\\u002Fbrigade\u002Fscss-lint\& data-editable=\&true\& data-title=\&SCSSLint\&\u003ESCSSLint\u003C\u002Fa\u003E、\u003Ca href=\&https:\\u002Fzaach\u002Fjsonlint\& data-editable=\&true\& data-title=\&JSONLint\&\u003EJSONLint\u003C\u002Fa\u003E、\u003Ca href=\&https:\\u002Fyaniswang\u002FHTMLHint\& data-editable=\&true\& data-title=\&HTMLHint\&\u003EHTMLHint\u003C\u002Fa\u003E 等。GitHub 官方出品的 \u003Ca href=\&https:\\u002Fshowcases\u002Fclean-code-linters\& data-editable=\&true\& data-title=\&Lint 工具列表\&\u003ELint 工具列表\u003C\u002Fa\u003E 也是个非常不错的参考。\u003C\u002Fp\u003E\u003Cp\u003E很多同学选择在持续集成阶段(后文用 CI 代称)做 Lint,比如使用远程的 Git Hooks 来触发。但是从实际的经历来看,这种做法的反馈链条通常如下:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E代码提交 --& 发现问题(远程) --& 修复问题 --& 重新提交 --& 通过检查(远程)\u003C\u002Fcode\u003E\u003Cp\u003E整个过程可能会浪费掉你不少时间,毕竟 CI 过程通常不仅是在做 Lint,如果你是那种不知道自己时间每天都去哪儿了的工程师,可以反思下自己或者团队的工作流是否是这样。并且,请相信我,你不是少数人。\u003C\u002Fp\u003E\u003Cp\u003E你有没有这样的经历:吭哧吭哧写了几天代码,各种验收都通过了,最后被 CI 拒绝,竟是因为你的代码中少加了一个逗号,这时候心情简直崩溃到无法形容:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cimg src=\&v2-48faa9dcd12.gif\& data-rawwidth=\&500\& data-rawheight=\&357\&\u003E\u003Cbr\u003E\u003Cp\u003E从 GitHub 上各种修复 Lint 的提交数量不难发现工程师在修复 Lint 问题上浪费的时间,比如搜索 \&fix lint\&,多达 45W 次提交:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cimg src=\&v2-caf51cb12d310f700d7663.png\& data-rawwidth=\&934\& data-rawheight=\&424\&\u003E\u003Cbr\u003E\u003Cp\u003E再比如搜索 “fix indent”,多达 226W 次提交,是不是很触目惊心?\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cimg src=\&v2-505c8e7d52ab0c70be1a7.png\& data-rawwidth=\&942\& data-rawheight=\&428\&\u003E\u003Cbr\u003E\u003Cp\u003E只在 CI 流程做 Lint 的缺点也是显而易见的:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003ELint 在整个开发工作流中的反馈链条太长,浪费时间、注意力和资源,最致命的;\u003C\u002Fli\u003E\u003Cli\u003ECI 流程搭建成本比较高,即使有各种 CI 服务,步骤也还是比较繁琐;\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E我们该怎么改进?\u003C\u002Fp\u003E\u003Ch2\u003E提交前 Lint:错误信息不相关?\u003C\u002Fh2\u003E\u003Cp\u003E为了缩短 Lint 的反馈链条,把 Lint 挪到本地是最有效的办法。常见做法是使用 \u003Ca href=\&https:\\u002Ftypicode\u002Fhusky\& data-editable=\&true\& data-title=\&husky\&\u003Ehusky\u003C\u002Fa\u003E 或者 \u003Ca href=\&https:\\u002Fobserving\u002Fpre-commit\& data-editable=\&true\& data-title=\&pre-commit\&\u003Epre-commit\u003C\u002Fa\u003E 在本地提交之前做 Lint。\u003C\u002Fp\u003E\u003Cp\u003E使用 husky 的具体做法如下:\u003C\u002Fp\u003E\u003Cp\u003E首先,安装依赖:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Enpm install -D husky\nyarn add --dev husky\u003C\u002Fcode\u003E\u003Cp\u003E然后修改 package.json,增加配置:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E{\n
\&scripts\&: {\n
\&precommit\&: \&eslint src\u002F**\u002F*.js\&\n
}\n}\u003C\u002Fcode\u003E\u003Cp\u003E最后尝试 Git 提交,你就会很快收到反馈:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Egit commit -m \&Keep calm and commit\&\u003C\u002Fcode\u003E\u003Cp\u003E但是在遗留代码仓库上工作的同学很快会遇到新的问题,开启 Lint 初期,你可能会面临成千上万的 Lint Error 需要修复。部分同学对下面这个图可能并不陌生:只改了文件 A,但是文件 B、C、D 中也有大量错误。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cimg src=\&v2-e74f8cf1e75ea00c38012ae.png\& data-rawwidth=\&1308\& data-rawheight=\&472\&\u003E\u003Cbr\u003E\u003Cp\u003E把整个仓库都格式化不失为一种选择,但是实际上需要很大的勇气。多数人在项目中运用新工具都希望是渐进式的,而不是推到重来式的,因为相比而言,业务系统稳定是更重要的事情。简单的把 Lint 挪到本地,反馈链条是缩短了,但是面对每次改动,工具还是给出了太多不相关的信息,这无疑与小步快跑的互联网节奏是相违背的。\u003C\u002Fp\u003E\u003Cp\u003E该怎么破?\u003C\u002Fp\u003E\u003Ch2\u003E只 Lint 改动的:6C\u002Fh2\u003E\u003Cp\u003E如果把 Lint 挪到本地,并且每次提交只检查本次提交所修改的文件,上面的痛点就都解决了。Feedly 的工程师 \u003Ca href=\&https:\u002F\\u002F~okonet\& data-editable=\&true\& data-title=\&Andrey Okonetchnikov\&\u003EAndrey Okonetchnikov\u003C\u002Fa\u003E 开发的 \u003Ca href=\&https:\\u002Fokonet\u002Flint-staged\& data-editable=\&true\& data-title=\&lint-staged\&\u003Elint-staged\u003C\u002Fa\u003E 就是基于这个想法,其中 staged 是 Git 里面的概念,指待提交区,使用 git commit -a,或者先 git add 然后 git commit 的时候,你的修改代码都会经过待提交区。\u003C\u002Fp\u003E\u003Cp\u003Elint-staged 用法如下:\u003C\u002Fp\u003E\u003Cp\u003E首先,安装依赖:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Enpm install -D lint-staged\nyarn add --dev lint-staged\u003C\u002Fcode\u003E\u003Cp\u003E然后,修改 package.json 配置:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E{\n
\&scripts\&: {\n
\&precommit\&: \&lint-staged\&\n
\&lint-staged\&: {\n
\&src\u002F**\u002F*.js\&: \&eslint\&\n
}\n}\u003C\u002Fcode\u003E\u003Cp\u003E最后,尝试提交的效果:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cimg src=\&v2-ab77f2e2f76f0a2b47fdb798b61b4671.gif\& data-rawwidth=\&828\& data-rawheight=\&568\&\u003E\u003Cbr\u003E\u003Cp\u003E实际上,lint-staged 给了你提交前代码操作的更大自由度,比如使用下面的配置,自动修复错误:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E{\n
\&scripts\&: {\n
\&precommit\&: \&lint-staged\&\n
\&lint-staged\&: {\n
\&src\u002F**\u002F*.js\&: [\&eslint --fix\&, \&git add\&]\n
}\n}\u003C\u002Fcode\u003E\u003Cp\u003E或者使用下面的配置,自动格式化代码(谨慎使用):\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E{\n
\&scripts\&: {\n
\&precommit\&: \&lint-staged\&\n
\&lint-staged\&: {\n
\&src\u002F**\u002F*.js\&: [\&prettier --write\&, \&git add\&]\n
}\n}\u003C\u002Fcode\u003E\u003Cp\u003E此外,lint-staged 和 prettier \u003Ca href=\&https:\\u002Ffacebookincubator\u002Fcreate-react-app\u002Fpull\u002F1759\& data-editable=\&true\& data-title=\&已经集成到 create-react-app 中了\&\u003E已经集成到 create-react-app 中了\u003C\u002Fa\u003E。你是不是也应该好好打磨下自己的 Lint 工作流了?\u003C\u002Fp\u003E\u003Ch2\u003E总结\u003C\u002Fh2\u003E\u003Cp\u003E有人说前端攻城狮是世界上最奇怪的动物,提交代码时用 prettier 把代码排版的很美观,但部署上线时又使用 uglify 把代码压缩的连亲妈都不认了,事实是,如果我们写出来的代码本来就很丑陋,就根本不需要用 uglify。希望读到这里的你能把 Lint 工作流打磨到极致,把更多时间专注在解决真正的问题上,成为真正高效的工程师。\u003C\u002Fp\u003E\u003Ch2\u003EOne More Thing\u003C\u002Fh2\u003E\u003Cp\u003E本文作者王仕军,商业转载请联系作者获得授权,非商业转载请注明出处。如果你觉得本文对你有帮助,请点赞!如果对文中的内容有任何疑问,欢迎留言讨论。想知道我接下来会写些什么?欢迎订阅我的\u003Ca href=\&https:\u002F\u002Fjuejin.im\u002Fuser\u002F57a7f634d342dd\& data-editable=\&true\& data-title=\&掘金专栏\&\u003E掘金专栏\u003C\u002Fa\u003E或\u003Ca href=\&https:\u002F\\u002Ffeweekly\& data-editable=\&true\& data-title=\&知乎专栏\&\u003E知乎专栏\u003C\u002Fa\u003E:《前端周刊:让你在前端领域跟上时代的脚步》。\u003C\u002Fp\u003E&,&updated&:new Date(&T23:54:33.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:4,&likeCount&:40,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T07:54:33+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\\u002Fv2-dba7e7f875b69c46f00724_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:4,&likesCount&:40},&&:{&title&:&前端周刊第57期:《战争与和平版》的 CSS-IN-JS 黑历史&,&author&:&wangshijun&,&content&:&\u003Cblockquote\u003E\u003Cp\u003E不知道大家是否注意到,社区中出现的 CSS 尤其是 CSS-IN-JS 风格的轮子轮子越来越多,这个事情在前端社区引发的很多的讨论,或者说是争吵,比如有人说 CSS is Broken,就有人对 CSS is Fine。Cristiano Rastelli 以《战争与和平》为蓝本\u003Ca href=\&http:\\u002FRS2n5zl\& data-editable=\&true\& data-title=\&回顾了历史\&\u003E回顾了历史\u003C\u002Fa\u003E,也给出了非常赞的观察视角,程序员应该务实,而不是教条,更重要的是保持好奇心。\u003C\u002Fp\u003E\u003Cp\u003E另外第 56 期提到的各种技术大会,已经陆续有人整理适合 WEB 的视频列表,本期收录了我看过的比较精彩的两个,如果你有时间看更多,请移步:\u003Ca href=\&http:\\u002FRS2nt5p\& data-editable=\&true\& data-title=\&Google I\u002FO\&\u003EGoogle I\u002FO\u003C\u002Fa\u003E、\u003Ca href=\&http:\\u002FRa1A2h7\& data-editable=\&true\& data-title=\&JS Conf Europe\&\u003EJS Conf Europe\u003C\u002Fa\u003E、\u003Ca href=\&https:\u002F\\u002F\& data-editable=\&true\& data-title=\&Vue Conf\&\u003EVue Conf\u003C\u002Fa\u003E。\u003C\u002Fp\u003E\u003Cp\u003E共 2121 字,读完需 4 分钟。以下是本周精选内容,请享用。\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Ch3\u003E技术动态\u003C\u002Fh3\u003E\u003Ca href=\&http:\u002F\u002Fblog.npmjs.org\u002Fpost\u002F\u002Fv500\& data-editable=\&true\& data-title=\&NPM 5.0 发布:更像 Yarn\&\u003ENPM 5.0 发布:更像 Yarn\u003C\u002Fa\u003E\u003Cp\u003E官方的 NPM 5.0 发布日志,你需要知道的版本更新要点:更快,有 Benchmark 表明它比 Yarn 还快;能够自动保持 package.json 里面的缩进;--save 变为默认参数;支持离线模式;支持依赖锁定,直接 npm install -g npm@5 可以体验。\u003C\u002Fp\u003E\u003Ca href=\&https:\\u002Fstyled-components\u002Fannouncing-v2-f01ef3766ac2\& data-editable=\&true\& data-title=\&styled-components 2.0 发布\&\u003Estyled-components 2.0 发布\u003C\u002Fa\u003E\u003Cp\u003E对,就是以抹指甲油图片为图标的那个 CSS-IN-JS 库,我第一次使用就爱上她了,本周发布了 2.0 版本,可以说是真正意义上的大版本,代码体积更小、添加 SSR 支持、发布全新的文档站点、新增多个 helper 函数帮助你实现代码复用、新增 Babel 插件来优化生产环境的代码,最重要的点是你可以直接升级到版本 2.0 而不用做任何更改。\u003C\u002Fp\u003E\u003Ca href=\&https:\\u002Fchronicles\u002Fautoprefixer-7-browserslist-2-released?utm_source=CSS-Weekly&utm_campaign=Issue-266&utm_medium=email\& data-editable=\&true\& data-title=\&Autoprefixer 7.0 发布\&\u003EAutoprefixer 7.0 发布\u003C\u002Fa\u003E\u003Cp\u003E可能部分同学对 Autoprefixer 比较陌生,是能够自动帮你提高 CSS 的浏览器兼容性CSS 预处理工具,各种构建工具都有对应的插件。初版于 4 年前发布的,作者重写整个仓库(从 Coffee 到 Babel)之后,最近发布了 7.0 版本,新版最大变化是升级 BrowserList 到 2.0。\u003C\u002Fp\u003E\u003Ch3\u003E文章教程\u003C\u002Fh3\u003E\u003Ca href=\&https:\\u002Fblog\u002F\u002F22\u002Fhttps-on-stack-overflow\u002F\& data-editable=\&true\& data-title=\&Stack Overflow 全站切换 HTTPS 之路\&\u003EStack Overflow 全站切换 HTTPS 之路\u003C\u002Fa\u003E\u003Cp\u003E本周宣布帮助 100W 开发者成功退出 Vim 的程序员社交网站 Stack Overflow 最近宣布了另外一件大事:花了两年时间终于把全站切换到 HTTPS,对于部分正在升级到 HTTPS 或者想升级的同学可以看看,有个心理准备。内容比较全面,从基础设施的迁移、到应用架构、代码逻辑的迁移,都有经验和教训。\u003C\u002Fp\u003E\u003Ca href=\&https:\\u002Fblog\u002Fthe-many-faces-of-functions-in-javascript\& data-editable=\&true\& data-title=\&JS 函数的前世今生\&\u003EJS 函数的前世今生\u003C\u002Fa\u003E\u003Cp\u003E函数是 JS 中的一等公民,语言在进化,其中函数的编写、使用方式也在不断进化,这篇文章做了非常不做的梳理和讲解,从早期的函数表达式、函数声明,函数构造,匿名函数,到后来的箭头函数、generator、async 函数,以及不同语法组合的函数,值得看看。\u003C\u002Fp\u003E\u003Ca href=\&https:\u002F\\u002Fenforcing-css-syntax-style\u002F?utm_source=CSS-Weekly&utm_campaign=Issue-266&utm_medium=email\& data-editable=\&true\& data-title=\&保障 CSS 编码风格的工具链\&\u003E保障 CSS 编码风格的工具链\u003C\u002Fa\u003E\u003Cp\u003E清晰简洁的代码看起来养眼,读起来也更易懂,在 JS 领域,有很多工具来保障编码风格,比如 ESLint、Standard,也有工具帮你格式化代码,比如 Prettier、JS-Beautify。社区还比较年轻的 CSS 领域呢?早期的 csslint 太难用,但是最近一两年出现了几个比较好的工具,比如代码检查的 stylelint,代码格式化的 stylefmt。\u003C\u002Fp\u003E\u003Ca href=\&http:\u002F\u002Fbradfrost.github.io\u002Fstyle-guide-guide\u002F\& data-editable=\&true\& data-title=\&Style Guide Guide:编写样式规范的指南\&\u003EStyle Guide Guide:编写样式规范的指南\u003C\u002Fa\u003E\u003Cp\u003E比较重视代码重用和用户体验一致性的前端团队在处理复杂的业务都会着手积累自己的样式规范,但实际操作过程中,可能部分样式规范后来沦为纸上的规范,该如何维护真正有价值的样式规范呢?比如样式规范该怎么组织?文档该怎么写?向 Brad Frost 学习。\u003C\u002Fp\u003E\u003Ch3\u003E开发工具\u003C\u002Fh3\u003E\u003Ca href=\&https:\u002F\u002Fwww.sitespeed.io\u002F\& data-editable=\&true\& data-title=\&sitespeed.io:给你的应用来个全面的性能诊断?\&\u003Esitespeed.io:给你的应用来个全面的性能诊断?\u003C\u002Fa\u003E\u003Cp\u003Esitespeed.io 完全基于开源工具构建,能够一键对你的 WEB 应用做全面的性能诊断,内涵 Browsertime、ChromeHar、PageXRay 等工具,支持把结构输出到 Grafana,安装方式也比较灵活,近期在关注性能的同学可以看看。\u003C\u002Fp\u003E\u003Ch3\u003E代码框架\u003C\u002Fh3\u003E\u003Ca href=\&https:\\u002Fshoutem\u002Fanimation\& data-editable=\&true\& data-title=\&Shoutem 开源的 React Native 动画组件\&\u003EShoutem 开源的 React Native 动画组件\u003C\u002Fa\u003E\u003Cp\u003EShoutem 已经被认为是移动领域的 WordPress,可以快速帮用户构建 APP,其在 React Native 上做的事情还是不少,这是他们开源 React Native 的动画组件,支持常见的位置、大小、透明度、坐标轴,动画作者还在 Medium 上发了一篇不错的文章:《Declare Peace with React Native Animations》,感兴趣的可以去搜来读读。\u003C\u002Fp\u003E\u003Ca href=\&https:\\u002Frobertklep\u002Ftop-level-await\& data-editable=\&true\& data-title=\&在 Node.js 顶级作用域中直接使用 await\&\u003E在 Node.js 顶级作用域中直接使用 await\u003C\u002Fa\u003E\u003Cp\u003E或许你也曾疑惑,为啥 Node.js 里面的 await 语法不能直接使用,而需要在特定的 async 函数中使用,这个 package 源自 Sindre Sorhus 在 twitter 发的一条牢骚,实现的方式也比较 hack,很可能这个特性会出现内置的支持,梦想是要有的,万一实现了呢。\u003C\u002Fp\u003E\u003Ca href=\&https:\\u002Fsindresorhus\u002Fensure-error\& data-editable=\&true\& data-title=\&ensure-error:确保你收到的是 Error 对象\&\u003Eensure-error:确保你收到的是 Error 对象\u003C\u002Fa\u003E\u003Cp\u003Enpm 社区贡献的各种 package 在数量上绝对碾压其他语言,但是质量也是参差不齐的,具体到笔者自己踩过的坑就是某些包抛出的错误不是标准的 Error 实例,导致我们的错误处理代码要做特别的改造才不会在处理错误的时候再出错。和 ensure-callback 类似,这个包能确保你拿到的 error 是正确的对象,Sindre Sorhus 这种发现问题解决问题的思路非常值得我们学习。\u003C\u002Fp\u003E\u003Ch3\u003E找找灵感\u003C\u002Fh3\u003E\u003Ca href=\&https:\\u002Fxgrommx\u002Fawesome-functional-programming#javascript\& data-editable=\&true\& data-title=\&Awesome 系列:函数式编程的资料合集\&\u003EAwesome 系列:函数式编程的资料合集\u003C\u002Fa\u003E\u003Cp\u003EAwesome 系列,整理了函数式编程方面的很多不错的演讲、文章、视频,覆盖的语言也比较多,感兴趣的可以慢慢看。\u003C\u002Fp\u003E\u003Ch3\u003E视频教程\u003C\u002Fh3\u003E\u003Ca href=\&https:\u002F\\u002Fwatch?v=PjjlwAvV8Jg\& data-editable=\&true\& data-title=\&DevTools: State of the Union 2017\&\u003EDevTools: State of the Union C\u002Fa\u003E\u003Cp\u003E由 Paul Irish 在 Google I\u002FO 2017 上给大家带来的分享,里面包含大量 Chrome 开发者工具的现场演示,比如:调试 PWA 的功能和技巧;如何解读应用性能、可用性报告;如何使用最新的 async 单步调试功能;如何快速的在开发者工具中编写、保存代码。\u003C\u002Fp\u003E\u003Ca href=\&https:\u002F\\u002Fwatch?v=3GHJ4cbxsVQ\& data-editable=\&true\& data-title=\&WebAssembly 对 React 究竟意味着什么?\&\u003EWebAssembly 对 React 究竟意味着什么?\u003C\u002Fa\u003E\u003Cp\u003E程序员卡通作家 Lin Clark 在 JSConf EU 2017 上的演讲,Facebook 是真心想把 React 的性能做到机制,而 WebAssembly 确实快,二者结合起来会怎样?我不剧透了,感兴趣的自己看哈。如果想看 Link Clark 的更多卡通画,可以去搜 ”A Cartoon Guide to“。\u003C\u002Fp\u003E\u003Ca href=\&https:\u002F\u002Fegghead.io\u002Fplaylists\u002Flearn-javascript-arrays-in-depth-dbe40331?utm_content=buffer4b7ca&utm_medium=social&utm_&utm_campaign=buffer\& data-editable=\&true\& data-title=\&egghead.io:玩转 JS 中的数组\&\u003Eegghead.io:玩转 JS 中的数组\u003C\u002Fa\u003E\u003Cp\u003E数组可以说是任何编程语言里面最重要的数据类型,JS 也不例外,掌握他们的必要性不必言语,该视频列表涵盖了几乎所有的 JS 数组操作,内涵不少使用数组完成常见任务的特别技巧。\u003C\u002Fp\u003E\u003Ch3\u003EOne More Thing\u003C\u002Fh3\u003E\u003Cp\u003E本文作者王仕军,商业转载请联系作者获得授权,非商业转载请注明出处。如果你觉得本文对你有帮助,请点赞!如果对文中的内容有任何疑问,欢迎留言讨论。想知道我接下来会写些什么?欢迎订阅我的\u003Ca href=\&https:\u002F\u002Fjuejin.im\u002Fuser\u002F57a7f634d342dd\& data-editable=\&true\& data-title=\&掘金专栏\&\u003E掘金专栏\u003C\u002Fa\u003E或\u003Ca href=\&https:\u002F\\u002Ffeweekly\& data-editable=\&true\& data-title=\&知乎专栏\&\u003E知乎专栏\u003C\u002Fa\u003E:《前端周刊:让你在前端领域跟上时代的脚步》。\u003C\u002Fp\u003E\u003Cp\u003EHappy Hacking\u003C\u002Fp\u003E&,&updated&:new Date(&T00:22:29.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:1,&likeCount&:24,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T08:22:29+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\\u002Fv2-db07a8caa0c2f64e445646fcc0080c31_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:1,&likesCount&:24},&&:{&title&:&破解前端面试系列(3):如何搞定纸上代码环节?&,&author&:&wangshijun&,&content&:&\u003Cblockquote\u003E\u003Cp\u003E很多重视技术的互联网公司在工程师招聘的技术面环节都会要求候选人在纸上写代码(后文用“纸上代码”代称),面试官想通过这种方式考察哪些点?候选人该注意哪些点?本文基于美团早几年常用的一道区分度比较高的面试题来做详细讲解,这道题我现在还在用,面过的人很多,但是纸上代码环节能答到满分的少之又少。\u003C\u002Fp\u003E\u003Cp\u003E共 3655 字,读完需 7 分钟。本文为《破解前端面试》系列文章的第 3 篇,前 2 篇链接在这里:\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&闭包篇\&\u003E闭包篇\u003C\u002Fa\u003E、\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&DOM 篇\&\u003EDOM 篇\u003C\u002Fa\u003E。\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Ch2\u003E为什么要纸上代码?\u003C\u002Fh2\u003E\u003Cp\u003E纸上代码(也有可能在白板上写)的做法乍看起来不够人性,但如果你是团队的 Leader,什么样的人能更好的融入团队?如果你是老板,你愿意掏钱养什么样的员工?纸上代码的基本目的就是考察候选人是否具备出活的能力,附带考察候选人是否思路灵活、知识面广。\u003C\u002Fp\u003E\u003Cp\u003E纸上代码环节怎么考察出活的能力?首先是出活的速度,没有编码基本功的人快速出活的概率是极低的,100% 依赖百度或者 IDE 自动完成才能完成基本任务的工程师算不上合格的工程师;其次是出活的质量,通过编码过程可以了解候选人通过学习和训练积累下来的编码风格、思考方法等;此外,通过纸上代码也可以了解候选人接受和完成任务的主动性,是不是愿意接受任何团队需要完成的任务。\u003C\u002Fp\u003E\u003Cp\u003E某种程度上说,纸上代码过程就是今后工作的缩影,既然如此,面试时排练下不是挺好的么?\u003C\u002Fp\u003E\u003Ch2\u003E纸上代码该怎么做?\u003C\u002Fh2\u003E\u003Cp\u003E通常来说,纸上代码都不会问特别复杂的问题,很可能只是完成非常通用的需求,解决实际遇到的业务问题,或者用某种语言实现某种算法。在提出实际业务问题的代码题之前,面试官会通过部分前置问题了解候选人对解决业务问题所需知识的掌握程度,并在必要的情况下给出知识补充。\u003C\u002Fp\u003E\u003Cp\u003E比如,前文提到的那道美团的代码题是:不借助第三方库的条件下,用 JS 编写函数从下面的 URL 串中解析出所有的参数:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Ehttp:\u002F\\u002F?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&d&enabled\u003C\u002Fcode\u003E\u003Cp\u003E期望的返回结果格式如下:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E{\n
user: 'anonymous',\n
id: [123, 456],
\u002F\u002F 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型\n
city: '北京',
\u002F\u002F 中文\n
enabled: true,
\u002F\u002F 未指定值的 key 约定值为 true\n}\u003C\u002Fcode\u003E\u003Cp\u003E对于使用过 Node.js 中的 \u003Ca href=\&https:\\u002Fnodejs\u002Fnode\u002Fblob\u002Fmaster\u002Flib\u002Fquerystring.js\& data-editable=\&true\& data-title=\&querystring\&\u003Equerystring\u003C\u002Fa\u003E 或者社区中的 \u003Ca href=\&https:\u002F\\u002Fpackage\u002Fqs\& data-editable=\&true\& data-title=\&qs\&\u003Eqs\u003C\u002Fa\u003E、\u003Ca href=\&https:\u002F\u002Fmedialize.github.io\u002FURI.js\u002F\& data-editable=\&true\& data-title=\&uri.js\&\u003Euri.js\u003C\u002Fa\u003E 模块的同学对这个可能再熟悉不过了,而那些不熟 HTTP GET 请求参数携带方式的候选人也不用着急,因为这种情况下面试官会解释 URL 参数的构造规则,至于对网络知识的掌握程度,是另外的关注点了。实际操作中,在我拿出这个问题之前,已经跟候选人聊了比较多的 HTTP 话题了。\u003C\u002Fp\u003E\u003Ch3\u003E1. 开始动手前\u003C\u002Fh3\u003E\u003Cp\u003E相当比例的候选人拿到问题,会立即提笔开始写代码,这是面试官最不愿看到的,和学校考试的填空题不同,纸上代码作为综合素质环节,面试官希望看到全面的你,如果工作中也是这样拿到需求不分青红皂白就开搞,最终的结果可能常常是事倍功半。\u003C\u002Fp\u003E\u003Cp\u003E谋定而后动,动手前一定要搞清楚问题。怎样才算是把问题搞清楚了?要清楚输入的特征,是否会出现各种奇怪的输入(脑子里面有这根弦的人通常不会差,但是面试官会小心求证,看看你能想到哪些);要清楚对解决办法的其他约束条件,比如时间复杂度,空间复杂度。而搞清楚问题的方法就是追问面试官,比如,针对上面的代码,可以追问的问题:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E未指定值的 key 是否会重复出现?如果重复出现该怎么处理?\u003C\u002Fli\u003E\u003Cli\u003E数字中只包含整数?是否包含浮点数?科学计数法?\u003C\u002Fli\u003E\u003Cli\u003E对代码的性能要求是怎样的?提出这个问题的时候,候选人心中可能已经有多重方法了。\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E就如同在实际工作中接需求的时候,需要知道需求的边界,各种可能的特殊情况,合作方对于排期的期望,需求中各个要点优先级界定,从决策论的角度来看,掌握更充分的信息,才能让你对技术复杂度、需求排期有更合理的预估,避免在做到一半或做完的时候发现与实际需求不符。\u003C\u002Fp\u003E\u003Cp\u003E搞清楚问题之后,相信你心中已经有了基本思路,不过动手的时机还没到,你应该把思路介绍给面试官,确认自己是否自己是否忽略了某些要点,这也是展示沟通能力的好机会,知道什么是有效沟通的同学应该能明白接收信息后向信源确认的重要性。\u003C\u002Fp\u003E\u003Cp\u003E需要注意的是,质疑精神强烈的同学在动手前会提很多问题,看起来是好事情,但如果只是停留在质疑层面,不愿意动手,留给面试官的印象就会是你是个挑活的人。在我的招聘经历中就曾遇到过因为觉得代码题要解决的问题没有任何意义而拒绝写代码的人,我没办法只能客气的把他送走。因为,对不认同事物的宽容程度很低的人很容易给团队带来坏味道。\u003C\u002Fp\u003E\u003Cp\u003E确定了问题边界和解决问题的思路,接下来你可以开始动手编码。\u003C\u002Fp\u003E\u003Ch3\u003E2. 编码过程中\u003C\u002Fh3\u003E\u003Cp\u003E解决 QueryString 参数解析问题的思路有好多种,比如字符串线性遍历法、字符串分割法、正则表达式方法,在我面过的人中,用字符串分割法的人最多,下面的讨论我们就围绕这种方法展开。线性遍历法的实现可以参考 Node.js 内置的 querystring 模块。\u003C\u002Fp\u003E\u003Cp\u003E编码过程中需要考虑哪些要素呢?下面用具体的例子来分析,比如我经常拿到这样的结果代码:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Efunction parse(str) {\n
var obj = {};\n
var ary = str.split('&');\n
for (var i = 0; i & ary. i++) {\n
var tmp = ary[i].split('=');\n
if (!obj[tmp[0]]) {\n
obj[tmp[0]] = tmp[1] ||\n
} else {\n
var tmp2 = [obj[tmp[0]], tmp[1] || true];\n
obj[tmp[0]] = tmp2;\n
}\n\\n}\u003C\u002Fcode\u003E\u003Cp\u003E看到这样的代码,相信你也已经皱起了眉头,这段代码在表层、逻辑严谨性、健壮性都存在问题,更严重的是没有满足数值型参数的需求,透过这段代码也可以推断候选人大概率是个不善于学习的人。\u003C\u002Fp\u003E\u003Ch4\u003E表层问题\u003C\u002Fh4\u003E\u003Cp\u003E表层问题主要指代码可读性,评价标准是:是否看起来简洁?是否看一眼就能理解它在做什么?上面的结果有哪些具体的表层问题呢?\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E可读性方面,如果你想在循环体里面要追踪解析到的键值对,需要在大脑中保持映射 key = tmp[0], value = tmp[1];\u003C\u002Fli\u003E\u003Cli\u003E变量命名方面,比如 tmp 的多次使用,ary 代称数组虽然也可以,社区中用 arr 比较多,变量命名多用约定俗成的会更好;\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E做了表层改进的参考代码如下:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Efunction parse(str) {\n
var paramObj = {};\n
var paramArr = str.split('&');\n
for (var i = 0; i & paramArr. i++) {\n
var tmp = paramArr[i].split('=');\n
\u002F\u002F 把 key 和 value 单独拆开来,会清晰很多\n
var key = tmp[0];\n
var value = tmp[1] ||\n
if (!paramObj[key]) {\n
paramObj[key] =\n
} else {\n
var newValue = [paramObj[key], value];\n
paramObj[key] = newV\n
return paramO\n}\u003C\u002Fcode\u003E\u003Ch4\u003E逻辑问题\u003C\u002Fh4\u003E\u003Cp\u003E逻辑不严谨的代码在不同输入情况下的结果是不稳定的,具体表现为:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003Eobj[tmp[0]] 不能正确判断结果中是否已经存在某个 key,因为可能出现值为 0 的情况;\u003C\u002Fli\u003E\u003Cli\u003E上面的代码不能正确处理重复出现 2 次以上的 key,部分候选人到面试结束还没想明白为啥;\u003C\u002Fli\u003E\u003Cli\u003E按照\u003Ca href=\&https:\u002F\u002Ftools.ietf.org\u002Fhtml\u002Frfc3986#page-14\& data-editable=\&true\& data-title=\&规范\&\u003E规范\u003C\u002Fa\u003E,URL 中的的各种参数需要在 encode 之后拼接到 URL 中,对应的解析时需要 decode;\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E解决掉逻辑问题的参考代码如下:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Efunction parse(str) {\n
var paramObj = {};\n
var paramArr = decoeURI(str).split('&');
\u002F\u002F 先解码\n
for (var i = 0; i & paramArr. i++) {\n
var tmp = paramArr[i].split('=');\n
var key = tmp[0];\n
var value = tmp[1] ||\n
if (typeof paramObj[key] === 'undefined') { \u002F\u002F 判断 key 是否存在\n
paramObj[key] =\n
} else {\n
var newValue = Array.isArray(paramObj[key]) ? paramObj[key] : [paramObj[key]];
\u002F\u002F 正确处理数组\n
newValue.push(value);\n
paramObj[key] = newV\n
return paramO\n}\u003C\u002Fcode\u003E\u003Ch3\u003E健壮问题\u003C\u002Fh3\u003E\u003Cp\u003E整段代码没有做任何的防御性编程,会让它很容报错,哪些地方该做防御性编程是值得拿捏的问题。QueryString 解析函数至少要要求自己的参数是字符串吧?在函数开头增加如下代码会更好:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E\u002F\u002F...\nif (typeof str !== 'string') {\n
return {};\n}\n\u002F\u002F...\u003C\u002Fcode\u003E\u003Ch4\u003E需求问题\u003C\u002Fh4\u003E\u003Cp\u003E代码中没有对数字做任何处理,拿到问题就埋头写代码的候选人几乎都有这个问题,这个问题的考点是怎么把能转换成数字的值转成数字。你想好怎么做了么?用 parseInt?还是用 parseFloat?\u003C\u002Fp\u003E\u003Cp\u003E下面是能正确处理数字的参考代码:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Efunction parse(str) {\n
if (typeof str !== 'string') {\n
return {};\n
var paramObj = {};\n
var paramArr = decodeURI(str).split('&');\n
for (var i = 0; i & paramArr. i++) {\n
var tmp = paramArr[i].split('=');\n
var key = tmp[0];\n
var value = tmp[1] ||\n\n
\u002F\u002F 处理数字:很多人忽略这里的类型判断,布尔值传给 Number 也会解析出数字\n
if (typeof value === 'string' && isNaN(Number(value)) === false) {\n
value = Number(value);\n
if (typeof paramObj[key] === 'undefined') {\n
paramObj[key] =\n
} else {\n
var newValue = Array.isArray(paramObj[key]) ? paramObj[key] : [paramObj[key]];\n
newValue.push(value);\n
paramObj[key] = newV\n
return paramO\n}\u003C\u002Fcode\u003E\u003Ch3\u003E不算问题的问题\u003C\u002Fh3\u003E\u003Cp\u003E下面两点不算是问题,但是如果候选人能做到,无疑是加分项。\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E在 ES6 成为新语言标准的情形下,候选人还在大量的使用 var,虽然并没有错,但是你要有没有更好的方法;\u003C\u002Fli\u003E\u003Cli\u003E可以用更语义化的 JS 数组方法来组织代码,比如 map、reduce,如果你知道的化,在面试中可以大胆使用;\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E使用 ES6 编写的参考代码如下:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Efunction parse(str) {\n
if (typeof str !== 'string') {\n
return {};\n
return decodeURI(str).split('&').map(param =& {\n
const tmp = param.split('=');\n
const key = tmp[0];\n
let value = tmp[1] ||\n
if (typeof value === 'string' && isNaN(Number(value)) === false) {\n
value = Number(value);\n
return { key, value };\n
}).reduce((params, item) =& {\n
const { key, value } =\n
if (typeof params[key] === 'undefined') {\n
params[key] =\n
} else {\n
params[key] = Array.isArray(params[key]) ? params[key] : [params[key]];\n
params[key].push(value);\n
}, {});\n}\u003C\u002Fcode\u003E\u003Cp\u003E此外,关注前端技术进展的同学可能会注意到部分现代浏览器提供了 \u003Ca href=\&https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FURLSearchParams\& data-editable=\&true\& data-title=\&URLSearchParams\&\u003EURLSearchParams\u003C\u002Fa\u003E 的支持,可以用这个特性 1 行代码就搞定需求。\u003C\u002Fp\u003E\u003Ch3\u003E3. 编码结束后\u003C\u002Fh3\u003E\u003Cp\u003E代码初版写完之后,不要着急马上展示给面试官,就像是需求开发完,你至少得自己先按需求文档走一遍,把代码原题中的输入代进自己的代码做推演和简单的边界测试,然后再对着代码和面试官讲解。不出意外的话,推演过程你自己会发现部分问题,或者明显的改进点,这些内容你都可以跟面试官提出来,因为这也是展示你的能力的机会。\u003C\u002Fp\u003E\u003Ch2\u003E总结\u003C\u002Fh2\u003E\u003Cp\u003E感谢你花时间读到这里,相信你已经理解了通过纸上代码的过程和结果可以深入考察候选人的基本素质、工作方式、出活能力,也知道了在解答代码题的不同环节该注意哪些要点:动手前搞清楚问题;编码时注意编码风格、逻辑严谨性、程序健壮性;编码后要先自己测试和推演。当然,如果你之前没注意到这些,需要接下来工作中多加练习。最后祝你能找到你想要的工作。\u003C\u002Fp\u003E\u003Ch2\u003EOne More Thing\u003C\u002Fh2\u003E\u003Cp\u003E本文作者王仕军,商业转载请联系作者获得授权,非商业转载请注明出处。如果你觉得本文对你有帮助,请点赞!如果对文中的内容有任何疑问,欢迎留言讨论。想知道我接下来会写些什么?欢迎订阅我的\u003Ca href=\&https:\u002F\u002Fjuejin.im\u002Fuser\u002F57a7f634d342dd\& data-editable=\&true\& data-title=\&掘金专栏\&\u003E掘金专栏\u003C\u002Fa\u003E或\u003Ca href=\&https:\u002F\\u002Ffeweekly\& data-editable=\&true\& data-title=\&知乎专栏\&\u003E知乎专栏\u003C\u002Fa\u003E:《前端周刊:让你在前端领域跟上时代的脚步》。\u003C\u002Fp\u003E\u003Cp\u003EHappy Hacking\u003C\u002Fp\u003E&,&updated&:new Date(&T00:12:00.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:32,&likeCount&:111,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T08:12:00+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\\u002Fv2-eab9c8f4fea1d8ff3adc5a9e9a4cbb17_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:32,&likesCount&:111},&&:{&title&:&tooling bits 专栏文章索引&,&author&:&wangshijun&,&content&:&\u003Ca href=\&https:\u002F\\u002Ftoolingtips\& data-editable=\&true\& data-title=\&tooling bits\&\u003Etooling bits\u003C\u002Fa\u003E 专栏创建到现在已经月余,共发文 20 篇,距离我之前设定的每天 1 篇的目标还有很大差距,接下来会继续努力,为了方便大家查找,编写这篇索引文章置顶,方便大家分类浏览。\u003Cp\u003Etooling bits 中文章的主题包括:Vim、Git、Chrome、CLI、JS、Mac,索引就按照这个来。\u003C\u002Fp\u003E\u003Ch2\u003EChrome\u003C\u002Fh2\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Chrome Tips #1:Youtube 视频和字幕免费下载插件\& class=\&\&\u003EChrome Tips #1:Youtube 视频和字幕免费下载插件\u003C\u002Fa\u003E;\u003Cp\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Chrome Tips #2:如何阻止搜索时跳转到本地 Google 域名?\& class=\&\&\u003EChrome Tips #2:如何阻止搜索时跳转到本地 Google 域名\u003C\u002Fa\u003E;\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Chrome Tips #3:如何让每个标签页自动打开 Dev Tools\& class=\&\&\u003EChrome Tips #3:如何让每个标签页自动打开 Dev Tools\u003C\u002Fa\u003E;\u003C\u002Fp\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Chrome Tips #4:在任意页面运行预定义脚本\& class=\&\&\u003EChrome Tips #4:在任意页面运行预定义脚本\u003C\u002Fa\u003E;\u003Ch2\u003E命令行\u003C\u002Fh2\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&CLI Tips #1:EditorConfig 辅助工具\& class=\&\&\u003ECLI Tips #1:EditorConfig 辅助工具\u003C\u002Fa\u003E;\u003Cp\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&CLI Tips #2:快速启动 Web Server 的几种方式\& class=\&\&\u003ECLI Tips #2:快速启动 Web Server 的几种方式\u003C\u002Fa\u003E;\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&CLI Tips #3:如何知道仓库的代码行数?\& class=\&\&\u003ECLI Tips #3:如何知道仓库的代码行数\u003C\u002Fa\u003E;\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&CLI Tips #4:yarn create &package-name&\& class=\&\&\u003ECLI Tips #4:yarn create &package-name&\u003C\u002Fa\u003E;\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&CLI Tips#5:在多个终端窗口或标签中共享命令历史\& class=\&\&\u003ECLI Tips #5:在多个终端窗口或标签中共享命令历史\u003C\u002Fa\u003E;\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ch2\u003EGit\u003C\u002Fh2\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Git Tips #1:不再输错 git 命令\& class=\&\&\u003EGit Tips #1:不再输错 git 命令\u003C\u002Fa\u003E;\u003Cp\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Git Tips #2:比 line-diff 更好的 word-diff\& class=\&\&\u003EGit Tips #2:比 line-diff 更好的 word-diff\u003C\u002Fa\u003E;\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ch2\u003EVim\u003C\u002Fh2\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Vim Tips #1:如何批量编辑文件?\& class=\&\&\u003EVim Tips #1:如何批量编辑文件\u003C\u002Fa\u003E;\u003Cp\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Vim Tips #2:粘贴大段代码如何保留原格式?\& class=\&\&\u003EVim Tips #2:粘贴大段代码如何保留原格式\u003C\u002Fa\u003E;\u003Cbr\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Vim Tips #1:如何批量编辑文件?\& class=\&\&\u003E\u003C\u002Fa\u003E\u003Cbr\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Vim Tips #3:
Vim 命令的模式\& class=\&\&\u003EVim Tips #3:Vim 命令的模式\u003C\u002Fa\u003E(\u003Cb\u003E推荐阅读\u003C\u002Fb\u003E);\u003Cbr\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Vim Tips #2:粘贴大段代码如何保留原格式? \& class=\&\&\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Vim Tips #4:如何快速回到上次工作的位置?\& class=\&\&\u003EVim Tips #4:如何快速回到上次工作的位置\u003C\u002Fa\u003E;\u003C\u002Fp\u003E\u003Ch2\u003EMac\u003C\u002Fh2\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Mac Tips #1:如何在超大屏幕中快速找到鼠标?\& class=\&\&\u003EMac Tips #1:如何在超大屏幕中快速找到鼠标\u003C\u002Fa\u003E;\u003Cp\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Mac Tips#2:巧用多应用全屏 - 知乎专栏\&\u003EMac Tips#2:巧用多应用全屏\u003C\u002Fa\u003E;\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ch2\u003EJS\u003C\u002Fh2\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F?refer=toolingtips\& data-editable=\&true\& data-title=\&JS Tips #1:Promise.all 处理 Rejection 的技巧\& class=\&\&\u003EJS Tips #1:Promise.all 处理 Rejection 的技巧\u003C\u002Fa\u003E;\u003Cp\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&JS Tips #2 React Native 如何忽略黄色警告\& class=\&\&\u003EJS Tips #2:React Native 如何忽略黄色警告\u003C\u002Fa\u003E;\u003C\u002Fp\u003E\u003Ch2\u003E综合\u003C\u002Fh2\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F?refer=toolingtips\& data-editable=\&true\& data-title=\&用 husky 和 lint-staged 构建超溜的代码检查工作流\& class=\&\&\u003E用 husky 和 lint-staged 构建超溜的代码检查工作流\u003C\u002Fa\u003E;\u003Cp\u003E\u003Ca href=\&https:\u002F\\u002Fp\u002F?refer=toolingtips\& data-editable=\&true\& data-title='使用 \&5W1H\& 写出高可读的 Git Commit Message' class=\&\&\u003E使用 \&5W1H\& 写出高可读的 Git Commit Message\u003C\u

我要回帖

更多关于 这个时代是最好的时代 的文章

 

随机推荐