Όλα τα προσαρμοσμένα εργαλεία μεταγλώττισης συστατικών στοιχείων ακολουθούν το ίδιο μοντέλο με τα εργαλεία μεταγλώττισης σελίδων και μπορούν να δημιουργηθούν για διατάξεις ενότητας, προσαρμοσμένα συστατικά στοιχεία και διατάξεις περιεχομένου.
Κατά τη μεταγλώττιση, η εντολή cec compile-template θα αναζητήσει ένα αρχείο compile.js στην ίδια τοποθεσία με το αρχείο render.js για το συστατικό στοιχείο:
src
components
<yourComponent>
assets
render.jscompile.jsΕάν αυτό το αρχείο δεν υπάρχει, το συστατικό στοιχείο δεν μεταγλωττίζεται και θα αποδίδεται κατά τον χρόνο εκτέλεσης.
Εάν το αρχείο υπάρχει, χρειάζεται να υλοποιήσει ένα περιβάλλον εργασίας compile(), το οποίο επιστρέφει μια τιμή Promise. Για παράδειγμα, το ακόλουθο Starter-Blog-Author-Summary είναι ένα προσαρμοσμένο εργαλείο μεταγλώττισης διάταξης περιεχομένου:
var fs = require('fs'),
path = require('path'),
mustache = require('mustache');
var ContentLayout = function (params) {
this.contentClient = params.contentClient;
this.contentItemData = params.contentItemData || {};
this.scsData = params.scsData;
};
ContentLayout.prototype = {
contentVersion: '>=1.0.0 <2.0.0',
compile: function () {
var compiledContent = '',
content = JSON.parse(JSON.stringify(this.contentItemData)),
contentClient = this.contentClient;
// Store the id
content.fields.author_id = content.id;
if (this.scsData) {
content.scsData = this.scsData;
contentType = content.scsData.showPublishedContent === true ?
'published' : 'draft';
secureContent = content.scsData.secureContent;
}
// calculate the hydrate data
content.hydrateData = JSON.stringify({
contentId: content.id,
authorName: content.fields['starter-blog-author_name']
});
try {
// add in style - possible to add to <head> but inline for
simplicity
var templateStyle = fs.readFileSync(path.join(__dirname,
'design.css'), 'utf8');
content.style = '<style>' + templateStyle + '</style>';
var templateHtml = fs.readFileSync(path.join(__dirname,
'layout.html'), 'utf8');
compiledContent = mustache.render(templateHtml, content);
} catch (e) {
console.error(e.stack);
}
return Promise.resolve({
content: compiledContent,
hydrate: true // note that we want to hydrate this component using the render.js hydrate() function. This is required for when the user clicks on the author
});
}
};
module.exports = ContentLayout;