Web 最佳实践

 

前端

 

选择器

  • 尽量使用ID选择器
  • 基于Id的选择器:先使用ID选择器定位,然后再使用find方法精确查找
 
  1. // Fast:
  2. $( "#container div.robotarm" );
  3. // Super-fast:
  4. $( "#container" ).find( "div.robotarm" );
  • 指定选择的上下文
 
  1. // 劣质的代码:因为需要遍历整个DOM来找到.class
  2. $('.class');
  3. // 高品代码:因为只需在指定容器范围内进行查找
  4. $('.class', '#class-container');

这一条是否有上一条等同?

  • 多级查找:右边尽量指定得详细点而左边则尽量简单点
 
  1. // Unoptimized:
  2. $( "div.data .gonzalez" );
  3. // Optimized:
  4. $( ".data td.gonzalez" );
  • 避免冗余
 
  1. $( ".data table.attendees td.gonzalez" );
  2. // Better: Drop the middle if possible.
  3. $( ".data td.gonzalez" );
  • 不要ID与其它选择器混搭 
    ID已经表示唯一了,再加上其它选择符只会加重选择器的负担
 
  1. $('#outer #inner'); // 脏
  2. $('div#inner'); // 乱
  3. $('.outer-container #inner'); // 差
  4. $('#inner'); // 干净利落,后台只需调用document.getElementById()
  • 不要使用万能选择器
 
  1. $( ".buttons > *" ); // Extremely expensive.
  2. $( ".buttons" ).children(); // Much better.
  3. $( ".category :radio" ); // Implied universal selection.
  4. $( ".category *:radio" ); // Same thing, explicit now.
  5. $( ".category input:radio" ); // Much better.
 

Dom 操作

  • 避免DOM节点频繁流化

    样本代码

    1. $.each( myArray, function( i, item ) {
    2. var newListItem = "<li>" + item + "</li>";
    3. $( "#ballers" ).append( newListItem );
    4. });
    • 方法一: 临时detach

      1. var ballers = $("#ballers");
      2. var parent = ballers.parent();
      3. ballers.detach();
      4. $.each(myArray, function(i, item) {
      5. var newListItem = "<li>" + item + "</li>";
      6. ballers.append(newListItem);
      7. });
      8. parent.append(ballers);
      9. var table = $( "#myTable" );
      10. var parent = table.parent();
      11. table.detach();
      12. // ... add lots and lots of rows to table
      13. parent.append( table );
    • 方法二:创建临时DOM节点

      1. var frag = document.createDocumentFragment();
      2. $.each( myArray, function( i, item ) {
      3. var newListItem = document.createElement( "li" );
      4. var itemText = document.createTextNode( item );
      5. newListItem.appendChild( itemText );
      6. frag.appendChild( newListItem );
      7. });
      8. $( "#ballers" )[ 0 ].appendChild( frag );
    • 方法三:append html

      1. var myHtml = "";
      2. $.each( myArray, function( i, item ) {
      3. myHtml += "<li>" + item + "</li>";
      4. });
      5. $( "#ballers" ).html( myHtml );
  • 临时改变多个节点样式

 
  1. // Fine for up to 20 elements, slow after that:
  2. $( "a.swedberg" ).css( "color", "#0769ad" );
  3. // Much faster:
  4. $( "<style type=\"text/css\">a.swedberg { color: #0769ad }</style>")
  5. .appendTo( "head" );
  6. //预定义css类会更好
  7. // .swedberg_color{color:#0769ad}
  8. $( "a.swedberg" ).addClass("swedberg_color" );
 

CSS

 

JS 编码

  • 代码组织

    • 链式写法要换行

      1. $("#myLink")
      2. .addClass("bold")
      3. .on("click", myClickHandler)
      4. .on("mouseover", myMouseOverHandler)
      5. .show();
    • 链式写法中避免使用匿名函数,否则会严重影响代码易读性

    • 使用变量保存选择器结果方便重用

      1. //bad
      2. $("#myLink").addClass("bold");
      3. //stuff
      4. $("#myLink").on("click", myClickHandler)
      5. //better
      6. var myLink=$("#myLink").addClass("bold");
      7. //stuff
      8. myLink.on("click", myClickHandler)
    • 利用闭包保持代码整洁

      1. //bad
      2. var privateThing = "secret";
      3. var publicThing = "not secret";
      4. var changePrivateThing = function() {
      5. privateThing = "super secret";
      6. };
      7. var sayPrivateThing = function() {
      8. console.log( privateThing );
      9. changePrivateThing();
      10. };
      11. sayPrivateThing();
      12. //better
      13. var feature = (function() {
      14. // Private variables and functions
      15. var privateThing = "secret";
      16. var publicThing = "not secret";
      17. var changePrivateThing = function() {
      18. privateThing = "super secret";
      19. };
      20. var sayPrivateThing = function() {
      21. console.log( privateThing );
      22. changePrivateThing();
      23. };
      24. // Public API
      25. return {
      26. publicThing: publicThing,
      27. sayPrivateThing: sayPrivateThing
      28. };
      29. })();
      30. feature.sayPrivateThing();
  • 利用“事件冒泡”机制进行事件绑定
 
  1. //bad
  2. $('ul>li').on('click',clientHandler);
  3. //better
  4. $('ul').on('click','li',clientHandler);
  • 数组循环中不要每次循环都访问数组的长度,应该先缓存长度
 
  1. //好的写法
  2. var myLength = myArray.length;
  3. for ( var i = 0; i < myLength; i++ ) {
  4. // do stuff
  5. }
  6. //好的写法
  7. for ( var i = 0,myLength=myArray.length; i < myLength; i++ ) {
  8. // do stuff
  9. }
  10. //差的写法
  11. for ( var i = 0; i < myArray.length; i++ ) {
  12. // do stuff
  13. }
  • 其它
 
  1. //bad
  2. // 糟糕:调用了三次attr
  3. $myLink.attr("href", "#").attr("title", "my link").attr("rel", "external");
  4. //better
  5. // 不错,只调用了一次attr,css函数与此类似
  6. $myLink.attr({
  7. href: "#",
  8. title: "my link",
  9. rel: "external"
  10. });
 

