後端的規範與模塊化概念

後端的規範與思想

分層

  • Web層 (接收和發送HTTP請求的,封裝;別名controller層)
  • 業務邏輯層 (別名服務層,文件常以xxxService爲名)
  • DAO層 (Date Access Object,數據訪問對象,對對象進行操做,存儲是對象轉爲數據,讀取是數據轉爲對象)
  • 持久層 (持久層,將數據長久的保存,如數據庫)

如實現一個登錄功能:
Web層: LoginController接受參數,判斷是否非法,而後傳給服務層
服務層: LoginService經過DAO層從數據庫獲取數據,拿到User和收到的數據進行比對,
DAO層: 從數據庫獲取數據並轉換爲對象
Domain: User對象實體數據庫

須要遵循單一職責原則後端

模塊化

導入導出

  • ES6支持導入和導出,ES3,5缺少相關概念
  • JS規範缺少管理機制,不一樣的庫沒有統一的下載地址
  • Nodejs的Npm包管理工具能解決這些缺陷(從中央倉庫下載)模塊化

  • node引入系統自帶模塊時,直接require模塊名便可,若是是本身的模塊,則須要帶上路徑:函數

    系統自帶的文件: require("http");
      用戶自定義文件: require("./src/index.js");
  • 想要在另外一個文件中引入當前文件的變量,則須要在本文件中將其導出:工具

    導出:module.export = a;  //若是導出多個請使用對象
      或者使用:exports a;
      引入: let a = import("./test.js");
           console.log(a)

module.export與exports

  • 若是兩者同時使用,那麼會導出module.export的值,exports會失效;
  • module.exports === exports,說明兩者最開始都是空對象且引用同一個對象




可是若是在一個模塊中同時使用兩種導出,那麼他們的所引用的地址就不一樣了:
如:最開始module.exports和exports同時指向地址0x11111
在模塊中exports=a;module.exports=b;以後,他們的引用地址就不一樣了(這裏主要是說明分開導出,即寫多個),因此其實沒法實現兩種混合導出最後導出對象擁有全部屬性的狀況。

所以,應儘可能使用module.exports而避免使用exports來導出ui

爲何能夠直接使用require等模塊?

咱們能夠直接使用rquire exports module __dirname __filename等這些非系統模塊,他們是在哪裏定義的?
這些都是屬於NodeJS的模塊,而NodeJS的模塊是運行在一個函數之中的,這個函數擁有一些參數,其中包含module等,而咱們所寫的內容在這個函數體的中間部分,大體長這樣:3d

function nodeModule(module,exports,reqiure,__filename,__dirname){
            ----------
            咱們所寫的內容
            ----------
            return module.export
    }

咱們之因此能用這些模塊,是由於被當作參數傳進來了,而且返回的是module.exports,這也就是爲何exports會失效了code

如何證實上述觀點

上面提到模塊是運行在一個函數內,且require等是被當作參數傳遞進來,那麼咱們能夠嘗試打印arguments,要知道arguments僅能在函數中起做用:對象

能夠看出5個參數分別對應:exports,require,module,__filename,__dirname,可使用arguments下標去分別驗證(如argument[1]===require)

相關文章
相關標籤/搜索