2019-08-24

模塊化

什么是模塊?

一個具有處理邏輯的js文件,把相關的方法或?qū)ο筮M行導出,經(jīng)過導入就可以使用.

模塊化有什么作用?

  • 避免命名沖突(減少命名空間污染)
  • 更好的分離, 按需加載
  • 更高復用性
  • 高可維護性
  • 分治(你會發(fā)現(xiàn)當邏輯復雜的時候蟀俊,可以分得更加細的模塊猜旬,而且多人同時開發(fā)楔绞,可見分治是模塊化最大的優(yōu)點。)

為什么要用模塊化?

那么webpack提出來的,萬物都是模塊化.比如一個項目越做越大,項目也變得越來越難維護,JavaScript模塊化,把每個單獨的可復用性的業(yè)務邏輯抽離出來成為一個個模塊,需要用到的時候直接導入,進行使用,一處編寫處處使用,以后業(yè)務需要更新,只需要改模塊的邏輯即可.我們項目肯定會封裝一個異步請求的js文件,使用的時候代碼非常精簡,舒服.

在ES6之前,javascript是不是沒有模塊體系,javascript社區(qū)制定的CommonJS,AMD赖条,CMD.都是不是我們真正需要的,直到ES6提出來的模塊化—ES6模塊

<font color="red" size=3>主角放在前面 ??????</font>

主角ES6 模塊

在 ES6 前, 實現(xiàn)模塊化使用的是 RequireJS (基于 AMD 規(guī)范的模塊化庫)或者 seaJS(基于 CMD 規(guī)范的模塊化庫)扰她。直到ES6模塊出來了,他們就被取代了, 新王登基犹赖。

嚴格模式:模塊化自動是嚴格模式,總之我們老老實實寫,不會報錯了啦.

**export(導出): **規(guī)定模塊的對外導出的接口

import(導入): 規(guī)定模塊的對外導入的接口

實踐一下怎么使用

導出:

//寫一個邏輯代碼,這是js文件===模塊
function atoe(params) {
    console.log("這是模塊中的邏輯代碼",params); 
}

export { //導出
    atoe,           //方式一:將函數(shù)暴露出去 
    atoe as newAtoe //方式二: 將newAtoe暴露出去,然而newAtoe引用了atoe,達到了重命名的效果
    //所以這里總共導出了 atoe 和 newAtoe到外面.
}  

導入:

    //組件中使用,我以vue為例子.其他也一樣的.
//這是要使用的時候?qū)?
<template>
  <div>
    <button @click="runAtoe('msg')">HelloWorld</button>
  </div>
</template>

<script>
  //導入方式一:這種叫做按需導入方法,物盡其用.贊成??
import {atoe, newAtoe} from '../js/atoeModule'
export default {
  methods: {
    runAtoe(params){
      atoe(params);
      newAtoe(params);
    }
  },
}
</script>

<script>
  //導入方式二:整體導入,這種不管三七二十一,全部導過來,然后這里把他們都放在了allFn這個對象里面,然后通過對象獲取他們,也沒有說這種不行就是low
import * as allFn from '../js/atoeModule'
export default {
  methods: {
    runAtoe(params){
      allFn.atoe(params);
      allFn.newAtoe(params);
    }
  },
}
</script>
注意這兩種做法沒有性能差別,因為ES6模塊是靜態(tài)加載,只是一個引用,不會在內(nèi)存中造成負擔.

剛剛上面介紹的是非常合情理的導入導出.但是為了照顧哪些心急的人,往往也需要添加一些東西,來滿足他們的需求

export default: 默認導出,它能帶來的好處就是<font color="red" size=3>一次導出(只能導出一次)</font>,導出的時候只要路徑對了,不管你取什么名字,都可以使用.

導出:

//寫一個邏輯代碼
function atoe(params) {
    console.log("這是模塊中的第一個邏輯代碼",params); 
}

function atoe2(params) {
    console.log("這是模塊中的第二個邏輯代碼",params); 
}

export default{ //默認導出
    atoe, 
    atoe2          
    //所以這里默認暴露出去 atoe atoe2
}  

導入:

<script>
//這個allFn你想用什么名字都是可以的,just you like it. 
//注意點: 因為它導出來得是對象,所以不用花括號{},注意一下.
import allFn from '../js/atoeModule'
export default {
  methods: {
    runAtoe(params){
      allFn.atoe(params);
      allFn.atoe2(params);
    }
  },
}
</script>

<font size=4 color="###">總結(jié):ES6模塊化就這么點東西,但是這里導入導出太多方法了,請記住一點:用了一種就要一直用,不忘初心,懂吧,不然到后面你會懷疑你垃圾代碼原來是自己寫得.</font>

CommonJS(用于服務器)

node是用CommonJS規(guī)范的,然后node是后臺語言,所以這個規(guī)范是用于服務器的.

導出:exports或者module.exports暴露需要被外部訪問的屬性和方法。<font size=4 color="red">記得別和ES6模塊搞混了,export這是多個S, export default 也不一樣.</font>

導入:require("url");

 var module = {
     exports: {}
 };

 (function (module, exports) {
     exports.atoe = function (n) { return n };
 }(module, module.exports))

 var atoe = module.exports.atoe;
 atoe(1) //1  這是CommonJS的原理

為什么CommonJS僅僅適用于服務器不適用瀏覽器?

場景:當我們需要加載一個模塊的時候,這時候 CommonJS規(guī)范適用了 var atoe = require("atoe"); 如果在服務器完全ok的,因為atoe這個模塊肯定在服務器,即拿即用.就是用的時候加載也ok,它就是運行的時候atoe才是確定的值,無所謂啊.然后當我們?yōu)g覽器用的這個模塊的時候還要去請求,好了拿到了,堵塞代碼了,怎么可能會用這種規(guī)范.但是可以做其他處理,我覺得沒有必要深究下去了.

