js return a b ctypeof a < typeof b ? -1 : 1; 求问老哥们这里是比较a和b的type吗? 能否详细解释下,谢了

所有回答(5)
代码太多太乱,不太有人看的
我建议你使用一些web调试工具定位到你想要调整的&微信&位置,然后看看是怎么排到现在的位置的,再进行修改
其实如果你有一个能够访问的网页地址URL,给出来说不定更容易让别人帮忙
园豆:1862
你这代码,不想说了,我想没人会看的,这里有个返回顶部的连接代码,你看下吧
妈蛋,你把jQuery库列出来搞毛啊!
给你推荐一下:
完全没得法
我看来还是自己解决
清除回答草稿
&&&您需要以后才能回答,未注册用户请先。&figure&&img src=&https://pic4.zhimg.com/v2-70dd0becd259d177b028cd9dc4d6f9ef_b.jpg& data-rawwidth=&758& data-rawheight=&351& class=&origin_image zh-lightbox-thumb& width=&758& data-original=&https://pic4.zhimg.com/v2-70dd0becd259d177b028cd9dc4d6f9ef_r.jpg&&&/figure&&p&故事大概是这样,昨天上午,公司安排了一组新人进来面试,同事找我去旁听,顺便帮忙一起看看。面试的都是刚毕业的学生,为了看看他们的能力自然问了一些问题,回答得都可以。然后就到了上机写码环节。&/p&&p&&br&&/p&&p&需求很简单,就是使用React去写一个旋转木马组件(不要求能无限旋转),时间最多是1个小时。面试的学生们开始奋力写,可惜到最后,竟然没有一个人能写出来能跑的程序。这个着实让我有些惊讶不已,&b&这个常用的组件大家应该都挺熟悉的呀&/b&?&/p&&p&&br&&/p&&p&后来我回家以后,自己亲自尝试了一下写一个旋转木马组件,要求对自己高一些,&b&写出的是可循环的旋转木马&/b&。乖乖诶,真不容易!涵盖的知识点真的挺多的,下面我们就一起来看看如何手工实现一个旋转木马!&/p&&p&&br&&/p&&hr&&h2&&b&JSX结构设计&/b&&/h2&&p&我们简单的将JSX结构设计成为&/p&&figure&&img data-rawheight=&114& src=&https://pic4.zhimg.com/v2-085af3d11cc4_b.jpg& data-size=&normal& data-rawwidth=&428& class=&origin_image zh-lightbox-thumb& width=&428& data-original=&https://pic4.zhimg.com/v2-085af3d11cc4_r.jpg&&&figcaption&这样的形式&/figcaption&&/figure&&h2&&b&分析逻辑实现&/b&&/h2&&p&分析思路,只要思路出来了,也就不难了。旋转木马组件是一个切换页面,类似以前的胶卷,一个一个的格子,然后有一个框,框里显示的就是当前的木马照片,通过移动胶卷的位置,使得框中的照片进行移动。&/p&&figure&&img data-rawheight=&448& src=&https://pic3.zhimg.com/v2-dc19cebd666b_b.jpg& data-size=&normal& data-rawwidth=&854& class=&origin_image zh-lightbox-thumb& width=&854& data-original=&https://pic3.zhimg.com/v2-dc19cebd666b_r.jpg&&&/figure&&h2&&b&胶卷包含着一张张图片&/b&&/h2&&figure&&img data-rawheight=&131& src=&https://pic3.zhimg.com/v2-31e14e1eebc737d2d560a_b.jpg& data-size=&normal& data-rawwidth=&391& class=&content_image& width=&391&&&/figure&&p&在组件中,我们在做外层定义一个&b&Carousel的框&/b&,&b&用来制作我们切换图片时的框&/b&。在组件的内部一层呢,我们主要做的实现一个胶卷,胶卷里面渲染照片。&/p&&p&&br&&/p&&p&回头看我们的需求,我们是需要如下图这样的一个形式,&b&我们必须要把框给设置一个属性,使得他不显示超出框边界的胶卷&/b&!&/p&&p&&br&&/p&&figure&&img data-rawheight=&306& src=&https://pic3.zhimg.com/v2-4be5b05c364bf7e8d7651a_b.jpg& data-size=&normal& data-rawwidth=&808& class=&origin_image zh-lightbox-thumb& width=&808& data-original=&https://pic3.zhimg.com/v2-4be5b05c364bf7e8d7651a_r.jpg&&&/figure&&p&&br&&/p&&p&答案就是CSS的属性:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&overflow://用于把大于200px的东西全部隐藏掉
width: 200//框的大小,可以根据业务在js层里自己设置
&/code&&/pre&&/div&&p&&br&&/p&&p&在以下的内容中,我们都将照片的宽度设置&b&为200px,高200px&/b&,以便方便教学,实际中,可以根据业务来进行动态调整。&/p&&p&&br&&/p&&p&并且我们得监听用户在胶卷上滑动!&/p&&figure&&img data-rawheight=&62& src=&https://pic2.zhimg.com/v2-7a50b6c200fa523d2b225e_b.jpg& data-size=&normal& data-rawwidth=&362& class=&content_image& width=&362&&&figcaption&我们只支持手机端先啦~&/figcaption&&/figure&&p&&br&&/p&&h2&&b&实现图片的水平排列&/b&&/h2&&p&当然,这样还需要一个小知识点就是&/p&&blockquote&我们的div之类的标签,默认都是重新起一行的。如果我们要实现一个水平旋转木马,那么我们必须要&b&让所有的div都能够并排展示&/b&。&/blockquote&&p&&br&&/p&&p&要做到这一点,我们首先要将这些图片再包上一层div,并且加上&b&float:left&/b&属性,&b&然后最重要的是给胶卷设置具体的长度,这样才能够使得图片并排展示&/b&。&i&(如果你以为使用&b&display:flex&/b&,那你就图样图森破了!)&/i&&/p&&figure&&img data-rawheight=&356& src=&https://pic1.zhimg.com/v2-e3bc7fff726f37c57ba2b857f45e83d7_b.jpg& data-size=&normal& data-rawwidth=&610& class=&origin_image zh-lightbox-thumb& width=&610& data-original=&https://pic1.zhimg.com/v2-e3bc7fff726f37c57ba2b857f45e83d7_r.jpg&&&/figure&&figure&&img data-rawheight=&117& src=&https://pic4.zhimg.com/v2-cb7d3cf477b05aedf9e5_b.jpg& data-size=&normal& data-rawwidth=&202& class=&content_image& width=&202&&&/figure&&p&&br&&/p&&h2&&b&一切就绪,开始写业务逻辑&/b&&/h2&&figure&&img data-rawheight=&262& src=&https://pic3.zhimg.com/v2-bccc853faed72b30bb8f918_b.jpg& data-size=&normal& data-rawwidth=&600& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic3.zhimg.com/v2-bccc853faed72b30bb8f918_r.jpg&&&/figure&&p&在onTouchStart阶段,我们首先得监听用户开始点击的地方:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&touchStartX
&/code&&/pre&&/div&&p&然后,在onTouchMove的阶段,我们得算出用户实际上手指在胶卷上滑动的变化量:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&const delteX = event.touches[0].clientX - this.state.touchStartX
&/code&&/pre&&/div&&p&这里注意的是,我们还有一个变量叫做&b&currentX&/b&,这个实际上记录的是&b&目前胶卷当前的位移,初始值我们设置为0.&/b&&/p&&p&&br&&/p&&p&最后,在onTouchEnd阶段,我们得设置胶卷的最终位置,这是为什么呢?我们来看一张图&/p&&figure&&img data-rawheight=&260& src=&https://pic4.zhimg.com/v2-fdf3ec149c81d0f49925f2_b.jpg& data-size=&normal& data-rawwidth=&329& class=&content_image& width=&329&&&/figure&&ul&&li&用户在使用的时候,&b&手指可能停留在任何位置&/b&,我们必须要使得轮播图要在正确的位置上,而不要像上图一样,&b&一半一半的&/b&,多难看呀。&/li&&li&我们需要记录一个currentIndex,表示当前到哪一个组件了,根据这个currentIndex的值&b&算出我们轮播图的位移&/b&。&/li&&/ul&&figure&&img data-rawheight=&325& src=&https://pic2.zhimg.com/v2-d81e904ca0e4f747ec7f_b.jpg& data-size=&normal& data-rawwidth=&611& class=&origin_image zh-lightbox-thumb& width=&611& data-original=&https://pic2.zhimg.com/v2-d81e904ca0e4f747ec7f_r.jpg&&&/figure&&p&这里逻辑有些绕,但是意思很简单:&/p&&ol&&li&首先根据每个轮播图的宽度,利用当前的位移&b&this.state.x&/b&计算出他目前到哪个位置了,其实就是&b&let currentIndex = Math.round(this.state.x)&/b&&/li&&li&&b&如果目前的轮播位置大于胶卷的最大宽度,那么则不要再继续滚动,保持他的轮播位置一直等于胶卷最大宽度处&/b&&/li&&li&记录下目前的所有信息,包括:目前胶带的位置,目前轮播图是哪一张。&/li&&/ol&&p&&br&&/p&&p&实际上,到这里基本上就可以了,证明你已经拥有了基本的逻辑思维和基础,回顾一下上面中我们使用了哪些知识:&/p&&ol&&li&隐藏&b&超出范围的元素:overflow:hidden&/b&&/li&&li&&b&组件的横向排列:float属性&/b&&/li&&li&&b&事件监听函数:start,move,end&/b&&/li&&li&&b&一些数学知识&/b&&/li&&/ol&&p&&br&&/p&&p&不过,实际上动手起来,你就会发现,这里卡一下壳,那里卡一下壳,这个原因&b&就是你编码能力不足&/b&。&/p&&p&&br&&/p&&p&编码能力是什么?我认为,编码能力是:&b&你拿到一堆积木,当你恰巧缺了一种市面上很难找到或者根本没有的粘着剂的时候,你能够根据你的业务需求,写出来的能力!&/b&&/p&&p&&br&&/p&&p&&b&想要获得这种能力,我们还是得多看源码,多加练习。&/b&&/p&&hr&&p&&br&&/p&&h2&&b&实现无限轮播和动画处理&/b&&/h2&&p&&br&&/p&&p&假设,现在React刚出来,并且要求你不要用jQ的思维去操作dom,你现在要封装一款属于自己公司的无限轮播和平滑动画的组件,你能不能设计出来呢?&/p&&p&&br&&/p&&p&&b&下面我们就来解析:&/b&&/p&&p&&br&&/p&&p&&br&&/p&&p&当我们松开手指后,我们的轮播图会自动归位,并且有一个柔顺,飘逸般的动画效果,这样使得我们用户感受非常爽快!&/p&&p&&br&&/p&&p&实现html5中的动画,有两个套路:&/p&&ol&&li&CSS3 动画:transition balbablablablabl&/li&&li&使用requestAnimationFrame来递归回调&/li&&/ol&&p&在轮播图组件中,transition是最容易实现动画效果的,它有一个最大的毛病就是:&b&无法捕捉开始和结束!然而在轮播图中,尤其是在无限旋转的轮播图中,捕捉动画的开始结束,是至关重要的!&/b&&/p&&p&&br&&/p&&p&第二点就是无限轮播组件,我们刚开始的想法的可能是使用循环的index去做,但是这又有一个大问题就是,当用户到达最后一个组件的时候,他想继续滑动,如果我们使用循环index来做,那必然会使得动画跳跃:&/p&&figure&&img data-rawheight=&209& src=&https://pic4.zhimg.com/v2-a7a70c7d8dc036dedacfe_b.jpg& data-size=&normal& data-rawwidth=&695& class=&origin_image zh-lightbox-thumb& width=&695& data-original=&https://pic4.zhimg.com/v2-a7a70c7d8dc036dedacfe_r.jpg&&&figcaption&由这个状态直接跳到&/figcaption&&/figure&&figure&&img data-rawheight=&214& src=&https://pic1.zhimg.com/v2-df8b4fed632_b.jpg& data-size=&normal& data-rawwidth=&670& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&https://pic1.zhimg.com/v2-df8b4fed632_r.jpg&&&/figure&&p&&br&&/p&&p&会导致用户觉得非常突兀,难受,反直观:因为用户想向左滑动到下一个,但是竟然跳着回到了第一个&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&换一种思维&/b&&/h2&&p&不知道大家还记得不记得,高中大学的时候,我们做数学题目有时候无法写出来的时候,会有用到辅助线的做法?&/p&&p&&br&&/p&&p&没错,我们在做无限轮播图的时候,就是要使用辅助线的办法,具体怎么做呢?&/p&&p&&br&&/p&&figure&&img data-rawheight=&264& src=&https://pic2.zhimg.com/v2-2a0d15da23ecaea257997_b.jpg& data-size=&normal& data-rawwidth=&805& class=&origin_image zh-lightbox-thumb& width=&805& data-original=&https://pic2.zhimg.com/v2-2a0d15da23ecaea257997_r.jpg&&&/figure&&p&&b&最简单的办法就是把胶带的头,和尾巴,分别的接在胶卷的尾巴和头部,注意是反过来。&/b&&/p&&p&&br&&/p&&h2&&b&这样做是为什么呢?&/b&&/h2&&p&当我们在头部,1的时候 ,想要向右滑动,这样,我们就能够获得一个5了!&/p&&figure&&img data-rawheight=&347& src=&https://pic4.zhimg.com/v2-ebee0d3bb7fb575ba772_b.jpg& data-size=&normal& data-rawwidth=&718& class=&origin_image zh-lightbox-thumb& width=&718& data-original=&https://pic4.zhimg.com/v2-ebee0d3bb7fb575ba772_r.jpg&&&figcaption&我们现在向右滑动&/figcaption&&/figure&&figure&&img data-rawheight=&227& src=&https://pic1.zhimg.com/v2-d4eb3c79c3_b.jpg& data-size=&normal& data-rawwidth=&362& class=&content_image& width=&362&&&figcaption&我们可以看到5了,非常流畅&/figcaption&&/figure&&figure&&img data-rawheight=&320& src=&https://pic2.zhimg.com/v2-cddf5f4c9e904e52f8033_b.jpg& data-size=&normal& data-rawwidth=&393& class=&content_image& width=&393&&&figcaption&当我们做动画,动画结束缓慢到达5的时候,就是现在!!!!!&/figcaption&&/figure&&figure&&img data-rawheight=&317& src=&https://pic3.zhimg.com/v2-fee3b4f6458da24ecda771e01b923e8e_b.jpg& data-size=&normal& data-rawwidth=&712& class=&origin_image zh-lightbox-thumb& width=&712& data-original=&https://pic3.zhimg.com/v2-fee3b4f6458da24ecda771e01b923e8e_r.jpg&&&figcaption&直接将框的位移移动到真实的5的地方!现在我们向左滑动,去1的地方&/figcaption&&/figure&&figure&&img data-rawheight=&303& src=&https://pic3.zhimg.com/v2-00c37f55ef8f3eca86630_b.jpg& data-size=&normal& data-rawwidth=&666& class=&origin_image zh-lightbox-thumb& width=&666& data-original=&https://pic3.zhimg.com/v2-00c37f55ef8f3eca86630_r.jpg&&&figcaption&这样用户可以随意的滑动了!!向左滑动看到1,向右滑动看4&/figcaption&&/figure&&figure&&img data-rawheight=&248& src=&https://pic3.zhimg.com/v2-8bf76b5b4b77cc44513c_b.jpg& data-size=&normal& data-rawwidth=&583& class=&origin_image zh-lightbox-thumb& width=&583& data-original=&https://pic3.zhimg.com/v2-8bf76b5b4b77cc44513c_r.jpg&&&figcaption&当我们到达1的一瞬间!&/figcaption&&/figure&&figure&&img data-rawheight=&347& src=&https://pic4.zhimg.com/v2-ebee0d3bb7fb575ba772_b.jpg& data-size=&normal& data-rawwidth=&718& class=&origin_image zh-lightbox-thumb& width=&718& data-original=&https://pic4.zhimg.com/v2-ebee0d3bb7fb575ba772_r.jpg&&&figcaption&回到最初的状态,这样子就完成了一个循环&/figcaption&&/figure&&p&&br&&/p&&p&思想简单,代码更简单,我们需要的能力只有一个「完全控制动画的开始和结束」,所以,这里势必要使用requestAnimationFrame了!&/p&&p&&br&&/p&&figure&&img data-rawheight=&646& src=&https://pic4.zhimg.com/v2-745b4e41ca3c455fd2b0aeb4_b.jpg& data-size=&normal& data-rawwidth=&696& class=&origin_image zh-lightbox-thumb& width=&696& data-original=&https://pic4.zhimg.com/v2-745b4e41ca3c455fd2b0aeb4_r.jpg&&&/figure&&p&可以看到,requestAnimationFrame会进行递归调用,直到ary=0的时候结束。&b&ary中记录着每一帧动画所移动的值&/b&。具体这个值怎么算出来的,其实秘密就在&/p&&figure&&img data-rawheight=&63& src=&https://pic1.zhimg.com/v2-4b19b94f74dcf285c0eccbe_b.jpg& data-size=&normal& data-rawwidth=&418& class=&content_image& width=&418&&&/figure&&p&这里&/p&&p&&br&&/p&&p&最终的效果就在:&/p&&figure&&img data-rawheight=&240& src=&https://pic4.zhimg.com/v2-1a38d9aaa762f0edadccedae63b866f8_b.jpg& data-size=&normal& data-rawwidth=&360& data-thumbnail=&https://pic4.zhimg.com/v2-1a38d9aaa762f0edadccedae63b866f8_b.jpg& class=&content_image& width=&360&&&/figure&&br&&br&&p&&br&&/p&&p&git:&a href=&https://link.zhihu.com/?target=https%3A//github.com//blog/blob/master/src/Carousel/index.js& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&代码在这里,并没有整理,凑合着看啦~&/a&&/p&&p&&br&&/p&&h2&&b&总结&/b&&/h2&&ol&&li&真正的编程能力:&b&你拿到一堆积木,当你恰巧缺了一种市面上很难找到或者根本没有的粘着剂的时候,你能够根据你的业务需求,写出来的能力!&/b&&/li&&li&如何获得编程能力:&a href=&https://www.zhihu.com/question/& class=&internal&&什么才算是真正的编程能力?&/a&&/li&&li&作为前端届使用得最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最最多的组件,非常值得我们在任何一种框架之下实现,核心套路是一样的,因此可想而知,在未来有新的框架出来之前,这些个组件一定会被重写,当我们掌握这种核心套路以后,压根儿不怕他来什么框架.....&/li&&/ol&&p&&br&&/p&&p&&br&&/p&&p&&b&完,我们下周再见&/b&.&/p&&p&造轮子系列还可以看看:&/p&&ol&&li&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Luy 1.0 :一个React-like轮子的诞生&/a&&/li&&li&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&「实战」React实现的拖拽组件&/a&&/li&&li&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&80+代码实现一个React版本的酷炫动效简历&/a&&/li&&li&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&事件驱动与协程:基本概念介绍&/a&&/li&&/ol&
故事大概是这样,昨天上午,公司安排了一组新人进来面试,同事找我去旁听,顺便帮忙一起看看。面试的都是刚毕业的学生,为了看看他们的能力自然问了一些问题,回答得都可以。然后就到了上机写码环节。 需求很简单,就是使用React去写一个旋转木马组件(不要…
&figure&&img src=&https://pic1.zhimg.com/v2-dcee850c4f8f82e73809d_b.jpg& data-rawwidth=&1268& data-rawheight=&443& class=&origin_image zh-lightbox-thumb& width=&1268& data-original=&https://pic1.zhimg.com/v2-dcee850c4f8f82e73809d_r.jpg&&&/figure&&p&这是参加Rancher 深圳站线下活动时候的一个演示项目&/p&&p&现在贴一下整个的步骤,供大家参考~&/p&&p&一,Git&br&&/p&&p&可选的git系统如下,示例用gogs&/p&&ul&&li&Gogs&/li&&li&Gitlab&/li&&li&Github&br&&/li&&/ul&&br&&p&Gogs,Docker-Compose安装:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&```
version: '2'
image: gogs/gogs:0.9.113
- &10022:22&
- ./gogs:/data
restart: always
- mysql:mysql
environment:
- Domain=${GOGS_IP}
- SSH_PORT=${GOGS_SSH_PORT}
image: mysql:5.7.13
restart: always
- ./mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=gogs
&/code&&/pre&&/div&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# env
export MYSQL_ROOT_PASSWORD={mysql_root_password}
export GOGS_IP={ip}
export GOGS_SSH_PORT=10022
export GOGS_HTTP_PORT=10080
docker-compose up -d
&/code&&/pre&&/div&&p&浏览器打开:http:{ip}:{http_port} 完成安装&/p&&p&&figure&&img src=&https://pic2.zhimg.com/v2-f9e31c3d8c565dbab67536_b.jpg& data-rawwidth=&1019& data-rawheight=&471& class=&origin_image zh-lightbox-thumb& width=&1019& data-original=&https://pic2.zhimg.com/v2-f9e31c3d8c565dbab67536_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-c8e8d610c98060baddc91_b.jpg& data-rawwidth=&967& data-rawheight=&744& class=&origin_image zh-lightbox-thumb& width=&967& data-original=&https://pic4.zhimg.com/v2-c8e8d610c98060baddc91_r.jpg&&&/figure&登录后创建测试项目:alpine-drone&/p&&p&二,Drone CI&/p&&p&Drone,Docker-compose安装(Gogs):&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&version: '2'
drone-server:
image: thonatos/alpine-drone # 换成drone/drone:0.5.0
- ./drone:/var/lib/drone/
restart: always
environment:
- DRONE_OPEN=true
- DRONE_DEBUG=false
- DRONE_GOGS=true
- DRONE_GOGS_URL=http://${GOGS_IP}:${GOGS_HTTP_PORT}
- DRONE_GOGS_PRIVATE_MODE=true
- DRONE_GOGS_SKIP_VERIFY=true
- DRONE_SECRET=${DRONE_SECRET}
# - DRONE_ADMIN=suyi
drone-agent:
image: thonatos/alpine-drone # 换成drone/drone:0.5.0
command: agent
restart: always
depends_on: [ drone-server ]
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_SERVER=ws://drone-server:8000/ws/broker
- DRONE_SECRET=${DRONE_SECRET}
&/code&&/pre&&/div&&p&Drone,Docker-compose安装(Github):&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&version: '2'
drone-server:
image: drone/drone:0.5.0
environment:
DRONE_GITHUB: true
DRONE_GITHUB_CLIENT: 95ceb25e82
DRONE_GITHUB_SECRET: 30fb359e075
&/code&&/pre&&/div&&figure&&img src=&https://pic4.zhimg.com/v2-c3f03bdcf9654d96eaabb_b.jpg& data-rawwidth=&1016& data-rawheight=&641& class=&origin_image zh-lightbox-thumb& width=&1016& data-original=&https://pic4.zhimg.com/v2-c3f03bdcf9654d96eaabb_r.jpg&&&/figure&&figure&&img src=&https://pic2.zhimg.com/v2-e548dce876e_b.jpg& data-rawwidth=&586& data-rawheight=&103& class=&origin_image zh-lightbox-thumb& width=&586& data-original=&https://pic2.zhimg.com/v2-e548dce876e_r.jpg&&&/figure&&p&运行Drone:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# env
export DRONE_SECRET={secret}
docker-compose up -d
&/code&&/pre&&/div&&p&浏览器打开:http://{ip}:{drone_port},使用安装gogs设置的管理员账号密码登录,点击右侧account看到当前项目,点开项目旁边的构建选项即可&/p&&br&&figure&&img src=&https://pic3.zhimg.com/v2-a20f28bf6aa_b.jpg& data-rawwidth=&1519& data-rawheight=&851& class=&origin_image zh-lightbox-thumb& width=&1519& data-original=&https://pic3.zhimg.com/v2-a20f28bf6aa_r.jpg&&&/figure&&p&三,配置Docker自动构建&/p&&p&下载并配置 drone cli:&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# mac
brew tap drone/drone
brew install drone --devel
# http://readme.drone.io/usage/getting-started-cli/
# 下载并配置到PATH中
export DRONE_SERVER=http://drone.mycompany.com
export DRONE_TOKEN={}
# token刚才drone的管理界面account中点show_token
&/code&&/pre&&/div&&p&在项目内创建.drone.yml文件,内容如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&pipeline:
# registry: {}
# 私有registry地址
# auth: {}
# auth_token
image: plugins/docker
repo: thonatos/alpine-drone # 修改为你对应的repo名字
tags: latest
&/code&&/pre&&/div&&p&更多配置项:&a href=&https://link.zhihu.com/?target=http%3A//plugins.drone.io/drone-plugins/drone-docker/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker | Plugins | Drone&/a&&br&&/p&&p&配置push信息:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 获取repo列表
drone repo ls
# suyi/alpine-drone
# 添加docker hub信息
drone secret add --image=plugins/docker suyi/alpine-drone DOCKER_USERNAME thonatos
drone secret add --image=plugins/docker suyi/alpine-drone DOCKER_PASSWORD {password}
drone sign suyi/alpine-drone
&/code&&/pre&&/div&&p&提交代码到git:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&git init
git ct -m &init&
git remote add origin ssh://git@{ip}:{ssh_port}/suyi/alpine-drone.git
git push -u origin master
&/code&&/pre&&/div&&p&可以看到如下信息:&/p&&p&&figure&&img src=&https://pic3.zhimg.com/v2-ea23b43fcd880ac2f6fc837a2704e6ff_b.jpg& data-rawwidth=&1514& data-rawheight=&468& class=&origin_image zh-lightbox-thumb& width=&1514& data-original=&https://pic3.zhimg.com/v2-ea23b43fcd880ac2f6fc837a2704e6ff_r.jpg&&&/figure&构建过程:&/p&&p&&figure&&img src=&https://pic4.zhimg.com/v2-056f557f125f04ddd79b3_b.jpg& data-rawwidth=&1503& data-rawheight=&846& class=&origin_image zh-lightbox-thumb& width=&1503& data-original=&https://pic4.zhimg.com/v2-056f557f125f04ddd79b3_r.jpg&&&/figure&可以看到已经推送成功了~&/p&&br&&p&-- &/p&&p&专栏不定期更新容器实践过程中的一些经历,欢迎关注~&/p&
这是参加Rancher 深圳站线下活动时候的一个演示项目现在贴一下整个的步骤,供大家参考~一,Git 可选的git系统如下,示例用gogsGogsGitlabGithub Gogs,Docker-Compose安装:```
version: '2'
image: gogs/gogs:0.9.113
&figure&&img src=&https://pic1.zhimg.com/v2-f4f8499ecec44bf4c3f78315dee66042_b.jpg& data-rawwidth=&400& data-rawheight=&250& class=&content_image& width=&400&&&/figure&&p&最近很多阿里内部的同学和客户私信来咨询如何学习 Docker 技术。为此,我们列了一个路线图供大家学习Docker和阿里云容器服务。这个列表包含了一些社区的优秀资料和我们的原创文章。我们会随着Docker技术的发展持续更新本文,也会在云栖社区继续贡献内容来帮助同学们快速入门或持续提高。&/p&&h3&Docker基础 101&/h3&&ol&&li&学习Docker基本概念&ul&&li&Docker容器&/li&&li&Docker镜像&ul&&li&Dockerfile初步概念&/li&&/ul&&/li&&/ul&&/li&&li&练习&ul&&li&安装Docker Toolbox或Docker Engine&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/7697& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker Toolbox 阿里云镜像源&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/7695& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker Engine 阿里云镜像源&/a&&/li&&/ul&&/li&&li&配置本地Docker环境&ul&&li&利用Docker Machine创建本地Docker Environment&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/29941& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&配置阿里云Docker镜像加速器&/a&&/li&&/ul&&/li&&li&管理容器的生命周期与配置&ul&&li&创建、删除、检查、启动、停止容器 ...&/li&&li&环境变量&/li&&li&端口配置&/li&&/ul&&/li&&li&学习端口映射和容器链接&/li&&li&学习利用volume保存持久化容器数据&/li&&li&学习检查容器日志&ul&&li&docker logs&/li&&/ul&&/li&&li&学习监控容器内部进程状态&ul&&li&docker top 与 docker stats&/li&&/ul&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/59144& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&故障排查&/a&&/li&&/ul&&/li&&li&练习构建容器镜像,与镜像管理&ul&&li&构建Docker镜像&ul&&li&构建一个long run的docker应用&/li&&/ul&&/li&&li&使用&a href=&https://link.zhihu.com/?target=https%3A//dev.aliyun.com/search.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阿里云镜像管理服务&/a&&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/30354& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&基于阿里云Code的仓库自动构建Docker镜像&/a&&/li&&/ul&&/li&&/ul&&/li&&/ol&&h3&容器编排基础 101&/h3&&ol&&li&学习Docker Compose基本概念&ul&&li&编排模板 template&ul&&li&服务定义 service&/li&&/ul&&/li&&li&应用项目 project&br&&/li&&/ul&&/li&&li&练习&ul&&li&利用 docker compose 管理应用项目生命周期&ul&&li&创建、删除、检查、启动、停止容器 ...&/li&&li&更新&/li&&li&Scale&/li&&/ul&&/li&&li&利用 docker compose 构建镜像&/li&&/ul&&/li&&/ol&&h3&阿里云容器服务基础 101&/h3&&ol&&li&学习基本概念: &a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/3067& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阿里云容器服务简介&/a&&ul&&li&集群,节点&/li&&li&编排模板, 应用项目&/li&&/ul&&/li&&li&练习&ul&&li&创建管理集群&/li&&li&部署应用&ul&&li&部署一个docker镜像&/li&&li&部署一个docker compose模板&/li&&/ul&&/li&&li&容器应用生命周期&ul&&li&启动、停止&/li&&li&变更配置&/li&&li&伸缩&/li&&/ul&&/li&&li&基本管控&ul&&li&查看容器日志&/li&&li&查看容器监控信息&/li&&li&查看节点监控信息&/li&&li&查看应用操作日志&/li&&/ul&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//help.aliyun.com/document_detail/25983.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&通过Docker客户端连接集群&/a&&/li&&li&实现最简单持续交付&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/31767& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深圳云栖大会Workshop - 阿里容器服务与持续交付&/a&&/li&&/ul&&/li&&/ul&&/li&&/ol&&h3&软件开发者Docker基础 101&/h3&&ul&&li&Java 开发者&ul&&li&Tomcat: &a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/6894& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&使用Docker运行Java Web应用&/a&&/li&&li&SpringBoot: &a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/2930& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&在阿里云容器服务上创建一个spring boot应用&/a&&/li&&/ul&&/li&&li&Python 开发者&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/2914& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&在阿里云容器服务上创建一个使用Redis的Python应用-博客-云栖社区-阿里云&/a&&/li&&/ul&&/li&&li&NodeJS 开发者&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/2722& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&利用Docker和阿里云容器服务部署高可用Ghost博客集群-博客-云栖社区-阿里云&/a&&/li&&/ul&&/li&&li&.Net 开发者&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/2780& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&基于阿里云容器服务用docker容器运行ASP.NET 5示例程序&/a&&/li&&/ul&&/li&&/ul&&h3&Docker进阶 201&/h3&&ul&&li&Docker镜像优化&ul&&li&&a href=&https://link.zhihu.com/?target=http%3A//dockone.io/article/255& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Dockerfile之优化经验浅谈&/a&&/li&&/ul&&/li&&li&Docker网络&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/30345& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&翻译 理解Docker容器网络&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/30328& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&学习Docker容器网络模型 - 搭建分布式Zookeeper集群&/a&&/li&&/ul&&/li&&li&Docker存储&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/53990& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&谈谈 Docker Volume 之权限管理(一)&/a&&/li&&/ul&&/li&&li&进程管理知识&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/5545& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&理解Docker容器的进程管理&/a&&/li&&/ul&&/li&&li&Docker安全&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/30349& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&学习Docker的User Namespace&/a&&/li&&/ul&&/li&&li&Docker Machine云端创建执行环境&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/6809& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阿里云ECS Docker Machine Driver入门指南&/a&&/li&&/ul&&/li&&li&搭建私有Docker Registry&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/7585& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&基于OSS搭建Docker镜像仓库,并支持跨区域部署的分布式复制&/a&&/li&&/ul&&/li&&li&Docker Compose进阶&ul&&li&利用Compose V2模板支持容器、网络、存储的编排&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//help.aliyun.com/document_detail/26086.html%23%25E5%258F%%E6%259B%25BF%25E6%258D%25A2& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&变量替换&/a&&/li&&/ul&&/li&&li&Docker内置编排实现 Swarm Mode进阶&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/55973& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&在阿里云上体验Docker 1.12内置的编排能力&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/57576& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&在阿里云上体验Docker 1.12的路由能力和容器应用分发部署&/a&&/li&&/ul&&/li&&li&使用Windows容器&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/62375& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker的Windows容器初体验&/a&&/li&&/ul&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/69444& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker 1.13 编排能力进化&/a&&/li&&/ul&&h3&阿里云容器服务进阶 201&/h3&&ul&&li&Docker与微服务关系:TBD&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/2764& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&微服务(Microservice)那点事&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/2985& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&当Docker遇到数据库:在阿里云容器服务中使用RDS&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/57265& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/57157& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&利用阿里云容器服务实现Docker微服务间的负载均衡和服务发现&/a&&/li&&/ul&&/li&&li&服务路由与负载均衡:&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/8800& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&在容器服务中如何暴露服务到公网并配置负载均衡&/a&&ul&&li&通过二级域名实现应用路由&/li&&li&通过自定义SLB实现服务路由&/li&&/ul&&/li&&li&服务发现&ul&&li&DNS服务发现&/li&&li&自定义服务路由:&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/6816& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&基于Docker的应用负载均衡与服务发现&/a&&/li&&/ul&&/li&&li&阿里云存储插件扩展&ul&&li&OSSFS:&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/8307& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&用OSS数据卷实现Wordpress附件共享&/a&&/li&&li&NAS:&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/52523& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&在阿里云容器服务中使用NAS(NFS)数据卷&/a&&/li&&/ul&&/li&&li&监控&ul&&li&云监控服务集成:(TBD)&/li&&li&开源监控日志服务&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/5065& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&构建自己的Docker监控框架&/a&&/li&&/ul&&/li&&li&容器应用监控:(TBD)&/li&&/ul&&/li&&li&日志&ul&&li&日志服务集成&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/9068& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&容器服务中如何收集日志到阿里云日志服务&/a&&/li&&/ul&&/li&&li&开源ELK日志服务方案&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/30344& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&基于Logspout+ELK实现docker日志自动化&/a&&/li&&/ul&&/li&&/ul&&/li&&li&容器调度&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//docs.docker.com/swarm/scheduler/filter/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker Swarm调度基本概念&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//help.aliyun.com/document_detail/26086.html%23%25E5%258A%259F%25E8%2583%25BD%25E5%25A2%259E%25E5%25BC%25BA%25E7%259A%%25A0%%25AD%25BE& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阿里云容器服务扩展&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/57143& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&节点失效后容器自动重新调度&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/59879& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&在阿里云上进行Docker应用的自动弹性伸缩&/a&&/li&&/ul&&/li&&li&持续交付进阶&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/53971& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&使用阿里云容器服务Jenkins实现持续集成和Docker镜像构建&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/32071& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阿里云持续交付平台实践&/a&&/li&&/ul&&/li&&li&网络相关&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/3031& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如何保证摘除公网EIP的容器服务VPC集群可以正常访问公网&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/2929& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&容器服务是如何做到的跨主机的容器间通信?&/a&&/li&&li&混合云方案:(TBD)&/li&&/ul&&/li&&li&Open API&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/5527& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&容器服务Open API Python SDK使用详解&/a&&/li&&/ul&&/li&&li&高可用容器集群与容器应用&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//help.aliyun.com/document_detail/26006.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&跨可用区容器集群&/a&&/li&&/ul&&/li&&li&Docker与机器学习系列&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/60601& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&上手TensorFlow&/a&&/li&&/ul&&/li&&/ul&&h3&参考资料&/h3&&p&Docker发展很快,很多要靠自己实践,结合自己的实际场景和问题操练一下。&/p&&h4&官方文档&/h4&&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//docs.docker.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&docs.docker.com&/a& - 强烈推荐&/li&&/ul&&h4&电子书&/h4&&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//www.gitbook.com/book/yeasy/docker_practice/details& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker — 从入门到实践&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//dockone.io/article/233& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker入门实战&/a&&/li&&/ul&&h4&纸质书&/h4&&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//book.douban.com/subject//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&第一本Docker书 修订版&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//book.douban.com/subject//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker容器与容器云&/a&&/li&&/ul&&h4&社区&/h4&&ul&&li&&a href=&https://link.zhihu.com/?target=http%3A//dockone.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&DockOne社区&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//yq.aliyun.com/teams/11& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&容器服务的团队博客&/a&&/li&&/ul&&h4&拓展阅读&/h4&&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/veggiemonk/awesome-docker& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-docker&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//book.douban.com/subject//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&微服务设计&/a&&/li&&/ul&&h4&备忘单&/h4&&ul&&li&&a href=&https://link.zhihu.com/?target=http%3A//dockerlux.github.io/pdf/cheat-sheet-v2.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker cheat sheet&/a&&/li&&/ul&
最近很多阿里内部的同学和客户私信来咨询如何学习 Docker 技术。为此,我们列了一个路线图供大家学习Docker和阿里云容器服务。这个列表包含了一些社区的优秀资料和我们的原创文章。我们会随着Docker技术的发展持续更新本文,也会在云栖社区继续贡献内容来帮…
&figure&&img src=&https://pic3.zhimg.com/v2-f8c6dceabe97_b.jpg& data-rawwidth=&537& data-rawheight=&691& class=&origin_image zh-lightbox-thumb& width=&537& data-original=&https://pic3.zhimg.com/v2-f8c6dceabe97_r.jpg&&&/figure&&ul&&li&&b&CPU怎么选,买INTEL还是AMD?&/b&&/li&&/ul&&p&玩对单核性能要求比较高的游戏和软件,又想要省心不愿意折腾的大佬们选择INTEL的配置是很好的方案的哦。&/p&&ul&&li&&b&为什么不买E3的CPU?&/b&&/li&&/ul&&p&在E3 1230V2
E3 1230V3和E3 1231V3的三代四代平台的时候E3跟酷酷睿系列的CPU主板是通用的,相互兼容。三代四代的E3价格也相对于I5来说贵的不多,相对于I7来说便宜的不少,主板通用不需要另外增加预算,所以当时性价比很高,是推荐入手的。&/p&&p&但是现在的CPU E3 1230 V5主板是要用X150的,而6代7代不超频的I5 I7CPU是用B150
B250的。E3 0和B150+I7+I7 7700价格相差无几,完全就没有入手的价值啦。&/p&&p&-------------------------------------------------13000+主机配置方案---------------------------------------------&/p&&figure&&img src=&https://pic4.zhimg.com/v2-54ea58bd74f995fa6e547ed3b7ef0e51_b.jpg& data-rawwidth=&534& data-rawheight=&562& class=&origin_image zh-lightbox-thumb& width=&534& data-original=&https://pic4.zhimg.com/v2-54ea58bd74f995fa6e547ed3b7ef0e51_r.jpg&&&/figure&&p&&br&&/p&&p&-----------------------------------------------主机配置方案-------------------------------------------&/p&&figure&&img src=&https://pic4.zhimg.com/v2-dab676c612c353f2976cdc_b.jpg& data-rawwidth=&469& data-rawheight=&245& class=&origin_image zh-lightbox-thumb& width=&469& data-original=&https://pic4.zhimg.com/v2-dab676c612c353f2976cdc_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-df53c050d74cd5c_b.jpg& data-rawwidth=&469& data-rawheight=&252& class=&origin_image zh-lightbox-thumb& width=&469& data-original=&https://pic3.zhimg.com/v2-df53c050d74cd5c_r.jpg&&&/figure&&p&&br&&/p&&p&-------------------------------------------左右主机配置方案-------------------------------------------&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-a563b9dbb3423edbba8d2_b.jpg& data-rawwidth=&466& data-rawheight=&785& class=&origin_image zh-lightbox-thumb& width=&466& data-original=&https://pic2.zhimg.com/v2-a563b9dbb3423edbba8d2_r.jpg&&&/figure&&p&&br&&/p&&p&------------------------------------------------7500左右主机配置方案------------------------------------------------&/p&&figure&&img src=&https://pic3.zhimg.com/v2-f5bb102a8ddac7b34ee76_b.jpg& data-rawwidth=&504& data-rawheight=&572& class=&origin_image zh-lightbox-thumb& width=&504& data-original=&https://pic3.zhimg.com/v2-f5bb102a8ddac7b34ee76_r.jpg&&&/figure&&p&&br&&/p&&p&------------------------------------------左右主机配置方案-------------------------------------------------&/p&&figure&&img src=&https://pic4.zhimg.com/v2-389f5920ced2f77ea360ccb2a329285f_b.jpg& data-rawwidth=&469& data-rawheight=&1231& class=&origin_image zh-lightbox-thumb& width=&469& data-original=&https://pic4.zhimg.com/v2-389f5920ced2f77ea360ccb2a329285f_r.jpg&&&/figure&&p&&br&&/p&&p&-------------------------------------左右主机配置方案----------------------------------------------&/p&&figure&&img src=&https://pic4.zhimg.com/v2-21627dbfa45b193efcfc1c883ed2b8f4_b.jpg& data-rawwidth=&469& data-rawheight=&1038& class=&origin_image zh-lightbox-thumb& width=&469& data-original=&https://pic4.zhimg.com/v2-21627dbfa45b193efcfc1c883ed2b8f4_r.jpg&&&/figure&&p&&br&&/p&&p&-------------------------------------左右主机配置方案----------------------------------------------&/p&&figure&&img src=&https://pic2.zhimg.com/v2-d20fb635cad7_b.jpg& data-rawwidth=&504& data-rawheight=&1256& class=&origin_image zh-lightbox-thumb& width=&504& data-original=&https://pic2.zhimg.com/v2-d20fb635cad7_r.jpg&&&/figure&&p&&br&&/p&&p&---------------------------------------4500左右主机配置方案------------------------------------------------&/p&&figure&&img src=&https://pic3.zhimg.com/v2-c495ace0d75_b.jpg& data-rawwidth=&590& data-rawheight=&865& class=&origin_image zh-lightbox-thumb& width=&590& data-original=&https://pic3.zhimg.com/v2-c495ace0d75_r.jpg&&&/figure&&p&&br&&/p&&p&------------------------------------------------左右主机配置方案------------------------------------------&/p&&figure&&img src=&https://pic1.zhimg.com/v2-acf_b.jpg& data-rawwidth=&504& data-rawheight=&1126& class=&origin_image zh-lightbox-thumb& width=&504& data-original=&https://pic1.zhimg.com/v2-acf_r.jpg&&&/figure&&p&&br&&/p&&p&------------------------------------------左右主机配置方案-------------------------------------------&/p&&figure&&img src=&https://pic1.zhimg.com/v2-31f55b5eb93f7b161adb56e_b.jpg& data-rawwidth=&495& data-rawheight=&443& class=&origin_image zh-lightbox-thumb& width=&495& data-original=&https://pic1.zhimg.com/v2-31f55b5eb93f7b161adb56e_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-27326ef7ebb2cfd936b57_b.jpg& data-rawwidth=&495& data-rawheight=&434& class=&origin_image zh-lightbox-thumb& width=&495& data-original=&https://pic4.zhimg.com/v2-27326ef7ebb2cfd936b57_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-2f67b95d5da9c8b268a3_b.jpg& data-rawwidth=&492& data-rawheight=&247& class=&origin_image zh-lightbox-thumb& width=&492& data-original=&https://pic2.zhimg.com/v2-2f67b95d5da9c8b268a3_r.jpg&&&/figure&&p&------------------------------------------左右主机配置方案-------------------------------------------&/p&&figure&&img src=&https://pic4.zhimg.com/v2-e148a297eccb6f8b088aa280f6b63f41_b.jpg& data-rawwidth=&492& data-rawheight=&1332& class=&origin_image zh-lightbox-thumb& width=&492& data-original=&https://pic4.zhimg.com/v2-e148a297eccb6f8b088aa280f6b63f41_r.jpg&&&/figure&&p&&br&&/p&&ul&&li&由于矿佬们疯狂收购显卡,供不应求,导致GTX1050/RX460及其以上显卡价格均有上涨,也经常会处于缺货状态。内存和固态也有价格上涨,下面配置单里的价格仅代表发贴当天济南本地的出货价格,供参考。&/li&&li&&b&所以想要入手电脑的各位小伙伴儿们,看好配置着急用的就抓紧入手不要拖,不急用的小伙伴儿们可以等几个月看情况再入手,也可以先入核显用着,独显后期再加&/b&(这种方案适合玩腾讯游戏和网游以及对游戏特效要求不高的玩家和平面设计以及多用于办公的人群哦)。&/li&&li&配置单里所选用型号是济南本地发贴当时现货,返修率低的硬件。如需要加钱或者减钱替换也是可以的,DIY的电脑配置并非是一成不这变的。有看好的型号可以另咨询猫猫或者群友是否兼容。&/li&&li&验证写知乎,群号&/li&&/ul&&p&aHR0cDovL3FtLnFxLmNvbS9jZ2ktYmluL3FtL3FyP2s9cDJ4RnhYRUxGQlVtTDV2ZUNsVnpOQU44ODBFOW1ILUY= (二维码自动识别)&/p&&p&&/p&
CPU怎么选,买INTEL还是AMD?玩对单核性能要求比较高的游戏和软件,又想要省心不愿意折腾的大佬们选择INTEL的配置是很好的方案的哦。为什么不买E3的CPU?在E3
1230V3和E3 1231V3的三代四代平台的时候E3跟酷酷睿系列的CPU主板是通用的,相互兼容。…
&figure&&img src=&https://pic1.zhimg.com/v2-94bfab3679bc717ed4a1_b.jpg& data-rawwidth=&1200& data-rawheight=&625& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&https://pic1.zhimg.com/v2-94bfab3679bc717ed4a1_r.jpg&&&/figure&&blockquote&&b&&i&来源:&a href=&https://link.zhihu.com/?target=http%3A//luolinfeng.com//css_module/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&一些编写css的建议 [锋子的博客]&/a&&/i&&/b&&p&&b&&i&作者:锋子&/i&&/b&&/p&&/blockquote&&p&javascripty已经走上工程化的道路了,各种mvm,mvvm框架已经让人目不暇接了,这里就不讨论js了。我来讲下我在实际工作中编写CSS的一些经验吧,当然很多人也总结过这样的经验,我说的肯定没有哪些大牛写的好,我只是简单的把自己的工作经验拿出来与大家分享下。&/p&&h2&&b&工欲善其事,必先利其器&/b&&/h2&&p&在编写css的时候,你需要至少掌握一个开发工具,无论是SASS,还是LESS,本质上来说他们一样的,只是语法有点不一样。如果你还是在纯手写css,那么请尽快了解它们,并根据自己的习惯选择其中一个并使用他们。个人而言,我比较喜欢sass,更符合我的书写习惯。也有很多人喜欢Less,他们觉得less语法更加便捷。&/p&&h3&&b&什么SASS/LESS&/b&&/h3&&p&SASS(LESS)是CSS3的一个扩展,增加了规则嵌套、变量、混合、选择器继承等等。通过使用命令行的工具或WEB框架插件把它转换成标准的、格式良好的CSS代码。&/p&&h3&&b&为什么需要SASS/LESS&/b&&/h3&&p&它们作为一个开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护。&br&它们也是编写模块化、可维护的CSS的基石。&/p&&h3&&b&该如何使用&/b&&/h3&&p&网上关于SASS/LESS的教程一大堆,我这里不浪费篇幅写基本语法了。&br&推荐几个学习他们的网址,它们都差不多,学了一个基本都可以使用了:&/p&&p&&b&SASS&/b&&/p&&ul&&li&&a href=&https://link.zhihu.com/?target=http%3A//sass.bootcss.com/docs/sass-reference/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SASS中文文档&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.ruanyifeng.com/blog/2012/06/sass.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SASS用法指南-阮一峰&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.w3cplus.com/sassguide/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SASS入门&/a&&/li&&/ul&&p&&b&LESS&/b&&/p&&ul&&li&&a href=&https://link.zhihu.com/?target=http%3A//lesscss.cn/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&LESS中文网&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.w3cplus.com/css/less& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&LESS入门&/a&&/li&&/ul&&blockquote&&p&下面的内容我用SASS举例,内容不限于SASS,LESS同样适用!&/p&&/blockquote&&h2&&b&神说,无规矩不成方圆&/b&&/h2&&p&是的,无规矩不成方圆,你需要了解一种css命名规范或者制定自己的规范(不建议自定义,不利于团队合作);&/p&&h3&&b&为什么需要有一种命名规范呢?&/b&&/h3&&p&当你编写过大量css时候,你就发现没有一种有效的命名规范会让你痛不欲生。如果你在一个稍微大一点的项目中,或者在与其他人合作开发的过程,这种感觉特别明显。因为当你为css命名的时候会发现这个命名在别的地方使用了,或者队友已经使用过了,你必须重新命名。久而久之,css的命名就会杂乱无章而且又臭又长,一眼望去根本猜不到这个命名的意义。&/p&&h3&&b&BEM命名规范&/b&&/h3&&p&各种命名规范是仁者见仁,智者见智,在这里我介绍下BEM命名规范,我介绍的不一定就是适合你的,你需要自己思考何种命名规范适合自己。。&/p&&blockquote&&p&&a href=&https://link.zhihu.com/?target=https%3A//en.bem.info/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&BEM&/a&是由Yandex团队提出的一种CSS Class 命名方法,旨在更好的创建CSS/Sass模块。&/p&&/blockquote&&p&BEM的意思就是块(block)、元素(element)、修饰符(modifier)。&/p&&ul&&li&block: 可以理解为一个区域、一个组件或者一个块级元素,具体如何区分需要根据实际情况具体分析;&/li&&li&block__element: 就是一个上面的block里面的元素,比如说导航(nav:block)里面有a标签(a: element)就是一个元素, block与element使用两个下划线链接;&/li&&li&block__element–modifier: 我的理解是状态或属性。比如element里面的a标签,它有active、hover、normal三种状态,这三种状态就是modifier。midifier是使用两个“–”中横线连接&/li&&/ul&&p&就上面所说的例子我用实际的代码来示范下:&/p&&div class=&highlight&&&pre&&code class=&language-html&&&span&&/span&&span class=&c&&&!-- HTML结构 --&&/span&
&span class=&p&&&&/span&&span class=&nt&&nav&/span& &span class=&na&&class&/span&&span class=&o&&=&/span&&span class=&s&&&nav&&/span&&span class=&p&&&&/span&
&span class=&p&&&&/span&&span class=&nt&&a&/span& &span class=&na&&href&/span&&span class=&o&&=&/span&&span class=&s&&&#&&/span& &span class=&na&&class&/span&&span class=&o&&=&/span&&span class=&s&&&nav__item nav__item--active&&/span&&span class=&p&&&&/span&当前页:active&span class=&p&&&/&/span&&span class=&nt&&a&/span&&span class=&p&&&&/span&
&span class=&p&&&&/span&&span class=&nt&&a&/span& &span class=&na&&href&/span&&span class=&o&&=&/span&&span class=&s&&&#&&/span& &span class=&na&&class&/span&&span class=&o&&=&/span&&span class=&s&&&nav__item nav__item--hover&&/span&&span class=&p&&&&/span&假设鼠标在这里要加个hover的class&span class=&p&&&/&/span&&span class=&nt&&a&/span&&span class=&p&&&&/span&
&span class=&p&&&&/span&&span class=&nt&&a&/span& &span class=&na&&href&/span&&span class=&o&&=&/span&&span class=&s&&&#&&/span& &span class=&na&&class&/span&&span class=&o&&=&/span&&span class=&s&&&nav__item nav__item--normal&&/span&&span class=&p&&&&/span&假设需要加个normar的状态&span class=&p&&&/&/span&&span class=&nt&&a&/span&&span class=&p&&&&/span&
&span class=&p&&&/&/span&&span class=&nt&&nav&/span&&span class=&p&&&&/span&
&/code&&/pre&&/div&&div class=&highlight&&&pre&&code class=&language-sass&&&span&&/span&&span class=&c1&&// SASS写法&/span&
&span class=&nc&&.nav&/span&&span class=&err&&{&/span&
&span class=&k&&&&/span&&span class=&nt&&__item&/span&&span class=&err&&{&/span&
&span class=&k&&&&/span&&span class=&nt&&--active&/span&&span class=&err&&{&/span&
&span class=&o&&&!&/span&&span class=&nt&&--&/span& &span class=&nt&&active&/span&&span class=&err&&样式&/span& &span class=&nt&&--&/span&&span class=&o&&&&/span&
&span class=&err&&}&/span&
&span class=&k&&&&/span&&span class=&nt&&--hover&/span&&span class=&err&&{&/span&
&span class=&o&&&!&/span&&span class=&nt&&--&/span& &span class=&nt&&hover&/span&&span class=&err&&样式&/span& &span class=&nt&&--&/span&&span class=&o&&&&/span&
&span class=&err&&}&/span&
&span class=&k&&&&/span&&span class=&nt&&--normal&/span&&span class=&err&&{&/span&
&span class=&o&&&!&/span&&span class=&nt&&--&/span& &span class=&nt&&normal&/span&&span class=&err&&样式&/span& &span class=&nt&&--&/span&&span class=&o&&&&/span&
&span class=&err&&}&/span&
&span class=&err&&}&/span&
&span class=&err&&}&/span&
&/code&&/pre&&/div&&div class=&highlight&&&pre&&code class=&language-css&&&span&&/span&&span class=&c&&/* 编译后的css */&/span&
&span class=&nc&&.nav&/span&&span class=&p&&{&/span& &span class=&p&&}&/span&
&span class=&nc&&.nav__item&/span&&span class=&p&&{&/span& &span class=&p&&}&/span&
&span class=&nc&&.nav__item--active&/span&&span class=&p&&{&/span& &span class=&p&&}&/span&
&span class=&nc&&.nav__item--hover&/span&&span class=&p&&{&/span& &span class=&p&&}&/span&
&span class=&nc&&.nav__item--normal&/span&&span class=&p&&{&/span& &span class=&p&&}&/span&
&/code&&/pre&&/div&&p&从上面的例子可以一眼看出css的含义,而且编译后的css没有任何的嵌套,但是SASS的结构却很清晰,一目了然。&/p&&p&由此可见,使用SASS配合BEM可以写出一份易读、可维护、模块化的代码;&/p&&h2&&b&神说,我不认识你&/b&&/h2&&p&一份可读性的SASS必须有一份说明,一个文件,一个函数都需要一份说明。&/p&&p&对于一份SASS文件,你至少需要说明两点,这份SASS是公用还是私有、哪个页面哪个部分&/p&&div class=&highlight&&&pre&&code class=&language-css&&&span&&/span&&span class=&k&&@charset&/span& &span class=&s2&&&utf-8&&/span&
&span class=&c&&/*&/span&
&span class=&c&&* 预定义函数&/span&
&span class=&c&&* author:xxx&/span&
&span class=&c&&* time:xxxx-xx-xx&/span&
&span class=&c&&*/&/span&
&span class=&c&&/*&/span&
&span class=&c&&* 清除浮动&/span&
&span class=&c&&* use: @include clearfix();&/span&
&span class=&c&&* author: xxx&/span&
&span class=&c&&* time: xxxx-xx-xx&/span&
&span class=&c&&*/&/span&
&span class=&k&&@mixin&/span& &span class=&nt&&clearfix&/span&&span class=&o&&()&/span&&span class=&p&&{&/span&
&span class=&o&&*&/span&&span class=&nt&&zoom&/span&&span class=&o&&:&/span& &span class=&nt&&1&/span&&span class=&o&&;&/span&
&span class=&o&&&&/span&&span class=&nd&&:before&/span&&span class=&o&&,&/span&
&span class=&o&&&&/span&&span class=&nd&&:after&/span& &span class=&p&&{&/span&
&span class=&nb&&content&/span&&span class=&o&&:&/span& &span class=&s2&&&&&/span&&span class=&p&&;&/span&
&span class=&nb&&display&/span&&span class=&o&&:&/span& &span class=&n&&table&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&o&&&&/span&&span class=&nd&&:after&/span& &span class=&p&&{&/span&
&span class=&nb&&clear&/span&&span class=&o&&:&/span& &span class=&nb&&both&/span&&span class=&p&&;&/span&
&span class=&nb&&overflow&/span&&span class=&o&&:&/span& &span class=&nb&&hidden&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&h2&&b&神说,世界要统一&/b&&/h2&&ul&&li&reset&/li&&/ul&&p&css reset必不可少,网上有很多css reset的代码,compass也有reset的module,只需要@import “compass/reset”。如果你觉得这些代码太冗余,太多,你至少需要保证你的css有margin和padding的reset,这样才可以保证在各个浏览器中css有相同的样式。&/p&&div class=&highlight&&&pre&&code class=&language-css&&&span&&/span&&span class=&o&&*&/span&&span class=&p&&{&/span&
&span class=&nb&&margin&/span&&span class=&o&&:&/span& &span class=&m&&0&/span&&span class=&p&&;&/span&
&span class=&nb&&padding&/span&&span class=&o&&:&/span& &span class=&m&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&ul&&li&border-box&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-css&&&span&&/span&&span class=&o&&*&/span&&span class=&p&&{&/span&
&span class=&n&&box&/span&&span class=&o&&-&/span&&span class=&n&&sizing&/span&&span class=&o&&:&/span& &span class=&nb&&border&/span&&span class=&o&&-&/span&&span class=&n&&box&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&建议border-box,更好的计算box宽高。&/p&&h2&&b&神说,要有variables(变量)&/b&&/h2&&p&一份可维护的SASS,首先需要有一份variables,这是提高开发效率基础,也是确保页面一致性的基石。&/p&&h3&&b&什么是variables&/b&&/h3&&p&variables就是说你需要在编写SASS前定义一份变量表,将项目需要用到的一些基本的样式通过变量保存起来。&/p&&p&举个例子来说:&/p&&p&你拿到一个项目的设计稿,在编写CSS之前,你需要快速浏览设计稿,找出其中相同的元素(没有必要很详细,先将视线能分辨的元素用变量保存起来,其他的可以在以后使用的再添加)。&/p&&p&那么问题又来了,什么是相同元素呢?&/p&&ul&&li&间距/行距/边距&/li&&li&字号&/li&&li&颜色&/li&&li&层级&/li&&li&高度&/li&&li&……&/li&&/ul&&h3&&b&为什么需要variables&/b&&/h3&&p&使用一份单独的variables,好处很多,最大的好久就是可维护性,谁用谁知道!&/p&&h4&&b&可维护性&/b&&/h4&&ul&&li&等你开发完了,拿给设计师验收,设计师说这里不好,换个颜色!—— 没事,我改个变量!&/li&&li&产品说,这里不好,列表间距太大了,小屏幕只显示那么一点点!—— 没事,我改个变量!&/li&&li&来来来,产品说我们换一套皮肤! —— 没事,我重新定义一份变量!&/li&&li&……&/li&&/ul&&p&这些例子可以让你明白有一份variables是多么重要了吧。其实这些只是在可维护方面的好处。作为一名前端,我们是最接近用户的工程师,我们不能仅仅停留在代码层面,更需要的是站在用户体验的角度思考问题,而variables可以让我们有一套规范,确保页面一致性。&/p&&h4&&b&一致性&/b&&/h4&&p&FE是面向用户的,我们需要对用户负责。设计师在设计页面的时候,不能所有的像素的都很精确,不可能每次的颜色都是毫无差错的。所以在这时候,就需要规范了,如果设计师没有规范,那我们自己制定一套规范。例如:&/p&&ul&&li&同一个项目,一个页面的列表高度是20px,另一个页面的列表是21px,这时我们无需理会,直接使用我们之前定义的列表高度进行开发。&/li&&li&同一个页面,有两个error的颜色#dc4c4c和#d84a4a,我们也无需理会,使用统一的error颜色变量;&/li&&/ul&&p&这些是用户体验的细节,通过一份variables可以让我们保持页面的一致性。&br&这里只是略微提下用户体验,之后我再写一篇《前端工程师必须重视的用户体验》来详细讲解下用户体验。&/p&&h2&&b&module(模块化,基于SASS/LESS)&/b&&/h2&&p&模块化在js中经常听到,对于css来说,模块化对于易读性和可维护性同样重要。那么如何来做模块化呢?&/p&&h3&&b&多文件夹&/b&&/h3&&p&建立多个文件夹,分类存放sass文件。例如:将variables、mixin、公共样式、私有样式分成多个文件夹存放;&/p&&h3&&b&多文件&/b&&/h3&&p&同一个文件夹的sass可以按模块、功能等等分成多个文件,最终用@import 导入&/p&&p&这样说的有点粗糙,我举个例子吧(下划线开头的sass文件不会编译单独css文件)&/p&&div class=&highlight&&&pre&&code class=&language-sass&&&span&&/span&&span class=&err&&——&/span&&span class=&nt&&sass&/span&
&span class=&err&&——&/span&&span class=&nt&&config&/span&
&span class=&o&&//&/span&&span class=&err&&基本变量&/span&
&span class=&err&&——&/span&&span class=&nt&&mixin&/span&
&span class=&o&&//&/span&&span class=&err&&函数&/span&
&span class=&err&&——&/span&&span class=&nt&&common&/span&
&span class=&o&&//&/span&&span class=&err&&公用&/span&
&span class=&err&&——&/span&&span class=&nt&&header&/span&
&span class=&err&&——&/span&&span class=&nt&&aside&/span&
&span class=&err&&——&/span&&span class=&nt&&_list&/span&&span class=&nc&&.scss&/span&
&span class=&err&&——&/span&&span class=&nt&&_nav&/span&&span class=&nc&&.scss&/span&
&span class=&err&&——&/span&&span class=&nt&&_base&/span&&span class=&nc&&.scss&/span&
&span class=&err&&——&/span&&span class=&nt&&compoment&/span&
&span class=&o&&//&/span&&span class=&err&&组件样式&/span&
&span class=&err&&——&/span&&span class=&nt&&dropdown&/span&
&span class=&err&&——&/span&&span class=&nt&&lightbox&/span&
&span class=&err&&——&/span&&span class=&nt&&page&/span&
&span class=&err&&——&/span&&span class=&nt&&index&/span&
&span class=&o&&//&/span&&span class=&err&&首页&/span&
&span class=&err&&——&/span&&span class=&nt&&_ad&/span&&span class=&nc&&.scss&/span&
&span class=&o&&//&/span&&span class=&err&&广告样式&/span&
&span class=&err&&——&/span&&span class=&nt&&_content&/span&&span class=&nc&&.scss&/span&
&span class=&o&&//&/span&&span class=&err&&内容信息&/span&
&span class=&err&&——&/span&&span class=&nt&&_info&/span&&span class=&nc&&.scss&/span&
&span class=&o&&//&/span&&span class=&err&&个人信息样式&/span&
&span class=&err&&——&/span&&span class=&nt&&_base&/span&&span class=&nc&&.scss&/span&
&span class=&o&&//&/span&&span class=&nt&&index&/span&&span class=&err&&样式,&/span&&span class=&o&&@&/span&&span class=&nt&&import&/span& &span class=&s1&&'&/span&&span class=&s2&&ad'&/span&&span class=&o&&;@&/span&&span class=&nt&&import&/span& &span class=&s1&&'&/span&&span class=&s2&&content'&/span&&span class=&o&&;@&/span&&span class=&nt&&import&/span& &span class=&s1&&'&/span&&span class=&s2&&info'&/span&&span class=&o&&;&/span&
&span class=&err&&——&/span&&span class=&nt&&write&/span&
&span class=&err&&——&/span&&span class=&nt&&preview&/span&
&span class=&err&&——&/span&&span class=&nt&&_aside&/span&&span class=&nc&&.scss&/span&
&span class=&o&&//&/span&&span class=&nt&&preview&/span&&span class=&err&&页面独有侧边栏&/span&
&span class=&err&&——&/span&&span class=&nt&&about&/span&
&span class=&err&&——&/span&&span class=&nt&&main&/span&&span class=&nc&&.scss&/span&
&span class=&o&&//&/span&&span class=&err&&导入所需要的样式,最终生成一个&/span&&span class=&nt&&main&/span&&span class=&nc&&.css&/span&
&/code&&/pre&&/div&&p&如上面所示的目录结构,能让人一目了然sass的目录的结构,维护的时候可以快速准确的找到文件。&br&如果是多页面的项目,也可以最大限度复用代码,而且可以导出公用样式,利用缓存提高加载速度,不用每个页面都重复写一样的代码。&/p&&blockquote&&p&注意:common文件夹的公共样式必须是其他页面所共有的样式,如果有些页面有特殊的样式,应该将会覆盖的css抽取出来,在页面中分别导入不同的私有样式。&/p&&/blockquote&&h3&&b&根据命名规则限定使用样式&/b&&/h3&&p&比如说preview页面有一个私有aside样式,可以在这样写preview里面的_aside.scss:&/p&&div class=&highlight&&&pre&&code class=&language-css&&&span&&/span&&span class=&k&&@charset&/span& &span class=&s2&&&utf-8&&/span&
&span class=&c&&/*&/span&
&span class=&c&&* 预览页面侧边栏&/span&
&span class=&c&&* author:xxx&/span&
&span class=&c&&* time:xxxx-xx-xx&/span&
&span class=&c&&*/&/span&
&span class=&k&&@import&/span& &span class=&s1&&'../../common/aside/base'&/span&
&span class=&nc&&.preview&/span&&span class=&p&&{&/span&
&span class=&nc&&.aside&/span&&span class=&p&&{&/span&
&span class=&c&&/* css */&/span&
&span class=&o&&&&/span&&span class=&n&&__item&/span&&span class=&err&&{&/span&
&span class=&c&&/* css */&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&err&&}&/span&
&/code&&/pre&&/div&&p&这里需要注意的是,css覆盖会导致重新渲染,影响性能。&br&&/p&&p&—————————————————————————————————————————&/p&&p&在学习过程如果有任何疑问,请来极乐网(&a href=&https://link.zhihu.com/?target=http%3A//www.dreawer.com& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&dreawer.com&/span&&span class=&invisible&&&/span&&/a&)提问,或者扫描下方二维码,关注极乐官方微信,在平台下方留言。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-9acba0ed93f79df845880_b.jpg& data-rawwidth=&640& data-rawheight=&320& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/v2-9acba0ed93f79df845880_r.jpg&&&/figure&
来源:作者:锋子javascripty已经走上工程化的道路了,各种mvm,mvvm框架已经让人目不暇接了,这里就不讨论js了。我来讲下我在实际工作中编写CSS的一些经验吧,当然很多人也总结过这样的经验,我说的肯定没有哪些大牛写的好…
做为一名从切页面转到写js的前端开发工程师,看到这道题目非常有感触啊。&br&&br&先感性说一下,我还记得我第一年工作的时候,写css和html的时候听很high的歌,但是写js的时候,是绝对不敢听歌的。&br&&br&再理性的说一下,我记得我当时的页面兼容程度是ie678和firefox,恩。。没错,那时候还没有chrome。。&br&&br&盒模型什么的概念我也是几年前才知道的,我还记得我当时面试时,前端要求必须会div+css页面布局。&br&&br&你看的没错,当时很多网站都是table布局的。。很多人对div这个概念都不太理解,更别说什么双飞翼,圣杯布局,9/12宫格了。&br&&br&恩。。但是我记得我巅峰时期可以一口气切出兼容4个浏览器的页面,基本是一气呵成,不需要再单独调试,基本上是连着hack一起写完的。&br&&br&要说现在达到什么水平才行,我总结几条吧,也不知道算不算落伍。&br&&br&1,盒模型概念一定清楚,知道自己想要的布局到底该写多宽多高。&br&2,渲染模式要分清楚,怪异和标准,怎么转换,说白了也是盒模型表现的事。&br&3,不同浏览器的css hack怎么写,选择器的优先级弄明白怎么调整。&br&4,所有的html标签都知道语义,所有的tag attribute都知道什么含义,记住是所有,并且知道默认样式是什么,了解如何reset。&br&5,知道css3动画的所有细节,并且知道在不同浏览器下的差异,知道css media query和flex的细节和一些比例单位如em,rem,vm等用法,并且知道怎么用于实际的自适应布局。&br&6,知道如何做css性能优化和oocss,以及如何写出模块化的css。&br&7,知道不同浏览器的差异属性并且知道如何绕过不使用这些属性。&br&8,各种垂直居中的写法,相对,绝对,fixed还有float的各种用法。&br&9,对齐,各种垂直对齐,文本,图片,行内元素和块级元素等。&br&10,给你一份psd设计稿,写完css和html,去掉css,能保证页面不乱,依然按照语义可以默认样式正常显示文档。&br&11,对seo有了解,知道怎么让显示和文案同时存在页面,了解css icon fonts,svg,雪碧图等原理和用法。&br&12,写过简单的js,知道如何给js工程师预留结构和节点钩子,不随意使用id属性来做样式渲染。&br&&br&暂时想到这么多,感觉算是一个基础的标准,这些都有所了解后再去学习js可能会更事半功倍。别人想到可以一起评论补充~,我很久不写css和html了。。。-。-
做为一名从切页面转到写js的前端开发工程师,看到这道题目非常有感触啊。 先感性说一下,我还记得我第一年工作的时候,写css和html的时候听很high的歌,但是写js的时候,是绝对不敢听歌的。 再理性的说一下,我记得我当时的页面兼容程度是ie678和firefox,…
没人邀请,看到这个问题不错,路过怒答。(多图预警)&br&&br&前百度工程师,曾负责百度 &a href=&//link.zhihu.com/?target=http%3A//fis.baidu.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&前端集成解决方案&/a& 的核心设计与开发工作。我现在称这个领域为【前端工程】。没错,这是我最爱唠叨的问题域。&br&&br&这是一个非常有趣的 &u&&b&非主流前端领域&/b&&/u&,这个领域要探索的是如何用工程手段解决前端开发和部署优化的综合问题,入行到现在一直在学习和实践中。&br&&br&在我的印象中,facebook是这个领域的鼻祖,有兴趣、有梯子的同学可以去看看facebook的页面源代码,体会一下什么叫工程化。&br&&br&接下来,我想从原理展开讲述,多图,较长,希望能有耐心看完。&br&&br&&br&---------------------------- 我是一条分割线 ----------------------------&br&&br&&figure&&img src=&https://pic2.zhimg.com/07c2bdef6ccef3ada425d61e3062dd09_b.jpg& data-rawwidth=&389& data-rawheight=&238& class=&content_image& width=&389&&&/figure&&br&&br&让我们返璞归真,从原始的前端开发讲起。上图是一个“可爱”的index.html页面和它的样式文件a.css,用文本编辑器写代码,无需编译,本地预览,确认OK,丢到服务器,等待用户访问。前端就是这么简单,好好玩啊,门槛好低啊,分分钟学会有木有!&br&&br&&figure&&img src=&https://pic1.zhimg.com/d53b504bbc9f1887eddf06d_b.jpg& data-rawwidth=&400& data-rawheight=&98& class=&content_image& width=&400&&&/figure&&br&&br&然后我们访问页面,看到效果,再查看一下网络请求,200!不错,太(TM)完美了!那么,研发完成。。。。了么?&br&&br&等等,这还没完呢!对于大公司来说,那些变态的访问量和性能指标,将会让前端一点也不“好玩”。&br&&br&看看那个a.css的请求吧,如果每次用户访问页面都要加载,是不是很影响性能,很浪费带宽啊,我们希望最好这样:&br&&br&&figure&&img src=&https://pic1.zhimg.com/6a8ca252211cec85a31ac4_b.jpg& data-rawwidth=&401& data-rawheight=&98& class=&content_image& width=&401&&&/figure&&br&利用304,让浏览器使用本地缓存。但,这样也就够了吗?不成!304叫协商缓存,这玩意还是要和服务器通信一次,我们的优化级别是变态级,所以必须彻底灭掉这个请求,变成这样:&br&&br&&figure&&img src=&https://pic3.zhimg.com/fd74ab2bf02d79dd7aff180e_b.jpg& data-rawwidth=&400& data-rawheight=&98& class=&content_image& width=&400&&&/figure&&br&强制浏览器使用本地缓存(cache-control/expires),不要和服务器通信。好了,请求方面的优化已经达到变态级别,那问题来了:你都不让浏览器发资源请求了,这缓存咋更新?&br&&br&很好,相信有人想到了办法:&b&&u&通过更新页面中引用的资源路径,让浏览器主动放弃缓存,加载新资源&/u&&/b&。好像这样:&br&&br&&figure&&img src=&https://pic2.zhimg.com/8ad1ade55f5_b.jpg& data-rawwidth=&304& data-rawheight=&110& class=&content_image& width=&304&&&/figure&&br&下次上线,把链接地址改成新的版本,就更新资源了不是。OK,问题解决了么?!当然没有!大公司的变态又来了,思考这种情况:&br&&br&&figure&&img src=&https://pic1.zhimg.com/7dc885bf_b.jpg& data-rawwidth=&579& data-rawheight=&310& class=&origin_image zh-lightbox-thumb& width=&579& data-original=&https://pic1.zhimg.com/7dc885bf_r.jpg&&&/figure&&br&页面引用了3个css,而某次上线只改了其中的a.css,如果所有链接都更新版本,就会导致b.css,c.css的缓存也失效,那岂不是又有浪费了?!&br&&br&重新开启变态模式,我们不难发现,要解决这种问题,必须让url的修改与文件内容关联,也就是说,只有文件内容变化,才会导致相应url的变更,从而实现文件级别的精确缓存控制。&br&&br&什么东西与文件内容相关呢?我们会很自然的联想到利用 &a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&数据摘要要算法&/a& 对文件求摘要信息,摘要信息与文件内容一一对应,就有了一种可以精确到单个文件粒度的缓存控制依据了。好了,我们把url改成带摘要信息的:&br&&br&&figure&&img src=&https://p

我要回帖

更多关于 must return a value 的文章

 

随机推荐