模組化
含義
模組化: 模組化就是將單個檔案當成一個模組,在日常專案開發裡面我們不會將所有邏輯寫在一個檔案裡面,不管是css還是js。原因是這樣會導致單個檔案過大,無法實現複用和維護,所以我們會將檔案進行切割分離,這樣分離獨立出來的每一個檔案都是一個模組。
css的模組化
- 在css裡面,我們可以將單個公用的css檔案進行分離,在需要的css檔案裡面匯入。
- 原生css裡面我們可以使用
@import(css檔案路徑);
進行匯入。 - sass/less/stylus都有各自的匯入檔案方法,例如sass的
@import css檔案路徑;
- 所以css檔案的模組化相當於來講比較簡單,不需要匯出,只需要匯入使用css檔案。
js的模組化
- 在js裡面,原生的js不支援一個js檔案匯入另一個js檔案,我們需要將用到的js檔案按照順序利用script標籤匯入到html裡面使用。這樣檔案依次載入,必須保證嚴格的載入順序,而且檔案之前的依賴關係不能很好的展示,對於開發來說,不利於閱讀和維護。
- 所以針對於這樣的情況,很多大佬們提出了js模組化的管理機制,下面就詳細介紹四種主流的模組化機制以及程式碼演示。
- commonjs規範
- 以nodejs為代表
- 匯入
- const math = require('./math')
- 匯出
// 多個匯出 module.exports = { add: function(){ }, plus: function(){ } }
// 單個匯出 exports.add = function(){ } exports.plus = function(){ }
- esm規範
- es6提出的模組化方案
- 匯入
- 按需匯入 import {add, plus} from './math.js'
- 預設匯入 import math from './math.js'
- 匯出
// 按需匯出 const add = (a,b) => a+b const plus = (a,b) => a-b export {add, plus}
// 預設匯出 export default { add: (a,b)=> a+b, plus: (a,b) => a-b }
- AMD規範
- 以requirejs為代表
- 匯入
require(['./math'], (math)=>{ console.log(math.add(1,2)) console.log(math.plus(1,2)) })
- 匯出
define(()=>{ const add = (a,b) => a+b const plus = (a,b) => a-b return { add, plus } })
- CMD規範
- 以seajs為代表
- 匯入
define((requires)=>{ // 匯入 const math = requires('./math') console.log(math.add(2,3)) console.log(math.plus(2,3)) })
- 匯出
define((requires, exports, modules)=>{ // 匯出 const add = (a,b) => a+b const plus = (a,b) => a-b exports.add = add exports.plus = plus })
- 我們會發現js模組化不管哪一種語法,都包含匯入和匯出,所以
模組化管理就是一種話匯入和匯出。
- commonjs規範
模組化規範的區別
- esm規範是es6推出的模組化方案,目前這種方案逐漸被各大主流瀏覽器最新版本支援,是未來js在瀏覽器(客戶端)的選擇方向。
- commonjs目前主要引用範圍是基於node,目前主要適用於js服務端的模組化管理。
- AMD規範和CMD規範都是在es6模組化出現之前讓瀏覽器(客戶端)支援模組化的方案,兩種的區別主要體現在載入依賴的時機不一樣。
- AMD推崇的是依賴前置,就是用到哪些依賴就提前匯入
// requirejs defined(['./math'], function(math){ // 當前模組用到了math模組,要在定義模組的時候匯入math })
- CMD推崇的是依賴就近,就是什麼時候用到什麼時候匯入
// sea.js defined(function(require){ // 當前模組用到了math模組,在需要的用的時候就近匯入 const math = require('./math') })
- 專案的原始碼地址