import 是編譯時就完成模塊加載,效率比CommonJS,沒有說CommonJS垃圾,只是說CommonJS只是用于服務器端.

AMD (Asynchronous Module Definition)用于瀏覽器

中文意思異步模塊定義,有沒有發(fā)現(xiàn)異步的東西好像都能扯上瀏覽器身上.

AMD 是RequireJS[模塊加載器]的一種規(guī)范,然后加載的時候不會堵塞瀏覽器的渲染董瞻,AMD 推崇依賴前置寞蚌。

有趣的是webpack也是打包工具,但是它的規(guī)范是CommonJS

CMD(Common Module Definition )

CMD是Seajs [web端模塊加載器]推廣的產(chǎn)物,嗯钠糊,他對我未來的方向毫無幫助睬澡,我不打算去了解太深入,CMD 推崇依賴就近 眠蚂。

我們的重點是ES6的模塊化

模塊化的發(fā)展史

歷史故事總是有趣的

一、原始寫法函數(shù)

function Atoe(){
    console.log("這是最low的模塊寫法")
}
其實當這個在現(xiàn)在偶爾還是會在頁面出現(xiàn)的斗躏,因為簡單易用的邏輯通過函數(shù)寫出來逝慧,進行復用還是可取的,但是對于大的模塊化是不可能的啄糙。
缺點:1.污染全局命名空間笛臣。
     2.容易引起命名沖突或數(shù)據(jù)不安全。
     3.而且模塊成員之間看不出直接關系隧饼。

二沈堡、對象寫法

let Atoe = {
    name : "Atoe",
    can : function(){
        console.log(`${this.name}can code`);
    }
}

解決問題:1.減少了全局變量。
         2.解決命名沖突燕雁。
缺點就是:1.對象外部可以修改內(nèi)部的一切東西诞丽,不安全鲸拥。

三、立即執(zhí)行函數(shù)寫法

 ((function (win) {
     let name = "Atoe";
     function atoe() {
         console.log("這是自調(diào)用函數(shù)里面的atoe函數(shù)");
     }

    win.me = { //win 接收到window參數(shù)僧免,然后通過給windo添加一個me屬性刑赶,將函數(shù)里面的東西暴露出去,見下圖
        name:name,
        atoe:atoe
    }
 })(window))

console.log( window.me.name); //Atoe
window.me.atoe();             //這是自調(diào)用函數(shù)里面的atoe函數(shù)

// 大名鼎鼎的jQuery都是用立即執(zhí)行函數(shù)懂衩,好像是一個天衣無縫的解決方案撞叨。
解決問題:外部無法修改里面的東西。

但是這個歷史上面的浊洞,沒有一個是真正嚴格意義上的模塊化牵敷,真正的屬于前端,而且適用于前端的法希,就是ES6模塊

me加在window屬性上.png

四.模塊化枷餐。但是最后進化到ES6模塊化√模回到頂部在溫故一下吧

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尖淘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子著觉,更是在濱河造成了極大的恐慌村生,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饼丘,死亡現(xiàn)場離奇詭異趁桃,居然都是意外死亡,警方通過查閱死者的電腦和手機肄鸽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門卫病,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人典徘,你說我怎么就攤上這事蟀苛。” “怎么了逮诲?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵帜平,是天一觀的道長。 經(jīng)常有香客問我梅鹦,道長裆甩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任齐唆,我火速辦了婚禮嗤栓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箍邮。我一直安慰自己茉帅,他們只是感情好叨叙,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著担敌,像睡著了一般摔敛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上全封,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天马昙,我揣著相機與錄音,去河邊找鬼刹悴。 笑死行楞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的土匀。 我是一名探鬼主播子房,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼就轧!你這毒婦竟也來了证杭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤妒御,失蹤者是張志新(化名)和其女友劉穎解愤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乎莉,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡送讲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惋啃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哼鬓。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖边灭,靈堂內(nèi)的尸體忽然破棺而出异希,到底是詐尸還是另有隱情,我是刑警寧澤绒瘦,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布宠互,位于F島的核電站,受9級特大地震影響椭坚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搏色,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一善茎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧频轿,春花似錦垂涯、人聲如沸烁焙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骄蝇。三九已至,卻和暖如春操骡,著一層夾襖步出監(jiān)牢的瞬間九火,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工册招, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岔激,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓是掰,卻偏偏與公主長得像虑鼎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子键痛,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Javascript模塊化編程划址,已經(jīng)成為一個迫切的需求。理想情況下限府,開發(fā)者只需要實現(xiàn)核心的業(yè)務邏輯夺颤,其他都可以加載...
    zhoulujun閱讀 2,941評論 0 14
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點點福利:阿里云產(chǎn)品券胁勺,享受所有官網(wǎng)優(yōu)惠世澜,并抽取幸運大...
    HetfieldJoe閱讀 3,661評論 2 27
  • 前面的話 ??JS用"共享一切"的方法加載代碼,這是該語言中最易出錯且容易令人感到困惑的地方署穗。在ES6以前寥裂,在應用...
    CodeMT閱讀 2,911評論 0 5
  • 時光越久就發(fā)現(xiàn) 能約出來的人越來越少 曾經(jīng)同一條跑道的人走上分叉路口 徹夜聊天說心事的人 也沒有再去打擾的借口 生...
    不忘初?閱讀 330評論 1 0
  • 昨天,下班回到家23點案疲。 收拾整理了一些閑置物品封恰,準備拿來公司做激勵,獎勵給出單的伙伴們褐啡。于是東摸摸诺舔,西搞搞,一不...
    安然小語閱讀 126評論 0 0