API
Node API
Каждой технологии в init
приходит экземпляр класса (instance) ноды (Node), для которой необходимо собирать таргеты.
С помощью ноды технология взаимодействует с процессом сборки.
Основные методы класса Node:
node.getTargetName
// Возвращает имя таргета ноды без суффикса. Например, для ноды 'pages/index' результат — index.
String Node::getTargetName()
// Возвращает имя таргета ноды с суффиксом. Например, для ноды 'pages/index' с суффиксом 'js' результат — 'index.js'.
String Node::getTargetName(String suffix)
node.unmaskTargetName
// Демаскирует имя таргета ноды. Например, для ноды 'pages/index' и maskedTargetName='?.css', результат — 'index.css'.
String Node::unmaskTargetName(String maskedTargetName)
node.resolvePath
// Возвращает абсолютный путь к таргету.
String Node::resolvePath(String targetName)
Пример
var fs = require('fs');
fs.writeFileSync(this.node.resolvePath(this.node.getTargetName('js')), 'alert("Hello World!");', 'utf8');
node.resolveTarget
// Оповещает ноду о том, что таргет собран. Опционально принимает результат сборки.
// Результатом может быть любой объект, который может быть полезен другим технологиям для продолжения сборки.
undefined Node::resolveTarget(String targetName[, Object result])
Примеры
// #1
this.node.resolveTarget('index.css');
// #2 Получает имя таргета динамически с помощью суффикса.
this.node.resolveTarget(this.node.getTargetName('css'));
// #3 Получает имя таргета путем демаскирования таргета.
this.node.resolveTarget(this.node.unmaskTargetName('?.css'));
// #4 Передает значение.
var target = this.node.unmaskTargetName('?.deps.js'),
targetPath = this.node.resolvePath(target);
delete require.cache[targetPath]; // Избавляемся от кэширования в nodejs.
this.node.resolveTarget(target, require(targetPath));
node.rejectTarget
// Оповещает ноду о том, что таргет не может быть собран из-за ошибки.
undefined Node::rejectTarget(String targetName, Error error)
Примеры
// #1
this.node.rejectTarget('index.css', new Error('Could not find CSS Tools.'));
// #2 Получает имя таргета динамически с помощью суффикса.
this.node.rejectTarget(this.node.getTargetName('css'), new Error('Could not find CSS Tools.'));
node.requireSources
// Требует у ноды таргеты для дальнейшей сборки, возвращает промис.
// Промис выполняется, возвращая массив результатов, которыми резолвились требуемые таргеты.
// ВАЖНО: Не все технологии резолвят таргеты с результатом.
// В данный момент резолвят с результатом технологии: levels, deps*, files.
Promise(Object[]) Node::requireSources(String[] targetNames)
Пример
Необходимо объединить в один файл index.css
и index.ie.css
и записать в index.all.css
.
var vowFs = require('vow-fs');
// ...
build: function() {
var _this = this;
return this.node.requireSources(['index.css', 'index.ie.css']).then(function() {
return Vow.all([vowFs.read(_this.node.resolvePath('index.css'), 'utf8'), vowFs.read(_this.node.resolvePath('index.ie.css'), 'utf8')]).then(function(res) {
return vowFs.write(_this.node.resolvePath('index.all.css'), res.join('\n'), 'utf8').then(function() {
_this.node.resolveTarget('index.all.css');
});
});
});
}
// ...
node.relativePath
// Возвращает путь к таргету относительно ноды.
String Node::relativePath(String targetName)
node.getDir
// Возвращает полный путь к папке ноды.
String Node::getDir()
node.getRootDir
// Возвращает полный путь к корневой папке проекта.
String Node::getRootDir()
node.getLogger
// Возвращает экземпляр класса логгера для ноды.
Logger Node::getLogger()
Пример
this.node.getLogger().log('Hello World');
node.getNodeCache
// Возвращает экземпляр класса кэша для таргета ноды.
Cache Node::getNodeCache(String targetName)
Кэширование позволяет избегать повторной сборки файлов, для которых сборка не требуется. Кэшируется время изменения исходных и конечных файлов после окончания сборки каждой технологии. Логика кэширования реализуется в каждой технологии индивидуально для максимальной гибкости.
Валидация кэша производится с помощью методов Boolean needRebuildFile(String cacheKey, String filePath)
и Boolean needRebuildFileList(String cacheKey, FileInfo[] files)
.
Сохранение информации о файлах в кэш производится помощью методов undefined cacheFileInfo(String cacheKey, String filePath)
и undefined cacheFileList(String cacheKey, FileInfo[] files)
.
node.getSharedResources
Набор ресурсов, которые могут быть использованы в технологиях:
JobQueue - пул дочерних процессов для выполнения «тяжелых» задач.
Пример
Контент файла some-processor.js
:
module.exports = function(arg1, arg2) {
var res = null;
// Здесь выполняется какая-то «нагруженная» работа, возможно с использованием промисов
return res;
}
В технологии:
var jobQueue = this.node.getSharedResources().jobQueue;
// Выполняет задачу в отдельном процессе, возвращает промис с результатом
return jobQueue.push(require.resolve('./path/to/processor'), arg1, arg2);