web前端开发编码规范及性能优化

代码优化

这个部分仅仅将代码优化本身,不考虑性能,关于代码部分的性能优化在 页面渲染 部分 代码优化

HTML+CSS

  • 符合 XHTML 规范: 小写,正确嵌套,必须关闭;
  • 双引号,合理缩进,utf-8编码;
  • 标签语义化,便于维护;
  • 合理注释,比如 div 关闭的地方表明配对的 div;
  • HTML,CSS,JS 分离,方便维护;
  • 避免使用 iframe, 否则会阻塞父文档 onload;
  • 样式继承,不要重复;
  • 不要乱用 href 和 onclick, 他们本质不同,href 偏向资源加载,而 onclick 仅仅是点击;其次 click 事件在 href 之前执行;
  • css伪类选择器不宜太多,防止选择器过载;
  • 不要让样式难以覆盖,少用!improtant;
  • 善于利用样式继承(注意继承和层叠是不一样的概念);
  • 不要保留过时的浏览器前缀和兼容性写法;

JavaScript

  • 标识符简短清晰,不用 1 和 0 代替 true 和 false,合理编写注释,提高代码可读性;
  • 定义变量一定写 var,以免污染全局,同时,new Function() 和 eval() 也会污染全局;
  • 长字符串用字符串链接写法,而非跨行。在兼容的情况下,用 ES6 中的多行字符串也更好;
  • 不要在 if 和 for 中定义函数,前置没有意义,破坏分支;后者易出现循环参数拖尾的情况;
  • 在此法作用域开始处声明变量,提高可读性;
  • var Name = function Name(){}; 有利于堆栈跟踪(注意变量名一致性);
  • 位运算不要大于32位;
  • 不要随意重写已有原型,可以用其实例化对象代替,实现实例继承;
  • 对象方法尽量返回 this 以便链式调用;
  • 函数的放入同名文件夹中,定义 noConflict 方法导出前一版本并返回当然版本;
  • 设计封装(类,闭包,模块)时,尽量使用严格模式;
  • 在内容为 js 的 script 标签上和内容为 css 的 link 标签上省略 type 属性和 lang 属性;
  • 注意变量名不要使用保留字和系统全局变量(方法)一样;
  • 以下行为污染全局: setTimeout 和 setInterval 的首参传入字符串; eval()函数; new Function() 构造函数。

性能优化

页面渲染

减少页面 reflow

  • 修改元素多个样式可以通过修改 className 完成,这样可以把多次 reflow 减少为一次 reflow;
  • 修改元素多个样式可以分为三步:先隐藏(display:none), 再修改,最后显示。这样可以把多次 reflow 减少为两次次 reflow;
  • 添加页面内容可以通过将所有内容写入 docuemnt fragment 元素后再一次性 append 到页面中;
  • 添加页面内容可以通过将所有内容组成长字符串,再一次性编辑 innerHTML 加入到页面中;
  • css(style 标签和 link 标签) 放在 head 中,这样浏览器在加载数据时候可以直接通过 css tree 生成 render tree, 减少不必要的重新渲染;
  • 在不影响视觉效果的情况下,尽量减少 js 动画精度;
  • div 布局优于 table 布局,因为后者中元素任意属性改名都会对整个表进行回流;

优化用户体验

  • 使用懒加载技术,保证首屏优先加载;
  • 使用异步脚步,不阻塞主页面渲染;
  • 先渲染界面,在不影响首屏情况下,使用 js 脚本动态加载后续数据;
  • 将不影响渲染的脚本后置(放在 body 之后),优先渲染;
  • 添加自定义的错误页面(如404 not found 页面);
  • 利用 GPU 加速;

