Статьи

Использование генераторов с арфой

Я писал (и представлял) на Арфе и раньше, как и на Джекилле . В целом, я думаю, что Арф намного проще в использовании, но Джекилл более мощный. Один из способов, которым Джекилл превосходит Арфу, — это генераторы . Это скрипт, который вы можете написать, который автоматизирует создание файлов на этапе генерации. Я писал об этом несколько месяцев назад ( мой опыт работы с Jekyll ), но если вам не хочется читать весь блог, позвольте мне объяснить, какую проблему может решить генератор.

Большинство статических генераторов сайтов имеют однозначное соответствие между шаблонами и конечными страницами вашего сайта. Так, например, у меня может быть файл about.handlebars, который отображается в файле about.html при создании сайта. Ваш генератор может создать about.html, взяв about.handlebars, layout.whither и различные включения, но у вас есть как минимум один файл, связанный с одним URL.

Это работает хорошо, за исключением нескольких случаев. Категории является отличным примером этого. Если вы хотите представлять категории на вашем статическом сайте, вам нужно создать один файл для каждой категории, например: bluemix.handlebars, phonegap.handlebars, kittens.handlebars. Вы, вероятно, включите в каждый код один и тот же код (или, что еще лучше, используйте включение), но суть в том, что вам нужно создать физический файл для каждого элемента.

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

Я недавно думал об этом в отношении Арфы, и мне пришло в голову, что у меня был довольно простой способ получить такое же поведение. Я склонен думать о Node.js с точки зрения веб-приложений / сайта, но вы также можете использовать Node.js для простых скриптов. Да, все знают это, я знаю это, я просто не думаю об этом очень часто. Поэтому, учитывая, что я использую Harp и мои данные доступны в JSON-файле, нет никаких причин, по которым я не могу использовать простой скрипт Node.js для выполнения большей части тех же действий, которые выполняют генераторы Jekyll. Он не будет автоматическим, другими словами, мне придется запускать его вручную, но я мог бы сделать его частью сценария сборки (Grunt, Gulp и т. Д.), Чтобы я мог автоматизировать все это.

Вот реальный пример. В моем тесте я работал над версией CFLib для Harp . У него есть различные категории, которые я закодировал в JSON:

{
"CMFLLib":{
"desc":"A library that mimics CFML tags. This allows for CFML tags inside of cfscript. This is primarily a CFMX only library."
},
"DataManipulationLib":{
"desc":"DataManipulationLib is a ColdFusion UDF library containing data manipulation functions. This is a general purpose data \"munging\" type library."
},
"DatabaseLib":{
"desc":"A library containing database specific functions (written in CFML), organized by DB platform."
},
"DateLib":{
"desc":"This library is for date/time related function. Specifically, items that work on date or time based objects."
},
"FileSysLib":{
"desc":"FileSysLib is a ColdFusion UDF library containing functions that interact with the file system at various levels. These levels typically include drives, directories, and files."
},
"FinancialLib":{
"desc":"This library contains a set of UDFs that support financial type operations, including things like loan and interest calculations."
},
"MathLib":{
"desc":"A set of mathematical functions. This includes geometry, trig, statistical, and general math functions. These functions typically perform calculations."
},
"NetLib":{
"desc":"A library for Internet related UDFs. This library includes UDFs that retrieve pages from web servers, translate host addresses, and other operations related to Internet operations."
},
"ScienceLib":{
"desc":"A set of UDFs dedicated to scientific equations. This includes weather, astronomy, and other science fields."
},
"SecurityLib":{
"desc":"A set of security related functions."
},
"StrLib":{
"desc":"StrLib is a ColdFusion UDF library containing string (parsing, formatting) functions not included in the core CFML language. These functions typically will translate/verify strings."
},
"UtilityLib":{
"desc":"A set of utility functions for dealing with miscellaneous tasks such as state management, etc."
}
}

Я использую эти данные на первой странице, чтобы динамически перечислять библиотеки. Но я также могу использовать его в скрипте Node.js:

var fs = require("fs");

console.log("Generating libraries");
var libs = require("../public/library/_data.json");

var libraryTemplate = fs.readFileSync(__dirname+"/templates/library.html", "utf8");

for(var key in libs) {
var newFile = __dirname+"/../public/library/"+key+".ejs";
var data = libraryTemplate;
console.log("Creating "+newFile);
fs.writeFileSync(newFile, libraryTemplate);
}

Таким образом, все, что я делаю, — это чтение в моем JSON, чтение в шаблоне, который я создал для представления конкретной библиотечной страницы, а затем запись в физические файлы, чтобы Harp мог использовать его при создании сайта. В моем случае мой шаблон просто включает:

<%- partial("_library.ejs") %>

В котором я встроил код для обработки отображения библиотеки. Да, так что это довольно очевидно, и я почти уверен, что некоторые пользователи Harp уже делают это, но я подумал, что это было довольно аккуратно, и это заставило меня переоценить, когда я буду использовать Harp по сравнению с Jekyll. (Я просто хотел бы, чтобы они поддержали больше, чем Jade и EJS.)