Как правильно опубликовать модуль AMD, чтобы RequireJS мог найти зависимости?

AMD - мой любимый стандарт модулей JS, по той простой причине, что он позволяет правильно определять зависимости модулей анализируемым способом. Скажем, мой модуль использует jquery и lodash:

define(['jquery', 'lodash'], function ($, _) { ... });

Теперь скажите, что я хочу опубликовать этот модуль. Конечно, я хотел бы указать эти зависимости в package.json и /или bower.json, поэтому я могу быть уверен, что они будут установлены. Однако как я могу быть уверен, что jquery и lodash библиотеки найдены загрузчиком AMD (например, RequireJS)?

Похоже, что пользователи моей библиотеки будут вынуждены указывать эти пути вручную:

requirejs.config({
    paths: {
        jquery: '../lib/jquery/jquery-min',
        lodash: '../lib/lodash/dist/lodash'
    }
});

Как разработчик приложения, я бы с этим согласился. Но Я не могу просто предположить, что пользователи моей библиотеки будут делать это автоматически (не говоря уже о совпадении имен), поэтому мне придется документировать дополнительный шаг. Это беспокоит меня. В NodeJS /CommonJS, похоже, есть способ найти правильный файл без указания пути. Я не уверен, как это сделать, но я думаю, что они ищут в наиболее вероятных местах.

Каков предпочтительный способ обработки этого для пакетов AMD?

4 голоса | спросил mhelvens 31 PM00000010000001731 2014, 13:45:17

2 ответа


0

Существует руководство по созданию автономной библиотеки с помощью requirejs здесь .

Также взгляните на этот пример .

По сути, вы оборачиваете свой код начальным и конечным сегментами кода. И укажите это в конфиге.

{
    "baseUrl": "../lib",
    "paths": {
        "principium": "../principium"
    },
    "include": ["../tools/almond", "principium"],
    "exclude": ["jquery", "underscore"],
    "out": "../dist/principium.js",
    "wrap": {
        "startFile": "wrap.start",
        "endFile": "wrap.end"
    }
}

Обратите внимание, что вы исключаете используемые библиотеки jquery и underscore потому что вы ожидаете, что пользователи вашей библиотеки включат их для вас. Вы говорите своим пользователям о зависимостях. Это рекомендуемый подход. Хотя вы можете опустить exclude и разрешить зависимость в свою сборку, это тоже хорошо.

ответил user3995789 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 01 Sep 2014 06:54:34 +0400 2014, 06:54:34
0

RequireJS - это просто загрузчик модулей, а не система управления зависимостями.

Если вы просто хотите обеспечить самый простой уровень интеграции (с минимальной настройкой), объедините зависимости с вашим дистрибутивом. Не требуйте использования систем управления зависимостями, таких как npm или bower, но используйте сценарий сборки для создания одного файла. Затем экспортируйте свой модуль, как если бы он был одним модулем. Вы можете создать автономный модуль с помощью r.js оптимизатора (и использовать almond.js как минимальный внутренний загрузчик модулей, если вы не используете расширенные функции Require.js).

Основным недостатком последнего метода является то, что общий размер кода JavaScript часто превышает исходный метод, поскольку пользователь всегда загружает вашу копию jQuery независимо от того, был ли jQuery уже загружен ранее. Преимущество заключается в том, что вы можете легко менять зависимости, не прося пользователя изменить их конфигурацию.

Если вы не хотите вставлять зависимости, то вы можете связать зависимости с вашей библиотекой следующим образом (используя npm как менеджер зависимостей, например):

define(['./node_modules/lodash/lodash'], function(_) {

Если пользователь желает переопределить зависимость (например, чтобы уменьшить размер файла конечного вывода после использования инструмента сборки), то он может использовать (предполагая, что npm еще раз):

require.config({
    paths: {
        // replace yourmodule's lodash with lodash.js from the module's root
        'node_modules/yourmodule/node_modules/lodash/lodash': 'lodash'
    }
});

Последний метод имеет два недостатка по сравнению с другими методами:

  1. Он не работает с именованными модулями, т.е. модулями, которые определены как define('name', ...);.
  2. Если у вас есть несколько модулей, которые используют зависимость, и вы перемещаете зависимость в другую папку, вам придется искать и заменять все явные пути зависимости.
ответил Rob W 31 PM00000060000001131 2014, 18:22:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132