前端規範之nodeJs 規範

小婉發表於2019-06-28

其他規範:

HTML 規範

媒體檔案規範

CSS 規範

javascript 規範

vue專案規範

縮排

統一兩個空格縮排

變數宣告

區域性變數一定要宣告,避免全域性汙染

  • 推薦使用let全面代替var,因為它建立了塊級作用域變數(變數只在程式碼塊內生效),尤其是for迴圈
  • 建議自由在邏輯上是常量的情況才使用 const,它代表常量,定的同時必須賦值

單引號

使用 string 時,用單引號替代雙引號(寫 JSON 時除外)

推薦

var foo = 'bar';

var http = require('http');
複製程式碼

不推薦:

var foo = 'bar';

var http = require('http');
複製程式碼

命名規範

  • 變數命名採用小駝峰命名,如:addUser password studentID

  • 常量命名採用單詞所有字母大寫,並用下劃線分隔,如:FORM_NAME

  • 對於物件、函式、和例項採用小駝峰(camelCase)命名法

    // 物件
    let isObject = {};
    // 函式
    function isFun(){
     ...
    };
    // 例項
    let myBbj = new Object();
    複製程式碼
  • 對於類命名或者建構函式,採用大駝峰命名 User() DateBase()

    // 類
    class Point {
      ...
    };
    
    // 建構函式
    function User(options) {
      this.name = options.name;
    }
    
    let myBbj = new User({
      name: 'yup'
    });
    複製程式碼

賦值提升

在變數作用範圍的最頂端宣告變數

全等

比較操作時必須使用全等符號,'==='和'!=='

型別轉換

  • 在宣告語句的最前端執行強制型別轉換

    // -> string:
    var totalScore = '' + this.reviewScore;
    複製程式碼
  • 使用 parseInt 來進行整數的型別轉換,並且始終提供一個基數.

    var inputValue = '4';
    var val = parseInt(inputValue, 10);
    複製程式碼

使用字面表示式

{} ,[] 代替 new Arraynew Object

Requires

  • 建議使用以下順序來組織 node 程式碼中的 require 程式碼

    1.core modules

    2.npm modules

    3.others

    var http = require('http');
    var fs = require('fs');
    var async = require('async');
    var mongoose = require('mongoose');
    var Car = require('./models/Car');
    複製程式碼
  • 引入模組時,不要加 .js 字尾

    var Batmobil = require('./models/Car');
    複製程式碼

避免魔鬼數字的出現

魔鬼數字主要指在程式碼中沒有具體含義的數字、字串。影響了程式碼可讀性,讀者看到的數字無法理解其含義,從而難以理解程式的意圖。當程式中出現的魔鬼數字過多時,程式碼的可維護性將會急劇下降,程式碼變得難以修改,並容易引入錯誤。

要求將魔鬼數字定義為常量,並增加註釋

// 介面成功返回的標識
const SUCCESS_CODE = 1;
// 介面失敗返回的標識
const FAIL_CODE = 0;
$.ajax({
  url: baseUrl + 'v1/activity/getAct',
  cache: false,
  type: 'GET',
  dataType: 'json',
  success: function(result) {
    if (result.ret === SUCCESS_CODE) {
      ...
    }else if(result.ret === FAIL_CODE){
      ...
    }
  }
});
複製程式碼

函式設計

  • 從意義上應該是一個獨立的功能模組

  • 函式名要在一定程度上反映函式的功能

  • 函式名要在一定程度上反映函式的功能

  • 當函式引數不應該在函式體內部被修改時,應加上 const 宣告

  • 避免函式有過多的引數,引數個數儘量控制在 4 個以內

  • 一個函式只做一件事,就要儘量保證抽象層級的一致性,所有語句儘量在一個粒度上。若在一個函式中處理多件事,不利於程式碼的重用

回撥函式

在回撥函式中要始終檢測錯誤,並返回錯誤

function getAnimals(done) {
  Animal.get(function(err, animals) {
    if (err) {
      // 返回錯誤
      return done(err);
    }
    // 建議回撥函式中使用描述性的引數
    return done(null, {
      dogs: animals.dogs,
      cats: animals.cats
    });
  });
}
複製程式碼