参考

jQuery 优化

+
 
 

Web 前端最佳实践的更多相关文章

  1. ASP.NET Core Web API 最佳实践指南

    原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...

  2. JavaScript Web 应用最佳实践分析

    [编者按]本文作者为 Mathias Schäfer,旨在回顾在客户端大量使用JavaScript 的最佳 Web应用实践.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 对笔者来说,Jav ...

  3. 8102 年的现代 Web 开发最佳实践(笑)

    简评:8102 年了,现在 web 开发的最佳实践是什么,让本文来告诉你.原文只提到一部分,可以查看 reddit 上对此文的评论查看补充的最佳实践 https://old.reddit.com/r/ ...

  4. [转]ASP.NET Core Web API 最佳实践指南

    原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 转自 介绍# 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但 ...

  5. 前端最佳实践——DOM操作

    1.浏览器渲染原理 在讲DOM操作的最佳性能实践之前,先介绍下浏览器的基本渲染原理. 分为以下四个步骤: 解析HTML(HTML Parser) 构建DOM树(DOM Tree) 渲染树构建(Rend ...

  6. 基于springboot的web项目最佳实践

    springboot 可以说是现在做javaweb开发最火的技术,我在基于springboot搭建项目的过程中,踩过不少坑,发现整合框架时并非仅仅引入starter 那么简单. 要做到简单,易用,扩展 ...

  7. WEB开发最佳实践

    linux命令 man ls:显示ls的命令详情,man命令可以查具体的命令详情

  8. WEB前端工程师(实践)制作天气预报难度:简单

    需要准备:jQuery Bootstrap 天气预报API(本文中使用API可能会失效请灵活运用) CSS样式可以你自己去写这里只提出jQuery 请求数据和解析JSON数据 { "resu ...

  9. web前端开发最佳实践笔记

    一.文章开篇 由于最近也比较忙,一方面是忙着公司的事情,另外一方面也是忙着看书和学习,所以没有时间来和大家一起分享知识,现在好了,终于回归博客园的大家庭了,今天我打算来分享一下关于<web前端开 ...

随机推荐

  1. Android加速度传感器实现“摇一摇”,带手机振动

    由于代码有点多,所以就分开写了,注释还算详细,方便学习 Activity package com.lmw.android.test;   import android.app.Activity; im ...

  2. Codeforces 379D - New Year Letter

    原题地址:http://codeforces.com/contest/379/problem/D 题目大意:给出一种生成字符串的方法 s[k] = s[k - 2] + s[k - 1],其中加法意为 ...

  3. ADODB.Connection 错误 '800a0e7a' 未找到提供程序。该程序可能未正确安装。解决方法!

    [问题描述]调试基于ACCESS+ASP的网站程序的时候,遇到如下错误: ADODB.Connection 错误 '800a0e7a' 未找到提供程序.该程序可能未正确安装. /Inc/Functio ...

  4. BZOJ 3573 米特运输

    语文题... 原来除了hash还可以取对数啊orz #include<iostream> #include<cstdio> #include<cstring> #i ...

  5. TS数据结构分析

    1.TS包得数据结构 2. // Transport packet headertypedef struct TS_packet_header{    unsigned sync_byte       ...

  6. 【Unity3D】枪战游戏—发射子弹、射线检测

    一.子弹的碰撞检测: 因为子弹的移动速度非常的快,那么如果为子弹添加一个collider,就有可能检测不到了. 因为collider是每一帧在执行,第一帧子弹可能在100米处,那么下一帧就在900米处 ...

  7. 怎样查看Eclipse是32位还是64位

    首先进入到Eclipse的安装目录,如下图:   查找到文件名为"eclipse.ini" 文件,使用文本编辑工具,或记事本打开,如下图: 如图中的红框所示,如果是win32.x8 ...

  8. Linux Kernel 4.8分支第4个候选版本发布

    导读 今天,大神Linus Torvalds宣布了Linux 4.8分支的第四个候选版本,该候选版本在提供常规驱动更新.架构改善和部分KVM调整之外最大的新功能就是修复了英特尔Skylake电源管理B ...

  9. [Papers]NSE, $\p_3u$, Lebesgue space [Penel-Pokorny, AM, 2004]

    $$\bex \p_3\bbu\in L^p(0,T;L^q(\bbR^3)),\quad \frac{2}{p}+\frac{3}{q}=\frac{3}{2},\quad 2\leq q\leq ...

  10. [Everyday Mathematics]20150131

    在 $\bbR^4$ 中定义如下有界区域 $\Omega$: $$\bex \Omega=\sed{(x,y,z,w)\in\bbR^4;\ |x|+|y|+\sqrt{z^2+w^2}\leq 1} ...