Предыдущая:Учебник по модульному инструменту JS RequireJS (1): Первое знакомство с RequireJSМы представили RequireJS очень простым способом. В этой статье будут рассмотрены некоторые базовые знания RequireJS, включая использование API, и т. д.

Базовый API

require определяет три переменные: define, require, requirejs. При этом require === requirejs, и обычно короче использовать require.

  • define: Как следует из названия, этот API используется для определения модуля.
  • require: Загружает зависимые модули и выполняет функцию обратного вызова после загрузки.

a.js из предыдущей статьи:

define(function(){
    function fun1(){
      alert("it works");
    }

    fun1();
})

Модуль определяется через функцию define, а затем используется на странице:

require(["js/a"]);

для загрузки модуля (Обратите внимание, что зависимости в require — это массив. Даже если зависимость только одна, её нужно задать с помощью массива.), второй параметр API require — callback, функция, используемая для обработки логики после загрузки, например:

require(["js/a"],function(){
    alert("load finished");
})

Загрузка файлов

В предыдущих примерах загружаемые модули были локальными JS-файлами. Однако в большинстве случаев JS, который требуется загрузить веб-странице, может находиться на локальном сервере, других сайтах или CDN, поэтому его нельзя загрузить таким способом. Рассмотрим загрузку библиотеки jQuery в качестве примера:

require.config({
    paths : {
        "jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery"]   
    }
})
require(["jquery","js/a"],function($){
    $(function(){
        alert("load finished");  
    })
})

Здесь используетсяrequire.config,require.configиспользуется для настройки местоположения загрузки модуля. Проще говоря, он даёт модулю более короткое и легко запоминающееся имя. Например, обозначьте адрес библиотеки jQuery от Baidu какjquery, поэтому при вызове require достаточно написать["jquery"]чтобы загрузить этот JS. Мы можем настроить локальные JS-файлы таким же образом:

require.config({
    paths : {
        "jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery"],
        "a" : "js/a"   
    }
})
require(["jquery","a"],function($){
    $(function(){
        alert("load finished");  
    })
})

Настройка paths делает имена наших модулей более краткими. У paths также есть важная особенность: можно настроить несколько путей. Если удалённая библиотека CDN не загружается, можно загрузить локальную библиотеку, например:

require.config({
    paths : {
        "jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery", "js/jquery"],
        "a" : "js/a"   
    }
})
require(["jquery","a"],function($){
    $(function(){
        alert("load finished");  
    })
})

С этой конфигурацией, если jQuery от Baidu не загрузится, будет загружен jQuery из локального каталога js.

  1. При использовании RequireJS не нужно писать.jsв качестве суффикса. Конечно, также нельзя писать суффикс.
  2. В функции обратного вызова из примера выше можно увидеть$параметр. Это выходная переменная зависимогоjqueryмодуля. Если вы зависите от нескольких модулей, можно записать несколько параметров по порядку, чтобы использовать их:
require(["jquery","underscore"],function($, _){
    $(function(){
        _.each([1,2,3],alert);
    })
})

Если модуль не выводит значение переменной, то соответствующего параметра нет. Поэтому старайтесь сначала писать модули, которые выводят значение, чтобы предотвратить путаницу, вызванную несовпадением позиций.

Глобальная конфигурация

В приведённых выше примерах конфигурация повторяется.require.configЕсли добавлять конфигурацию на каждую страницу, это неизбежно будет выглядеть неэлегантно. RequireJS предоставляет функцию под названием "main data". Сначала мы создадим main.js:

require.config({
    paths : {
        "jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery", "js/jquery"],
        "a" : "js/a"   
    }
})

Затем используйте на странице следующий способ, чтобы использовать RequireJS:

<script data-main="js/main" src="js/require.js.html"></script>

Поясню: в тег script, загружающий скрипт RequireJS, добавленdata-mainатрибут. JS, указанный этим атрибутом, будет обработан после загрузки require.js. Мы добавляемrequire.configконфигурацию вdata-main, чтобы каждая страница могла использовать эту конфигурацию. Тогда страница может напрямую использоватьrequireдля загрузки всех коротких имён модулей.

data-mainЕсть ещё одна важная особенность: когда тег script указывает атрибут data-main, require по умолчанию использует JS, указанный в data-main, в качестве корневого пути. Что это значит? Как в приведённом вышеdata-main="js/main"после настройки, когда мы используемrequire(['jquery'])(без настройки путей jQuery), require автоматически загрузит файл js/jquery.js вместо jquery.js, что эквивалентно конфигурации по умолчанию:

require.config({
    baseUrl : "js"
})

Сторонние модули

Черезrequireзагружаемые модули обычно должны соответствовать спецификации AMD, т.е. использоватьdefineдля объявления модулей. Однако иногда нам нужно загрузить JS, который не следует спецификации AMD. В таких случаях нам нужна другая особенность: shim. shim также немного сложно объяснить. shim дословно переводится как "прокладка", и это значение действительно есть. В настоящее время я в основном использую его в двух местах.
1. Вывод не-AMD модулей: shim нестандартных AMD модулей в используемые модули. Например, в старых версиях jQuery спецификация AMD не была унаследована, поэтому вы не можете напрямую require["jquery"]. В этом случае нужен shim. Например, если я хочу использовать библиотеку Underscore, но она не реализует спецификацию AMD, мы можем настроить её так:

require.config({
    shim: {
        "underscore" : {
            exports : "_";
        }
    }
})

После этой настройки мы можем ссылаться на модуль Underscore в других модулях:

require(["underscore"], function(_){
    _.each([1,2,3], alert);
})
  1. Не-AMD модули в форме плагинов: мы часто используем плагины jQuery, и эти плагины в основном не соответствуют спецификации AMD, например, плагин jquery.form. В этом случае нам нужно подключить плагин form к jQuery с помощью shim:
require.config({
    shim: {
        "underscore" : {
            exports : "_";
        },
        "jquery.form" : {
            deps : ["jquery"]
        }
    }
})

Это также можно сократить как:

require.config({
    shim: {
        "underscore" : {
            exports : "_";
        },
        "jquery.form" : ["jquery"]
    }
})

После этой настройки мы можем использовать jQuery с загруженным плагином.

require.config(["jquery", "jquery.form"], function($){
    $(function(){
        $("#form").ajaxSubmit({...});
    })
})

Итак, это примерно вся базовая конфигурация RequireJS. Есть некоторые расширенные возможности, о которых будет рассказано в следующих статьях.

Источник статьи: https://github.com/liuxey/blog/issues/2