UNPKG

builder-isv

Version:

ISV 模块本地预览与云构建器

109 lines (95 loc) 2.96 kB
/** * 渲染入口 */ 'use strict'; // 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); }); };