說說 JS 模塊化

什么是模塊化

模塊化簡單來說就是把代碼模塊之后放到一個文件里霞溪。
一個模塊就是一個獨立的功能专控,它可以是一個函數(shù),也可以是一個對象诬滩,還可以是一個文件霹粥。

實現(xiàn)模塊化的技巧

  1. 用函數(shù)把復(fù)雜事情分割成幾個小事情
  2. 一個函數(shù)只做一件事情
  3. 用立即執(zhí)行函數(shù)解決模塊的不完全獨立(例如暴露了foo1和foo2兩個全局變量灭将,無法保證不與其他模塊產(chǎn)生沖突,用立即執(zhí)行函數(shù)可以避免產(chǎn)生全局變量的問題后控,這樣foo1()和foo2()就都是局部變量了庙曙。還有另外一個問題,假如模塊與模塊之間有依賴關(guān)系怎么辦呢浩淘?一個簡單的例子就是當(dāng)我們引入jQuery時進(jìn)行編程捌朴,jQuery就可以認(rèn)為是一個依賴,我們可以通過傳入這個依賴來解決)
  4. 造一個自己的window(列如app),將一些插件掛在app上馋袜,解決和外部插件的沖突

什么樣的代碼算優(yōu)化的好

每個函數(shù)只有5行

模塊化舉例

!function($,AV){
    loadSongs()
    function loadSongs() {
        getSongs().then(fillSongs, function (error) {
            alert('獲取歌曲失敗')
        })
    }
    function template(song,results){
        return
        ` <li>
            <a href="./song.html?id=${results.id}">
              <div class="wrapper">
                <h3>${song.name}</h3>
                <svg class="icon " >
                  <use xlink:href="#icon-SQ"></use>
                </svg>
                <p>${song.singer}</p>
              </div>
              <svg class="icon " >
                <use xlink:href="#icon-bofangjian60px"></use>
              </svg>
            </a>
          </li> `
    }
    function getSongs(){
        var query = new AV.Query('Song');
        return query.find()
    }
    function fillSongs(results){
        $('#songs-loading').remove()
        for(let i=0;i<results.length;i++) {
            let song = results[i].attributes
            let li = template(song,results[i])
            $('ul#song').append(li)
        }
    }
}(jQuery,AV)

使用require.js之后

define(['jquery','av'],function($,AV){
    function loadSongs() {
        getSongs().then(fillSongs, function (error) {
            alert('獲取歌曲失敗')
        })
    }
    function template1(song,results){
        return `<li>
            <a href="./song.html?id=${results.id}">
              <div class="wrapper">
                <h3>${song.name}</h3>
                <svg class="icon " >
                  <use xlink:href="#icon-SQ"></use>
                </svg>
                <span>${song.singer}</span>
              </div>
              <svg class="icon " >
                <use xlink:href="#icon-bofangjian60px"></use>
              </svg>
            </a>
          </li>`
    }
    function template2(i,song,results){
        if(i<9){
            return `<li>
            <a href="./song.html?id=${results.id}">
            <p >0${i+1}</p>
              <div class="wrapper">
                <h3>${song.name}</h3>
                <svg class="icon " >
                  <use xlink:href="#icon-SQ"></use>
                </svg>
                <span>${song.singer}</span>
              </div>
              <svg class="icon " >
                <use xlink:href="#icon-bofangjian60px"></use>
              </svg>
            </a>
          </li>`
        }else{
            return `<li>
            <a href="./song.html?id=${results.id}">
            <p >${i+1}</p>
              <div class="wrapper">
                <h3>${song.name}</h3>
                <svg class="icon " >
                  <use xlink:href="#icon-SQ"></use>
                </svg>
                <span>${song.singer}</span>
              </div>
              <svg class="icon " >
                <use xlink:href="#icon-bofangjian60px"></use>
              </svg>
            </a>
          </li>`}
    }
    function getSongs(){
        var query = new AV.Query('Song');
        return query.find()
    }
    function fillSongs(results){
        $('#songs-loading').remove()
        for(let i=0;i<results.length;i++) {
            let song = results[i].attributes
            let li = template1(song,results[i])
            $('ul#song').append(li)
        }
        $('#hot-songs-loading').remove()
        for(let i=0;i<results.length;i++) {
            let song = results[i].attributes
            let li = template2(i,song,results[i])
            $('ul#hot-song').append(li)
        }
    }
    return loadSongs
})

使用loadSongs

requirejs.config({
    paths: {
        jquery: '../vendors/jquery.min', // 路徑2
        av:'../vendors/av-min'
    }
});