代码优化

  • 图片 img 标签的 src 不要空着,以免产生多余请求;
  • href, url()和 src 中的链接,用//代替http://,/content/a.jpg代替content/a.jpg, 被替代的后者会多发送一个 http 请求;
  • 合理优化外链 css 和 JS 以利用缓存;
  • 资源控制在25kB之内,否则移动端可能无法缓存;
  • 减少不必要的 DOM 节点;
  • 十六进制颜色优于 rgb/hsl 函数,图形转换优于动画,css 动画优于 js 动画,少用 hack 写法;
  • 尽量避免 css 表达式;
  • 不要重复加载相同代码;
  • 利用事件委托减少事件定义;
  • 利用变量保存多次用到的 DOM 查询结果,减少反复查找;
  • 能用 !== 或 ===,就不要用 != 或 ==,减少不必要的隐式类型转换;
  • 尽量使用现有的函数方法,比如数组所有元素求和,直接用 reduce 方法, 再考虑用 map 方法,接着考虑 forEach 方法,然后是 for...in, 最后是 for;
  • 利用 {} 或 [] 定义对象或数组,比 new Object() 或 new Array() 效率高;
  • 避免 String 类型隐式装箱(隐式调用 new String());
  • 用 switch 代替过多的 if, 并按判断条件的可能性排序,以便尽早结束判断;
  • [].join() 动态生成字符串比字符串链接(+)性能更好;
  • nextSibling() 性能比 children 好;
  • cloneNode() 比 createElement() 效率高;
  • 考虑在页面渲染完毕以后再动态加载辅助用的外部 js 脚本;

网络通信

减少通信链接次数

  • css spirit 将多次请求变为1次请求;
  • 设置 http头的属性:connection: keep-alive,使得链接为长连接,减少频繁的握手挥手过程;
  • 设置合适的 http头的属性:expires, cache-control 和 max-age
  • 合理利用浏览器本地缓存,路由缓存,使得一些数据不需要从服务器获取;
  • 去除不必要的重定向;
  • 合并文件 如 css js脚本;
  • 保存(缓存)必要的 Ajax 请求数据;

减少数据传输距离和数据大小

  • 压缩代码;
  • 使用内容分发网络(cdn), 如 Akamai, Limelight等;
  • 使用 Gzip 压缩;
  • 使用新的图片格式或矢量图,如 .apng, .webp.svg;
  • 必要时, 减小 cookie, 以减少 http 请求中的数据量;
  • 尽量用缩写的 css 样式;
  • 合理利用服务器缓存,cdn缓存;
  • 尽量少用或不用 ETag,一般情况下 Expires 头已经够用了;

合理利用服务器资源

  • 使用负载均衡技术,如硬件技术:Alteon, F5和软件技术:Nginx, LVS;
  • 减少 DNS 查找时间(控制在20ms~100ms);
  • 设置图片服务器;
  • 增加 TTL 时长,建议为24hours(引自Steve Souders的《High Performance Web Sites》)

SEO

  • 完善 meta 标签,discription 简洁明了,keywords 清晰;
  • 重要内容不要用 js 或后端语言加载;
  • 合理利用 h标签,尤其 h1 标签,有很高权重;
  • 图片写上合理的 alt 值;
  • URI 控制在 256KB 之内;
  • 不要使用 iframe;
  • 语义化标签的使用;

综合优化

  • 用多个域名存储网站资源(减小cookie, 节约主域名连接数,突破浏览器并发限制,优化cdn缓存)
  • 使用 base64 Encode 图片,减小链接数量和传输大小。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,751评论 1 92
  • AJax 优化 缓存 Ajax 请求尽量使用GET, 仅取决于cookie数量 Cookie 优化 减少Cooki...
    KeKeMars阅读 9,354评论 5 89
  • 围绕前端的性能多如牛毛,涉及到方方面面,以我我们将围绕PC浏览器和移动端浏览器的优化策略进行罗列注意,是罗列不是展...
    流动码文阅读 676评论 0 0
  • 性能优化方向分类 请求数量: 合并脚本和样式表, CSS Sprites, 拆分初始化负载, 划分主域(使用“查找...
    Www刘阅读 1,766评论 3 8
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,085评论 25 707