说说 JS 模块化

作者: 马建阳 | 来源:发表于2017-09-16 21:15 被阅读31次

    什么是模块化

    模块化简单来说就是把代码模块之后放到一个文件里。
    一个模块就是一个独立的功能,它可以是一个函数,也可以是一个对象,还可以是一个文件。

    实现模块化的技巧

    1. 用函数把复杂事情分割成几个小事情
    2. 一个函数只做一件事情
    3. 用立即执行函数解决模块的不完全独立(例如暴露了foo1和foo2两个全局变量,无法保证不与其他模块产生冲突,用立即执行函数可以避免产生全局变量的问题,这样foo1()和foo2()就都是局部变量了。还有另外一个问题,假如模块与模块之间有依赖关系怎么办呢?一个简单的例子就是当我们引入jQuery时进行编程,jQuery就可以认为是一个依赖,我们可以通过传入这个依赖来解决)
    4. 造一个自己的window(列如app),将一些插件挂在app上,解决和外部插件的冲突

    什么样的代码算优化的好

    每个函数只有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.jianshu.com/p/b4d4855b4668

    相关文章

      网友评论

        本文标题:说说 JS 模块化

        本文链接:https://www.haomeiwen.com/subject/mwexjxtx.html