builder-isv
Version:
ISV 模块本地预览与云构建器
109 lines (95 loc) • 2.96 kB
JavaScript
/**
* 渲染入口
*/
;
// UPX 将读取此字段,切换代理
process.env.UPX_MODE = 'ISV';
const path = require('path');
const config = require('./config');
const co = require('co');
const os = require('os');
const Project = require('./models/project');
// 统一渲染器(page and assets)
const Renderer = require('./lib/renderer');
const lessMiddleware = require('less-middleware');
let utils;
/**
* 渲染入口
* @param app Express 实例
* @param defOptions 调用方参数
*/
module.exports = function(app, defOptions) {
process.env.DEF_TICKET = defOptions.DEF_TICKET;
process.env.UPX_ENV = defOptions.UPX_ENV;
utils = require('./lib/utils');
// 工作空间
const workSpace = defOptions.base;
config.projectInfo = new Project(workSpace);
config.defOptions = defOptions;
//defOptions.tmpDir = path.join(defOptions.tmpDir, 'builder-mod', config.projectInfo.projectName);
defOptions.tmpPreviewDir = path.join(defOptions.base, '.tmp-preview');
// 项目
// 进程上增加 utils 用于统一输出日志(考虑到历史上有很多已有插件,因此不做依赖注入)
process.utils = utils;
utils.log.verbose('defOptions', JSON.stringify(defOptions, null, 2));
app.use(lessMiddleware(workSpace, {
debug: defOptions.verbose,
dest: defOptions.tmpPreviewDir,
preprocess: {
less: function(src, req) {
let url = req.originalUrl;
let name = url.match(/\/mod\/(\S+)\//)[1];
return '@MOD_NAME:' + name + ';' + src;
}
}
},
{
compress: false,
sourceMap: true
}
));
// index page
app.get('/', function(req, resp) {
const fs = require('fs');
Renderer.renderXTPL(req, resp, 'index', {
modules: fs.readdirSync(path.join(workSpace, 'mod'))
.map(function(fileName) {
try {
return JSON.parse(fs.readFileSync(path.join(workSpace, 'mod', fileName, 'package.json'), 'utf-8'));
} catch (e) {
return null;
}
})
.filter(function(moduleInfo) {
return !!moduleInfo;
})
});
});
app.get('/:type/:name/index.html', function(req, resp) {
co(function*() {
yield Renderer.renderPage(req, resp);
}).catch(function(err) {
utils.log.error(err.stack || err.message);
resp.status(500);
Renderer.renderXTPL(req, resp, '500', {
message: err.message,
stack: err.stack
});
});
});
app.get('/:type/:name/:assets', function(req, resp) {
co(function*() {
yield Renderer.renderAssets(req, resp);
}).catch(function(err) {
utils.log.error(err.stack || err.message);
resp.status(500);
Renderer.renderXTPL(req, resp, '500', {
message: err.message,
stack: err.stack
});
});
});
process.on('uncaughtException', (err) => {
utils.log.error('未捕获异常:', err.stack);
});
};