Как я могу предотвратить использование оптимизатором Require.js текстового плагина в оптимизированных файлах?
tl;dr: Как сохранить плагин text.js в моем оптимизированном файле, когда все мои текстовые зависимости встроены?
Я использую оптимизатор Require.js (через 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 также включен - он добавляет около 3 КБ и состоит из (насколько я могу судить) теперь совершенно ненужного кода для загрузки внешних текстовых файлов. Я знаю, что 3K не так много, но я стараюсь поддерживать мой код высоко оптимизированным, и, насколько я понимаю, код для текстового плагина совсем не нужен, если мои текстовые зависимости встроены. Я могу сохранить текстовый плагин, добавив exclude=text
к моему r.js
вызов, но если я это сделаю, я получаю сообщение об ошибке, когда я пытаюсь использовать оптимизированный код в браузере, говоря, что плагин text.js не может быть загружен.
Так:
Есть ли какая-либо причина, по которой плагин text.js на самом деле требуется здесь?
Если нет, есть ли вариант конфигурации для
r.js
которые могут исправить это поведение, илиЕсть ли простой плагин для плагина text.js, который я могу включить, чтобы убедить Require.js, что ненужный плагин загружен?
1 ответ
Текстовый плагин действительно необходим, поскольку RequireJS должен проверить, реализует ли плагин метод normalize
перед получением правильного идентификатора модуля.
Чтобы удалить текстовый плагин из сборки, используйте onBuildWrite
настройка для создания пустого модуля плагина, как описано в комментарии к этому вопросу: https://github.com/jrburke/r.js/issues/116 - эта функция должна появиться в будущей версии r.js
Редактировать:
Теперь у 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.