require(['./tabs','./load-songs','./search','./av-init','./home'],function(tabs,loadSongs,search,AVInit,yyy){
    AVInit()
    tabs('.tabs')
    loadSongs()
    search()
    yyy()
})

用webpack

export default function loadSongs() {
    getSongs().then(fillSongs, function (error) {
        alert('獲取歌曲失敗' + error);
    });
    function getSongs() {
        let query = new AV.Query('Song');
        return query.find()
    }

    function fillSongs(results) {
        $('#loading-music').remove();
        for (let i = 0; i < results.length; i++) {
            let song = results[i].attributes;
            let li = songTemplate(song, results[i].id);
            $("#newSongsList").append(li);
            $("#hotSongsList").append(li);
        }
    }

    function songTemplate(song, id) {
        return `
            <a href=/yunMusic-demo/play.html?id=${id} class="songInfo">
                    <p class="songTitle">${song.name}<span class="songDesc">${song.des}</span></p>
                    <p class="singer"><i class="icon icon-sq"></i>${song.singer} - ${song.album}</p>
                    <div class="playButton"><i class="icon icon-play"></i></div>
             </a>
        `;
    }

}
import '../vendors/loaders.min.css'
import './reset.css'
import './index.css'
import avReset from './avReset'
import loadSongs from './loadSongs'
import tabs from './tabs'
import searchSongs from './searchSongs'
avReset();
tabs(".tabs",".mainPages");
loadSongs();
searchSongs();

推薦文章:
1.https://plainnany.github.io/2017/09/04/JavaScript%E6%A8%A1%E5%9D%97%E5%8C%96%E7%BC%96%E7%A8%8B-require-js/
2.http://www.reibang.com/p/b4d4855b4668

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末男旗,一起剝皮案震驚了整個濱河市舶斧,隨后出現(xiàn)的幾起案子欣鳖,更是在濱河造成了極大的恐慌,老刑警劉巖茴厉,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泽台,死亡現(xiàn)場離奇詭異,居然都是意外死亡矾缓,警方通過查閱死者的電腦和手機怀酷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗜闻,“玉大人蜕依,你說我怎么就攤上這事×瘀ǎ” “怎么了样眠?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翠肘。 經(jīng)常有香客問我檐束,道長,這世上最難降的妖魔是什么束倍? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任被丧,我火速辦了婚禮,結(jié)果婚禮上绪妹,老公的妹妹穿的比我還像新娘甥桂。我一直安慰自己,他們只是感情好邮旷,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布黄选。 她就那樣靜靜地躺著,像睡著了一般廊移。 火紅的嫁衣襯著肌膚如雪糕簿。 梳的紋絲不亂的頭發(fā)上探入,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音懂诗,去河邊找鬼蜂嗽。 笑死,一個胖子當(dāng)著我的面吹牛殃恒,可吹牛的內(nèi)容都是我干的植旧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼离唐,長吁一口氣:“原來是場噩夢啊……” “哼病附!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亥鬓,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤完沪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嵌戈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體覆积,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年熟呛,在試婚紗的時候發(fā)現(xiàn)自己被綠了宽档。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡庵朝,死狀恐怖吗冤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情九府,我是刑警寧澤椎瘟,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站昔逗,受9級特大地震影響降传,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜勾怒,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一婆排、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笔链,春花似錦段只、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春炕婶,著一層夾襖步出監(jiān)牢的瞬間姐赡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工柠掂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留项滑,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓涯贞,卻偏偏與公主長得像枪狂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宋渔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

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

  • ¥關(guān)閉¥ 【雷霆戰(zhàn)機】 〖http://pan.baidu.com/s/1kVstszX〗 《解壓源碼后直接用AI...
    小菜c閱讀 9,445評論 0 19
  • ¥開啟¥ 【雷霆戰(zhàn)機】 〖http://pan.baidu.com/s/1kVstszX〗 《解壓源碼后直接用AI...
    小菜c閱讀 3,708評論 0 5
  • ¥開啟¥ 【雷霆戰(zhàn)機】 〖http://pan.baidu.com/s/1kVstszX〗 《解壓源碼后直接用AI...
    小菜c閱讀 3,544評論 1 10
  • 在Mac上打開Word文檔實在是慢州疾,而且還沒有目錄,搜索機制還不一樣皇拣,每次中文輸完enter就會檢索一遍严蓖。比如,我...
    Chrisbooty閱讀 7,234評論 0 0
  • 我們都在渴望內(nèi)心不再孤獨 我們希望傷痛過后可以找人傾述 每當(dāng)我拿起電話對方在通話中 每當(dāng)我戴上耳機穿流在人群中 我...
    微心詩話閱讀 186評論 0 0