Есть ли способ настроить RequireJS, чтобы всегда использовать определенный плагин, когда определенное расширение было найдено?
Я хотел бы избежать ручного вызова плагина, как require('es6!myModule')
Какой-то вид конфигурации a-la WebPack - это то, что я ищу, но мне не очень повезло в документах и в Интернете
test: /\.js$/,
use: [{
loader: 'babel-loader',
options: {
plugins: ['react-hot-loader/babel'],
},
}
RequireJS очень ограниченная поддержка, которую он обеспечивает тем, что вы пытаетесь сделать. Он не имеет каких-либо возможностей сопоставления шаблонов в общем смысле слова "сопоставление образцов". В частности, нет способа сообщить RequireJS о соответствии файлам с определенным расширением. Если вы должны придерживаться RequireJS, а набор модулей, которые должны получить плагин, является фиксированным набором, известным при создании вашего приложения, вы можете создать такую карту:
map: {
"*": {
foo: "plugin!foo",
bar: "plugin!bar",
// ...
}
}
"*"
самом деле не является глотком или каким-либо сложным сочетанием шаблонов. Это больше похоже на кодированное ключевое слово, которое означает "любой модуль".
У меня есть приложение, написанное в TypeScript, которое я должен выполнить через RequireJS и иметь возможность обрабатывать через Webpack. У меня есть несколько модулей, которые по сути являются данными JSON. Компилятор TypeScript не любит видеть имена модулей в импорте модулей. Поэтому, чтобы заставить все работать нормально, я держу имена плагинов из кода кода TypeScript, и я использую map
подобную приведенной выше, чтобы RequireJS использовал json
плагин для модулей, которые в ней нуждаются. Я управляю картой вручную, потому что это всего лишь несколько файлов.
SystemJS поддерживает загрузку модулей AMD и имеет гораздо более сложные средства настройки, чем RequireJS. То, что RequireJS вызывает "плагин", называется "загрузчиком" в SystemJS. Вы можете использовать опцию meta
для привязки загрузчика с шаблоном файлов:
{
baseURL: "lib/",
paths: {
// ...
},
meta: {
"something/*.js": {
loader: "some-loader",
}
}
}