Пользовательские шаги предварительной обработки для coffeescript?
Есть ли способ добавить этапы предварительной обработки в компилятор кофе по модульному принципу?
Скажем, например, что я хотел расширить функциональность всех массивов и объектов с помощью функций подчеркивания, что позволило бы мне сделать что-то вроде testArray.first()
и собрать его в _.first(testArray)
Это то, что было бы очень опасно делать в простом javascript, так как мне пришлось бы расширить Array.prototype
и может нарушить функциональность массива в других библиотеках. Похоже, что с кофе-сценарием было бы безопасно и весело.
Было бы здорово, если бы был способ сделать это таким образом, что
- Модульный - я мог бы добавить несколько этапов предварительной обработки, извлекая из разных проектов, которые делают программирование более простым и элегантным по-разному
- Интегрирован - я хочу иметь возможность что-то изменить в конфигурационных файлах coffeescript, чтобы мне не приходилось использовать собственный двоичный файл и заменять команду в каждом отдельном инструменте разработки, который вызывает компилятор кофе (для компиляции в реальном времени и т. Д.),
Это существует в coffeescript? Если нет, то кажется, что так и должно быть. Я сообщу об этом разработчикам, если никто не слышал об этом.
1 ответ
У CoffeeScript нет системы плагинов. Там нет простого выхода, если вы хотите настроить его. Вы можете раскошелиться на репозиторий CoffeeScript и изменить компилятор в соответствии с вашими требованиями. Однако это означает, что вы должны поддерживать свой форк компилятора, регулярно извлекая обновления из основного репо.
Смотрите следующий код репозитория CoffeeScript ( https://github.com/jashkenas/coffeescript/blob/master/lib/coffee-script/coffee-script.js#L195):
....
o[k] = v;
}
o.bare = true;
js = compile(code, o);
if (sandbox === global) {
return vm.runInThisContext(js);
} else {
return vm.runInContext(js, sandbox);
}
....
Вы можете добавить новый метод в этот файл
precompile = function (code) {
// do pre-processing here
}
и сделать
js = compile(precompile(code), o);
Я не пытался сделать это, поэтому вы можете ударить по некоторым стенам, делая это. Хотя изменения, которые вы хотите, достаточно просты, чтобы не беспокоиться о лексере.
Хотя вы можете написать свой собственный анализатор для внесения этих изменений на любом языке и использовать grunt / gulp, чтобы объединить компиляцию кофе и шаг перед компиляцией. Я бы порекомендовал этот метод.