Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var Spirit = new Class({
- Binds: ['hit', 'load'],
- initialize : function (projectPath, libPath) {
- this.projectPath = projectPath.trim();
- this.libPath = fs.realpathSync(libPath);
- this.requirePath = this.projectPath + '/classes/';
- this.spiritRequirePath = this.libPath + '/spirit/classes/';
- },
- // с помощью load мы будем грузить классы, например:
- // spirit.load('Controllers.User');
- // флаг fromSpirit позволит загружать напрямую класс фреймворка,
- // игнорируя классы приложения
- load : function (className, fromSpirit) {
- // объект loaded - это закешированные уже загруженные классы
- var lc = loaded.classes, ls = loaded.spirit, loadedClass;
- if (!fromSpirit) {
- if (!lc[className]) {
- // в первую очередь загружаем класс приложения и пишем его в кеш
- loadedClass = load.call(this, this.requirePath, className);
- lc[className] = loadedClass;
- } else {
- // если нас устраивает класс приложения и он есть в кеше -
- // его можно просто вернуть пользователю
- return lc[className];
- }
- }
- // если нам нужен именно класс Спирита, или в приложении
- // нет такого класса - ищем его в spiritRequirePath
- if ((fromSpirit || !lc[className]) && !ls[className]) {
- loadedClass = load.call(this, this.spiritRequirePath, className);
- ls[className] = loadedClass;
- }
- // Класс - это либо такой из приложения или,
- // если в приложении нету - из Спирита
- var cl = (!fromSpirit && lc[className]) || ls[className];
- if (!cl) {
- // Ексепшены пишут в лог достаточно скудно, потому дополнительно логируем
- console.log('No class «' + className + '», fromSpirit: ' + (fromSpirit?'on':'off'));
- throw 'Spirit.LoadClass.Exception';
- }
- // Возвращаем класс, если удалось найти
- return cl;
- },
- // Неоходимо для изящной загрузки библиотек, например:
- // spirit.loadLib('mysql-libmysqlclient')
- loadLib : function (libName) {
- var ll = loaded.libs;
- if (!ll[libName]) {
- // библиотека должна находится в директории с таким же
- // названием как и основной файл внутри libPath
- var path = this.libPath + '/' + libName + '/' + libName;
- var load = require(path);
- ll[libName] = load;
- }
- return ll[libName];
- },
- // Каждый запрос будет вызван этот метод
- hit : function (req, res) {
- // будет рассмотрен в следующей части
- },
- listen : function (port, url) {
- // Мы можем принять аргументы как listen(8124, '127.0.0.1')
- // И как listen('127.0.0.1:8124')
- if (arguments.length == 1) {
- var parts = port.split(':');
- port = Number(parts[1]);
- url = parts[0];
- }
- // this.hit записана в Binds, потому можно смело передавать как аргумент
- require('http')
- .createServer(this.hit)
- .listen(port, url);
- if (!url.test(/\:\/\//)) {
- url = 'http://' + url;
- }
- console.log('Spirit running at ' + url + ':' + port + '/');
- return this;
- }
- });
- var fs = require('fs');
- var loaded = {
- spirit : {},
- classes : {},
- libs : {}
- };
- var load = function (path, className) {
- // Загрузка класса - точки меняем на слеши и получаем его путь.
- path += (className.replace(/\./g, '/'));
- try {
- var data = require(path);
- } catch (e) {
- return null;
- }
- // Из экспорта мы вызываем функцию с именем класса
- // и передаем объект Spirit. Зачем и как с ним работать?
- // смотрите ниже!
- return data[className](this);
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement