Шаблон модуля Javascript для приложений jquery

Я пишу всем вам, потому что я хотел бы получить несколько советов и советов по поводу характерного шаблона модуля, который я использую.

Ища тему в Интернете и в книгах, я не смог найти ничего похожего на этот архитектурный выбор, кроме определенных концепций.

Шаблон в нескольких словах: ° Каждая веб-страница должна включать только одну область и может включать в себя множество модулей. ° Каждый модуль является IIFE с подфункциями. ° Каждая область имеет готовый документ и вызывает один или несколько модулей.

Я прилагаю вам пример кода, чтобы быть более наглядным.

Эта модель напоминает вам что-то уже виденное ранее? Это хороший архитектурный выбор? Есть ли слабые места или архитектурные ошибки в этом шаблоне? Это хорошее использование функций и пространств имен IIFE?

Заранее спасибо, с наилучшими пожеланиями.

index.html

<html>
<head>
    <meta HTTP-EQUIV='content-type' CONTENT='text/html; charset=utf-8'/>
</head>

<body>

    <div id="first"></div>
    <div id="second" style="border:2px solid green;width:150px;height:190px;"></div>

</body>

<script type='text/javascript' src='http://code.jquery.com/jquery-latest.min.js'></script>
<script type='text/javascript' src='js/module.one.js'></script>
<script type='text/javascript' src='js/module.two.js'></script>
<script type='text/javascript' src='js/scope.js'></script>

module.one.js

(function () {


// Module namespace

if (typeof $M === 'undefined') { 
    $M = {}; 
}

// Variables declaration chained
var 
    $first,
    $second,
    $chunk,
    documentHeight,
    animationTime,
    style,
    style2;

/* ===========================================================================================================
    INIT FUNCTION
============================================================================================================= */

var init = function() {

    // calls setup first 
    setup();                        

    // calls other functions
    appendChunk();
    animateChunk();
};

function setup() {

    // Vars caching
    $document = $(document);
    $first = $('#first');
    $second = $('#second');
    $chunk = $("<div id='chunk'> truffle shuffle </div>");
    documentHeight = $document.height(); 
    animationTime = 1000;

    style = {
        'border':'2px solid red',
        'height': documentHeight / 8,
        'width': '150px'
    };

    style2 = {
        'height': documentHeight / 4,
        'width': '300px'
    };

    $second.hide();
}

/* ===========================================================================================================
    OTHER FUNCTIONS
============================================================================================================= */

function appendChunk() {
    $first.append($chunk);
    $chunk.css(style);
}

function animateChunk() {
    $chunk.animate(style2,animationTime,function(){
        $(this).trigger('animationComplete');
    });
}



/* ===========================================================================================================
    INIT MODULE
============================================================================================================= */

$M.one = init;

})();

module.two.js

(function () {


    // Module namespace

    if (typeof $M === 'undefined') { 
        $M = {}; 
    }

    // Variables declaration chained
    var 
        $second,
        $chunk,
        animationTime,
        style;

    /* ===========================================================================================================
        INIT FUNCTION
    ============================================================================================================= */

    var init = function() {

        // calls setup first 
        setup();                        

        // calls other functions
        chunkListener();
        secondListener();
        isSecondVisible();
    };

    function setup() {

        // Vars caching

        $second = $('#second');
        $chunk = $("#chunk");

        animationTime = 1000;

        style = {
            'border':'2px solid red',
            'height': '150px',
            'width': '150px'
        };

    }

    /* ===========================================================================================================
        OTHER FUNCTIONS
    ============================================================================================================= */

    function chunkListener() {
        $chunk.on('animationComplete',function(){
            $second.fadeIn().trigger('animationComplete');
        });
    }

    function secondListener() {
        $second.on('animationComplete',function(){
            $chunk.animate(style,animationTime);
        });
    }


    function isSecondVisible() {
        var time = setInterval(function() {
            if($second.is(':visible')) {
                console.log("visible");
                clearInterval(time);
            } else {
                $second.html("finished!");
            }
        },200);
    }


    /* ===========================================================================================================
        INIT MODULE
    ============================================================================================================= */

    $M.two = init;

})();

scope.js

$(document).ready(function () {

$M.one();
$M.two();

});

1 ответ

Решение

Эта модель напоминает вам что-то уже виденное ранее?

Структура модулей похожа на шаблон модуля. Принцип расширения "супер" модуля, к которому вы обращаетесь как $M выглядит также знакомо. См. Модуль Увеличение

Это хороший архитектурный выбор? Есть ли слабые места или архитектурные ошибки в этом шаблоне?

Модульное мышление часто (конечно, в зависимости от контекста, сделать модульное приложение "Привет, мир" - это немного излишним) - хороший архитектурный выбор. Тем не менее, читая логику ваших модулей, я немного сомневался в том, чтобы создать процедурный внутренний дизайн и не подвергать какой-либо API-интерфейс. Я полагаю, что у вас есть возможность улучшить дизайн ваших модулей путем реализации архитектуры, подобной MV-*.

Это хорошее использование функций и пространств имен IIFE? Я думаю, что ваше использование хорошо, как оно есть. Я возможно добавлю "супер" модуль ($M) в качестве аргумента ваших модулей IIFE, которые должны лучше изолировать ваши модули от внешнего мира (глобальной области).

Рекомендации

Изучение шаблонов дизайна JavaScript

Выражение с немедленным вызовом функции (IIFE)

Другие вопросы по тегам