Подтвердить что ты не робот

Как я могу предотвратить включение оптимизатора Require.js в текстовый плагин в файлы с оптимизацией?

tl; dr: Как сохранить плагин text.js из моего оптимизированного файла, когда все мои текстовые зависимости вложены?

Я использую Require.js optimizer (через Node) для оптимизации некоторых JS файлов в моем проекте. Я использую текстовый плагин для загрузки текстовых зависимостей (HTML-шаблоны, CSS). У меня есть модуль, который я хочу оптимизировать, включая его зависимости, например:

define(['text!core/core.css'], function(styles) {
    // do setup stuff, return an object
});

Документы Require.js говорят, что файл core/core.css будет встроен, когда я запустил оптимизатор r.js, который я вызываю следующим образом:

$ r.js -o baseUrl=./src name=core out=release/test.js

Tracing dependencies for: core
Uglifying file: c:/path/release/test.js

c:/path/release/test.js
----------------
c:/path/src/text.js
text!core/core.css
c:/path/src/core.js

Хорошая новость заключается в том, что это работает. Когда я смотрю на оптимизированный файл, я вижу встроенный текст, что-то вроде этого:

define("text!core/core.css",[],function(){return"some CSS text"}),
define("core",["text!core/core.css"],function(a){ ... })

Плохая новость: плагин text.js также включен - он добавляет около 3K и состоит из (насколько я могу судить) теперь совершенно ненужного кода для загрузки внешних текстовых файлов. Я знаю, что 3K не так много, но я стараюсь, чтобы мой код был сильно оптимизирован, и насколько я понимаю, код для текстового плагина совсем не нужен, если мои текстовые зависимости встроены. Я могу оставить текстовый плагин, добавив exclude=text к моему вызову r.js, но если это так, я получаю сообщение об ошибке, когда пытаюсь использовать оптимизированный код в браузере, говоря, что плагин text.js не может быть загружен.

Итак:

  • Есть ли причина, по которой плагин text.js действительно ?

  • Если нет, существует ли параметр конфигурации для r.js, который может исправить это поведение, или

  • Есть ли легкий плагин для плагина text.js, который я могу включить, чтобы убедить Require.js, что загружен ненужный плагин?

4b9b3361

Ответ 1

Текстовый плагин действительно необходим, так как RequireJS должен проверить, реализует ли модуль метод normalize до получения правильного идентификатора модуля.

Способ удаления текстового плагина из сборки заключается в использовании параметра onBuildWrite для создания пустого модуля плагина, как описано в этом номере комментария: https://github.com/jrburke/r.js/issues/116#issuecomment-4185237 - Эта функция должна приземляться на будущую версию r.js

Edit:

r.js теперь имеет параметр, называемый stubModules, который выполняет именно это:

//Specify modules to stub out in the optimized file. The optimizer will
//use the source version of these modules for dependency tracing and for
//plugin use, but when writing the text into an optimized layer, these
//modules will get the following text instead:
//If the module is used as a plugin:
// define({load: function(id){throw new Error("Dynamic load not allowed: " + id);}});
//If just a plain module:
// define({});
//This is useful particularly for plugins that inline all their resources
//and use the default module resolution behavior (do *not* implement the
//normalize() method). In those cases, an AMD loader just needs to know
//that the module has a definition. These small stubs can be used instead of
//including the full source for a plugin.
stubModules : ['text']

Для дополнительных опций r.js проверьте файл example.build.js.