Коли я повинен використовувати requ () і коли використовувати define ()?


316

Останні кілька днів я граю з Requjs. Я намагаюся зрозуміти відмінності між визначити і вимагати.

Здається, визначення дає змогу розділити модуль і дотримуватися впорядкування залежності. Але він завантажує всі файли, з яких потрібно почати. Хоча вимагає завантажувати лише те, що вам потрібно, коли вам це потрібно.

Чи можна ці два використовувати разом і для яких цілей слід використовувати кожне з них?

Відповіді:


331

Коли defineви реєструєте модуль у Requ.js, від якого ви можете залежати в інших визначеннях модуля або вимагати операторів. З requireвами "просто" завантажуйте / використовуйте модуль або файл JavaScript, який можна завантажити. Для прикладів подивіться документацію

Моє правило:

  • Визначте: Якщо ви хочете оголосити модуль, залежать інші частини вашої програми.

  • Потрібно: Якщо ви просто хочете завантажувати та використовувати речі.


331

З вихідного коду Requ.js (рядок 1902):

/**
 * The function that handles definitions of modules. Differs from
 * require() in that a string for the module should be the first argument,
 * and the function to execute after dependencies are loaded should
 * return a value to define the module corresponding to the first argument's
 * name.
 */

define()Функція приймає два додаткові параметри (рядки , які представляють собою ідентифікатор модуля і масив необхідних модулів) і один необхідний параметр (метод фабрики).

Повернення заводського методу ОБОВ'ЯЗКОВО поверне реалізацію для вашого модуля (так само, як це робить Модуль Шаблон ).

require()Функція не повинна повертати реалізацію нового модуля.

Використовуючи define()вас, ви запитуєте щось на кшталт "запустіть функцію, яку я передаю як параметр, і призначте все, що повертається до ідентифікатора, який я передаю, але перед цим перевірте, чи завантажуються ці залежності" .

Використовуючи, require()ви говорите щось на кшталт "функція, яку я передаю, має такі залежності, перевірте, чи завантажуються ці залежності перед її запуском" .

require()Функція , де ви використовуєте певні модулі для того, щоб бути впевненим , що модулі визначені, але не визначення нових модулів там.


2
Чи є якась різниця в тому, чи використовується в модулі define'd або поза ним вимога? Якщо він використовується всередині модуля, чому б не просто встановити вимоги у визначенні модуля, а не вимагати використання?
Петрі

Чому ця відповідь настільки відрізняється від того, що я читаю тут Requjs.org/docs/api.html#deffunc ??
Джеймс Лін

2
@Petri, здається, ви бачите поведінку RequireJS версії 2 щодо завантаження модулів асинхронно. "RequireJS 2.0 не буде виконувати заводську функцію модуля (функція передана define()), поки не буде здійснено require([])дзвінок, який його запросив, або щось, що від нього залежить." github.com/jrburke/requirejs/wiki/…
alxndr

2

метод "визначити" для полегшення визначення модуля та метод "вимагати" для обробки завантаження залежностей

визначення використовується для визначення іменованих або неназваних модулів на основі пропозиції, використовуючи наступний підпис:

define(
module_id /*optional*/, 
[dependencies] /*optional*/, 
definition function /*function for instantiating the module or object*/
);

З іншого боку, вимога зазвичай використовується для завантаження коду у файл верхнього рівня JavaScript або в модулі, якщо ви бажаєте динамічно отримувати залежності

Для отримання додаткової інформації зверніться до https://addyosmani.com/writing-modular-js/ .


2

Загальні правила:

  1. Ви використовуєте define, коли ви хочете визначити модуль, який буде повторно використаний

  2. Ви використовуєте вимагає просто завантажити залежність

    //sample1.js file : module definition 
    define(function() {
          var sample1 = {};
          //do your stuff
         return sample1;
     });
    
    //sample2.js file : module definition and also has a dependency on jQuery and sample1.js
    define(['jquery', 'sample1'], function($,sample1) {
        var sample2 = {
            getSample1:sample1.getSomeData();
        };
        var selectSomeElement = $('#someElementId');
        //do your stuff....
        return sample2;
    });
    
    //calling in any file (mainly in entry file)
    require(['sample2'], function(sample2) {
        // sample1 will be loaded also
    });
    

Сподіваюся, це вам допоможе.


1

вимагають () та визначають () обидва, що використовуються для завантаження залежностей. Існує велика різниця між цими двома методами.

Його дуже прості хлопці

Потрібно (): метод використовується для запуску негайних функціональних можливостей. define (): метод використовується для визначення модулів для використання в декількох місцях (повторне використання).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.