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)