1. 程式人生 > >深入解析JavaScript 的模組化

深入解析JavaScript 的模組化

為什麼需要模組化開發?

JavaScript 的模組化

隨著程式碼複雜程度的提高, 專案也變得越來越難維護, JavaScript模組化 也因此油然而生, 這應該是大家最熟悉的一種載入方式, 但是缺點也比較明顯

  • 所有的模組都處於全域性作用域下, 容易造成命名衝突
  • 依賴關係不明顯, 比如 main.js 中有使用 jquery, 那麼 jquery 就一定要先載入,
  • 但是從引入方式中我們無法直觀的察覺依賴關係, 不利於維護
<script src="jquery.js"></script>
<script src="jquery_scroller.js"></script>
<script src="bootstarp.js"></script>
<script src="main.js"></script>

CommonJs

一個檔案就是一個模組, 其內部定義的變數, 方法都處於該模組內, 不會對外暴露.

主要語法:

使用 require 來載入模組
使用 exports 或者 module.exports 暴露模組中的內容

demo

新建 a.js, 匯出 name 和 sayHello

// a.js
const name = 'Bob'
function sayHello(name) {
 console.log(`Hello ${name}`)
}
module.exports.name = name
module.exports.sayHello = sayHello

在 b.js 中引入 a 並呼叫

// b.js
const a = require('./a')
const name = a.name
console.log(name) // Bob
a.sayHello(name) // Hello Bob

由於 CommonJs 是同步載入的模組的, 在服務端(node), 檔案都在硬碟上, 所以同步載入也無所謂, 但是在瀏覽器端, 同步載入就體驗不好了. 所以 CommonJs 主要使用於 node 環境下.

AMD

AMD 全稱為 Asynchromous Module Definition(非同步模組定義), 實現了非同步載入模組. require.js 實現了 AMD 規範

主要語法:

require([module], callback) // 匯入
define(id, [depends], callback) // 匯出模組
新建 a.js, 輸入以下內容

define(function() {
 let alertName = function(str) {
 alert('I am ' + str)
 }
 let alertAge = function(num) {
 alert('I am ' + num + ' years old')
 }
 return {
 alertName: alertName,
 alertAge: alertAge
 }
})

在 test.html 中呼叫 a 模組

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
</head>
<body>
 <script src="./require.js"></script>
 <script>
 require(['a'], function (alert) {
 alert.alertName('JohnZhu')
 alert.alertAge(21)
 })
 </script>
</body>
</html>

CMD

CMD規範 是阿里的玉伯提出, sea.js 實現。 實現了按需載入

與 AMD 的區別:

對於依賴的模組 AMD 提前執行,而 CMD 是延遲執行
CMD 推崇依賴就近, AMD 推崇依賴前置

//AMD2.0之前
 require(['./a', './b'], function(a, b) {
 a.doSomething();
 b.doSomething();
 })
 // AMD2.0之後
 define(['./a', './b'], function(a, b) {
 a.doSomething();
 b.doSomething();
 })
 
 // CMD
 define(function(require, exports, module) {
 var a = require('./a');
 a.doSomething();
 var b = require('./b');
 b.doSomething();
 })

ES6

ES6 模組化方案是最規範的方案, 未來也是主流, 對於我們來說也是經常使用與熟悉的. 不過現在的瀏覽器還不相容, 使用需要 babel 轉碼

使用 export 匯出模組
使用 import 匯入模組

import Vue from 'vue'
import axios from 'axios'
import { mapState, mapMutations, mapActions } from 'vuex'
export default {
 created() {
 console.log('Hello World')
 }
}

為了學習工作與休閒娛樂互不衝突,現新建圈【碼農茶水鋪】用於程式設計師生活,愛好,交友,求職招聘,吐槽等話題交流,希望各位大神工作之餘到茶水鋪來喝茶聊天。群號:582735936