Именованный модуль против модуля "Без имени" в RequireJS
Мы можем создать модуль в requireJS, указав ему имя:
define("name",[dep],function(dep) {
// module definition
});
или мы можем создать его, исключая имя:
define([dep],function(dep) {
// module definition
});
Каков лучший способ создать модуль? Я знаю, что RequireJS рекомендует избегать назначения имен модулей.
Но я хочу знать, в каких сценариях мы делаем, и не нужно указывать модуль имени. Это влияет на использование? Каковы плюсы и минусы каждого из них?
Ответы
Ответ 1
Это то, что требует документация requirejs на тему именованных модулей:
Обычно они генерируются инструментом оптимизации. Вы можете явно называть модули самостоятельно, но это делает модули менее переносимыми - если вы переместите файл в другой каталог, вам нужно будет изменить имя. Обычно лучше избегать кодирования в имени для модуля и просто позволить инструменту оптимизации записывать имена модулей. Инструменту оптимизации необходимо добавить имена, чтобы в файл можно было добавить несколько модулей, чтобы обеспечить более быструю загрузку в браузере.
Но позвольте сказать вам, что хотите ваш модуль иметь одно известное имя, которое позволяет всегда требовать его таким же образом от любого другого модуля. Вам нужно использовать вызов define
с именем? Не за что. Вы можете использовать paths
в своей конфигурации:
paths: {
'jquery': 'external/jquery-1.9.1',
'bootstrap': 'external/bootstrap/js/bootstrap.min',
'log4javascript': 'external/log4javascript',
'jquery.bootstrap-growl': 'external/jquery.bootstrap-growl',
'font-awesome': 'external/font-awesome'
},
С этой конфигурацией jQuery может потребоваться как "jquery"
, Twitter Bootstrap как "bootstrap"
и т.д. Лучшей практикой является оставить вызов define
с именем оптимизатор.
Ответ 2
Сверху моей головы единственный модуль, который я видел, который использует метод named module, - это jQuery. Лично я бы также рекомендовал использовать шаблон неназванного модуля.
Именованные модули
Именованием модуля, требуемое имя не зависит от его местоположения. Другой автор модулей мог вслепую потребовать "jquery", не зная путь к модулю. Это полезно, если вы разрабатываете повторно используемый модуль (вне вашего проекта). Однако у него есть недостаток, который (используя jQuery в качестве примера), вам нужно будет добавить и вписать в свойство конфигурации paths
для RequireJS указать правильное расположение файла. В противном случае RequireJS не может найти файл для загрузки, если он не помещен в вашу базовую требуемую директорию.
Безмозглые модули
Я считаю, что это предпочтительнее, потому что вы можете использовать относительные требуемые пути. Скажем, у вас есть два файла modules/ClassA
и modules/ClassB
. ClassB
может потребоваться ClassA
с помощью './ClassA'
, и при необходимости можно перемещать всю директорию. Используя неназванный модуль, вы также исключаете возможность столкновения имен, если только вам не удастся найти способ размещения двух файлов в одном каталоге с тем же именем.