9.Vue之webpack打包基礎—模組化思維
主要內容:
1. 什麼是模組化思維?
2. ES6包的封裝思想
一、什麼是模組化思維呢?
現實工作中, 一個項目可能會有多個人同時開發. 然後, 將所有人開發的內容, 合併到一個文件中. 比如:
1. 有3三個人同時開發, 一個人一個js文件, 最後引入到main.js
2. 每個人單獨寫, 這樣, 定義的變數可能會重名, 那麼在main.js中取值賦值就可能會出現問題
如何解決這個問題呢? 我們使用了閉包的寫法. 然後給閉包設置一個返回值. 這樣相互之間就彼此隔離開了. 來看下面的一個案例.
張三開發的js腳本aaa.js
let module1 = (function(){ let name = "張三" let flag = true function add() { console.log("這是aaa裡面的add方法") } let p = { flag: flag, name: name } return p })()
張三定義了兩個變數: flag和name, 並最終作為一個對象返回了
李四開發的腳本bbb.js
let module2 = (function(){ let flag = false let use = "我是use" function enable() { console.log("bbb裡面的enable函數") } let phone = { flag: flag, use: use } return phone; })()
李四在腳本中也定義了兩個變數 flag和use. 並最終作為一個對象返回
張三, 李四都定義了一個相同的變數flag
最終,項目完成了, 要將二者合併, 我們將其合併到總頁面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="aaa.js"></script> <script src="bbb.js"></script> 在這裡就相當於導入 <script> console.log(module1.flag) console.log(module2.flag) </script> </head> <body> </body> </html>
我們在引入變數的時候, 分別使用別名, 兩個就不會衝突了.
之所以能夠讓兩個js腳本相互隔離, 是閉包的在起作用. 閉包就是一個簡單地模組化思維的雛形. 他將每個人開發的東西進行了模組化封裝.
二. ES6包的封裝思想
隨著項目的越來越複雜, 也形成了很多包, 用來封裝模組. 常用的用commonJs, ES6等
下面, 我們重點來看看ES6是如何進行模組化封裝的.
其實上面的案例, 我們可以理解為將閉包裡面定義的內容進行導出, 然後在在文件中進行導入. ES6中也是同樣的導入導出的思想
使用ES定義文件有三步
- 第一步: 引入js到主文件
- 第二步: 導出
- 第三步: 導入
1. 引入js文件
我們已經將文件定義好了, 那麼如何引入呢?
在ES6中,引入的js文件, 需要將其type設置為module, 這樣告訴瀏覽器, 我是用的是ES6的語法.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- 1. 第一步: 引入js類的時候, 標記為type="module" --> <script src="main.js" type="module"></script> </head> <body> </body> </html>
注意: 這裡一定要寫type=module, 否則瀏覽器不知道這是ES6的語法
2. 導出
1) 導出變數
在ES6中,導出文件使用export {變數1, 變數2, 變數3……}
導出變數的方式有兩種:
第一種: 定義變數, 直接導出
第一種: export let name;
例:
// 導出變數---方法一 export let addr = "北京市"
第二種; 先定義變數, 後導出
第二種:
let name....;
export{name}
例:
let name = "張三" let age = 14 let sex = "男" function run() { console.log(name, "在跑步") } // 導出變數---方法二 export {name, age, sex}
2) 導出函數
導出函數也有兩種方法
第一種; 先定義, 在導出
第二種; 直接定義 + 導出
let name = "張三" let age = 14 let sex = "男" function run() { console.log(name, "在跑步") } // 導出函數---方法一 export {run} //導出函數--方法二 export function eat() { console.log(name, "在吃飯") }
3) 導出對象
導出對象, 通常是先定義對象, 然後將其導出.
class Person { type="白種人" run() { return "跑起來" } } // 導出對象 export {Person}
4) 導出默認值
導出默認值的含義是, 將這個屬性設置為默認的導出, 然後可以在導入的位置為其設置別名
// 導出默認方法 let def = "默認的方法" export default def
3. 導入
導出的方法主要有兩種, 那麼導入呢?
導入的語法是:
import {變數1, 變數2} from "文件path"
1) 按照變數名導入
-
導入單個變數
比如剛剛導出的aaa
// 導出變數---方法一 export let addr = "北京市"
我們如何導入呢?
import {addr} from "./aaa.js"
-
多個變數導入
比如我們導出的如下程式碼
let name = "張三" let age = 14 let sex = "男" function run() { console.log(name, "在跑步") } // 導出變數---方法二 export {name, age, sex}
如何導入呢?
import {name, age, sex} from "./aaa.js"
-
導入函數
比如下面導出的函數, 我們如何導入呢?
let name = "張三" let age = 14 let sex = "男" function run() { console.log(name, "在跑步") } // 導出函數---方法一 export {run} //導出函數--方法二 export function eat() { console.log(name, "在吃飯") }
導入函數使用
import {run, eat} from "./aaa.js"
我們發現導入方法和變數一樣的. 調用的時候需要run(), eat(). 這樣就會執行函數體了
-
導入對象
class Person { type="白種人" run() { return "跑起來" } } // 導出對象 export {Person}
上面導入了一個對象, 如何導入對象呢?
import {Person} from './aaa.js' 可以這樣使用 let p = new Person()
2) 導入全部
如果有很多變數, 就可以使用導入全部
// 導入方法二 import * as bbb from "./bbb.js"
導入全部的時候, 我們會為其設置一個別名, 然後通過別名.變數獲取變數值
3) 導入默認方法
我們導出的默認方法, 如何進行導入呢?
// 導出默認方法 let def = "默認的方法" export default def
默認導出通常只能有一個, 所以, 我們可以給默認導出命一個名字
// 導入方法三 import defData from './aaa.js'
//列印輸出默認導出的變數
console.log(defData)