前端子產品化
前言
在項目開發過程中,随着功能的不斷增強,代碼量,檔案數量也急劇增加,需要把一個大函數拆成小函數,把一個大檔案拆成小檔案,把一個大功能拆成若幹個小功能。這裡很自然地就涉及到子產品化的想法:一個複雜的系統分成幾個子系統,展現在幾個小檔案在組成一個大檔案,內建強大的功能。
es5 不支援子產品化:在一個js檔案内,不能引入其他js檔案。不能通過若幹個小檔案去內建一個大檔案。
這樣就會帶來多個問題:
- 檔案的加載先後順序
- 不同的檔案内部定義的變量共享
- 變量命名沖突
- 檔案依賴複雜度增高
- 頁面載入過多依賴分不清,不利于維護
子產品化
什麼是子產品化
:
項目中一些程式代碼經常被其他業務場景使用,為了避免重複開發,就把這些代碼設定為共享模式,共享模式就是子產品化。像jquery、axios、vue等等都是子產品化的展現,需要的時候直接拿過來用即可 。
一個js檔案中可以引入其他的js檔案,能使用引入js檔案中的變量、資料,這種特性就稱為子產品化。使用子產品化開發可以很好的解決變量、函數名沖突問題,也能靈活的解決檔案依賴問題。
子產品化技術有哪些
:
CommonJs、ES6、AMD、CMD子產品化介紹
- es5 不支援子產品化。為了支援子產品化,一般會借用第三方庫來實作:
- sea.js
- require.js
- es6 原生文法支援子產品化。
- ES6 子產品化 是2015年官方正式出品的,已經被納入到JavaScript标準裡邊,也是js未來的标準。由于各種原因 nodejs和浏覽器中現在還不能直接使用ES6子產品化,要相信未來可以。
- Nodejs 内部支援CommonJS子產品化。
- CommonJS子產品化 是2009年釋出的,是民間出品的,相對不正規,可以在nodejs中應用
// 導出 module.exports = 對象 // 或者 exports = 對象 // 導入 var obj = require(子產品檔案)
- CommonJS子產品化 是2009年釋出的,是民間出品的,相對不正規,可以在nodejs中應用
- AMD
- Asynchronous Module Definition 異步子產品定義
- 2009年誕生,可以實作浏覽器中應用子產品化技術。
- CMD
- Common Module Definition 通用子產品定義
- 2011年誕生,阿裡公司出品,可以實作浏覽器中應用子產品化技術。
各個子產品化應用場景
:
- commonjs子產品化可以應用在nodejs中,浏覽器中不可以。
- es6子產品化暫時還不能在nodejs 和 浏覽器 中使用,要相信未來可以。
- 浏覽器中可以運作的子產品化名稱為 AMD 和 CMD。
CommonJS 子產品化規範
在node中,一個js檔案就是一個子產品。每一個js檔案中的js代碼都獨立運作在一個函數中,而不是全局作用域,是以一個子產品中的變量和函數在其他子產品内無法被通路,是以要向外部暴露變量和方法。
- 通過 module.exports 或 exports 對外暴露接口
- node 為了簡化操作,專門提供了一個變量:
等于exports
,相當于在子產品中有這麼一句代碼module.exports
var exports = module.exports
- node 為了簡化操作,專門提供了一個變量:
- 通過 require (“路徑”)函數導入子產品。
- 相對路徑必須以
或者./
開頭。../
- 使用require()引入子產品後,會傳回一個對象,這個對象代表的就是這個子產品。
- 相對路徑必須以
// utils/m1.js
module.exports.sum = function (n) {
let total = 0
for(let i = 0; i<=n; i++) {
total += i
}
return total
}
exports.x = 'nihao'
// pages/module/module.js
const m1 = require('../../utils/m1.js')
const ret = m1.sum(100)
const x = m1.x
ES6 子產品化規範
預設導出和導入
在一個js檔案中,通過一個對象把全部資料導出去,就是預設導出。
// 導出:
export default {對象}
// 一個子產品中預設導出隻能進行一次
// 預設必須導出一個對象{}
對預設導出的成員進行接收就是預設導入。
// 導入:
import 名稱 from 子產品檔案名字
子產品
:
一個js檔案就是一個子產品,前提是該檔案要有做導出export動作。
注意
:
- es6子產品化現在隻可以在VueCli項目中使用。
示意案例
:
// utils.js檔案對外部導出内容,以便被使用
// 預設導出:通過一個對象把所有的資訊都導出出去
// CommonJS: module.exports = {}
export default {
name:'kitty',
age:4,
walk:function(){
console.log('走直線')
}
}
main.js導入
// import 名稱 from '子產品js檔案路徑名'
import cat from './modules/utils.js'
console.log(cat)
按需導出和導入
一個js子產品中,定義了N多的成員資訊,根據需要,用哪個就導出哪個,這就是按需導出。
哪些成員可以做按需導出導入處理:
常量、對象 、函數 三種資訊可以做子產品化應用 (var、let等變量,用于子產品化沒有意義)
導出文法
:
export const a = 10 // 常量
export function ab(){} // 函數
export const cat = {name:'kitty',age:5} // 對象
導入文法
:
// xx,yy,zz代表被導入的成員名稱,要與導出的名稱一緻
// 成員不用全部都導入,根據需要,導入1個或多個或全部都可以
import {xx,yy,zz} from 子產品檔案
// 如果導入進來的成員名稱與目前環境名稱有沖突,根據需要可以使用as設定别名
import {xx as XX,yy as YY,zz as ZZ} from 子產品檔案
案例
:
按需導出:
// CommonJs : (module.exports.xx = yy)
export const city = 'beijing'
export function getApple(){
return '國光蘋果'
}
export const tiger = {color:'yellow and black'}
按需導入:
import {city as ct,getApple,tiger} from './modules/export.js'
console.log(ct)
getApple()
console.log(tiger)
預設和按需同時導出和導入
實際開發中,在一個子產品中 預設導出 和 按需導出會同時存在
導出文法
:
export const a = 10 // 按需導出
export function ab(){} // 按需導出
export default {對象} // 預設導出
注意
:
- 一個子產品隻能預設導出一次,按需導出可以設定多次。
- 預設導出的語句沒有擺放位置要求。
導入文法
:
// 分别導入
import 名稱 from 子產品 // 預設導入
import {xx,yy} from 子產品 // 按需導入
// 一并導入必須是 預設在"前",按需在"後"
import 名稱,{xx,yy} from 子產品