如實現一個登錄功能:
Web層: LoginController接受參數,判斷是否非法,而後傳給服務層
服務層: LoginService經過DAO層從數據庫獲取數據,拿到User和收到的數據進行比對,
DAO層: 從數據庫獲取數據並轉換爲對象
Domain: User對象實體數據庫
須要遵循單一職責原則後端
Nodejs的Npm包管理工具能解決這些缺陷(從中央倉庫下載)模塊化
node引入系統自帶模塊時,直接require模塊名便可,若是是本身的模塊,則須要帶上路徑:函數
系統自帶的文件: require("http"); 用戶自定義文件: require("./src/index.js");
想要在另外一個文件中引入當前文件的變量,則須要在本文件中將其導出:工具
導出:module.export = a; //若是導出多個請使用對象 或者使用:exports a; 引入: let a = import("./test.js"); console.log(a)
所以,應儘可能使用module.exports而避免使用exports來導出ui
咱們能夠直接使用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)