Try catch

在同步呼叫中多使用 Try catch 去捕獲錯誤,如:JSON.parse()應該使用 try-catch 語句塊

var data;
try {
  data = JSON.parse(jsonAsAString);
} catch (e) {
  //handle error - hopefully not with a console.log ;)
  console.log(e);
}
複製程式碼

建構函式

  • 在原型鏈上增加屬性,而不是覆寫原型鏈

    推薦:

    function Jedi() {
      console.log('new jedi');
    }
    
    Jedi.prototype.fight = function fight() {
      console.log('fighting');
    };
    
    Jedi.prototype.block = function block() {
      console.log('blocking');
    };
    複製程式碼

    不推薦:

    function Jedi() {
      console.log('new jedi');
    }
    
    Jedi.prototype = {
      fight: function fight() {
        console.log('fighting');
      },
    
      block: function block() {
        console.log('blocking');
      }
    };
    複製程式碼
  • 使用 class 關鍵字,並使用 extends 關鍵字來繼承

    class Queue {
      constructor(contents = []) {
        this._queue = [...contents];
      }
      pop() {
        const value = this._queue[0];
        this._queue.splice(0, 1);
        return value;
      }
    }
    
    class PeekableQueue extends Queue {
      peek() {
        return this._queue[0];
      }
    }
    複製程式碼
  • 在方法中返回 this 以方便鏈式呼叫

    推薦:

    class Jedi {
      jump() {
        this.jumping = true;
        return this;
      }
      setHeight(height) {
        this.height = height;
        return this;
      }
    }
    const luke = new Jedi();
    luke.jump()
      .setHeight(20);
    複製程式碼

    不推薦:

    Jedi.prototype.jump = function() {
      this.jumping = true;
      return true;
    };
    Jedi.prototype.setHeight = function(height) {
      this.height = height;
    };
    const luke = new Jedi();
    luke.jump(); // => true
    luke.setHeight(20); // => undefined
    複製程式碼

箭頭函式

  • 當你必須使用函式表示式(或傳遞一個匿名函式時),使用箭頭函式符號(能夠自動繫結this到父物件)

    推薦:

    [1, 2, 3].map((x) => {
      return x * x
    });
    複製程式碼

    不推薦:

    [1, 2, 3].map(function(x) {
      return x * x;
    });
    複製程式碼
  • 總是用括號包裹引數,即便只有一個引數

    推薦:

    let foo = (x) => x + 1;
    複製程式碼

    不推薦:

    let foo = x => x + 1;
    複製程式碼
  • 對於物件、類中的方法,使用增強的物件字面量

    推薦:

     let foo = {
      bar () {
        // code
      }
    }
    複製程式碼

    不推薦:

    let foo = {
      bar: () => {
        // code
      }
    };
    
    let foo = {
      bar: function() {
        // code
      }
    };
    複製程式碼

...擴充套件運算子

  • 函式引數永遠不要使用類陣列物件 arguments,使用 ... 操作符來代替

    推薦:

     function concatenateAll(...args) {
      return args.join('');
    }
    複製程式碼

    不推薦:

    function concatenateAll() {
      const args = Array.prototype.slice.call(arguments);
      return args.join('');
    }
    複製程式碼
  • 使用 ... 來拷貝陣列

    推薦:

     const itemsCopy = [...items];
    複製程式碼

    不推薦:

    const len = items.length;
    const itemsCopy = [];
    let i;
    for (i = 0; i < len; i++) {
      itemsCopy[i] = items[i];
    }
    複製程式碼

註釋

  • 使用/** ... */進行多行註釋. 請在你們加入註釋說明,指明引數和返回值的型別

    /**
     * make() returns a new element
     * based on the passed in tag name
     * @param <String> tag
     * @return <Element> element
     */
    複製程式碼
  • 使用 // 進行單行註釋. 請用一個新行來新增註釋。並在註釋行前增加一個空行

    // is current tab
    var active = true;
    
    function getType() {
      console.log('fetching type...');
      // set the default type to 'no type'
      var type = this._type || 'no type';
      return type;
    }
    複製程式碼

相關文章