UNPKG

atm-node

Version:
226 lines (203 loc) 7.99 kB
var path = require('path'); var fs = require('fs'); var getDepsFunc = require('atm-get-deps'); var common = require('atm-common'); var apiFunc = require('atm-api'); module.exports = function (projectPath) { var api = apiFunc(projectPath); return function (req, res, next) { //var arr = /^\/dev\/[\w\W]*?\/([\d]+\.[\d]+\.[\d]+)\/views/.exec(req.path), var routeArr = /^\/dev\/([^\/]+)\/([^\/]+)\/([\d]+\.[\d]+\.[\d]+)\/views/.exec(req.path), $exports = '', $family = '', $module = '', $version = '', settings = api.getSettings(), destination = req.query[settings.debugParam] || req.body[settings.debugParam] || 'dev', getDeps = getDepsFunc(projectPath, destination), domain = api.getDomain(destination), status = false, jsonData = {}, interfaceIds, callback, useIds, //入口js atmjs = res.locals.atmjs = {}; if (routeArr) { $family = routeArr[1]; $module = routeArr[2]; $version = routeArr[3]; if (settings.coreName === $family) { $exports = $module; }else if (settings.libName === $family) { $exports = $module + '/' + $version; } else { $exports = $family + '/' + $module + '/' + $version; } } atmjs.url = function (uri, dest, outOfFamily) { if (dest === true) { dest = 'dev'; outOfFamily = true; } uri = outOfFamily ? uri : [$family, uri].join('/') uri = uri .replace(/\$exports/g, $exports) .replace(/\$family/g, $family) .replace(/\$module/g, $module) .replace(/\$version/g, $version) .replace(/\/\//g, '/'); dest = dest || destination; var domain = api.getDomain(dest); return [domain, uri].join('/'); }; // 关联的routes会重新构建 atmjs.hook = function (routes) { if (destination === 'dev') { api.buildRelations(routes, destination); } return this; }; // atmjs.use 会重新构建入口文件对应的模块 atmjs.use = useOrImport(true); // atmjs.import 不会重新构建入口文件对应的模块 atmjs.import = useOrImport(false); atmjs.loadCss = function () { return status ? getCssTags() : ''; }; atmjs.loadJs = function () { return status ? getLoaderTag() + getJsTags() + getUseScripts() : ''; }; // 解析id对应的路径,如果pkg为true,且文件在合并文件里面,则返回合并文件路径,否则返回未合并文件 atmjs.resolve = function (id, pkg) { id = id .replace(/\$exports/g, $exports) .replace(/\$family/g, $family) .replace(/\$module/g, $module) .replace(/\$version/g, $version); try{ var route = common.getRoute(projectPath, id, 'dev'), manifestPath = path.join(settings.staticPath, 'dev', route, 'manifest.json'), content = fs.readFileSync(manifestPath), map = JSON.parse(content), uri; var obj = map.res[id], pkgId = obj.pkg; if (pkg && pkgId) { uri = map.pkg[pkgId].uri; } else { uri = obj.uri; } return settings.destinations['dev'].domain + uri; } catch(err) { throw err; } }; next && next(); function useOrImport(build) { return function (ids, cb) { if (status) { common.error('atmjs.use or atmjs.import is called more than once!'); } // 把use或import里面的$version 替换成 对应的版本 if (routeArr) { if (Array.isArray(ids)){ var arr = []; ids.forEach(function (id) { arr.push( id .replace(/\$exports/g, $exports) .replace(/\$family/g, $family) .replace(/\$module/g, $module) .replace(/\$version/g, $version) ); }); ids = arr; } else if(typeof ids === 'string'){ ids = ids .replace(/\$exports/g, $exports) .replace(/\$family/g, $family) .replace(/\$module/g, $module) .replace(/\$version/g, $version); } } useIds = typeof ids === 'string' ? ids : ids.concat(); // 入口id var interfaceId = ids; if (Array.isArray(ids)) { interfaceId = ids[ids.length - 1]; } if (destination === 'dev' && build) { api.buildVersions(interfaceId, destination); } interfaceIds = ids; callback = cb; jsonData = getDeps( interfaceIds, settings.loaderId ); status = true; return atmjs; } } // 获取加载器的script标签 function getLoaderTag() { if (jsonData.loader) { var uri = jsonData.loader; var config = jsonData.config; if (config) { config = ' data-config=\'' + config + '\''; } else { config = ''; } if (domain && uri.indexOf(domain) == -1) { uri = domain + uri; } return '<script id="atmjsnode" type="text/javascript" src="' + uri + '" data-from="atm" data-base="' + domain + '"'+config+'></script>'; } else { return ''; } } // 获取所依赖同步的js的标签 function getJsTags() { var html = []; var arr = jsonData.js; for (var i in arr) { html.push(getJsTag(arr[i])); } return html.join('\n'); } function getJsTag(uri) { if (!uri) { return ''; } if (domain && uri.indexOf(domain) == -1) { uri = domain + uri; } return '<script data-from="atm" type="text/javascript" src="' + uri + '"></script>' } // 生成入口文件调用的标签 function getUseScripts() { if (jsonData.onlyCss) { return ''; } var ids = JSON.stringify(useIds); var codes = callback ? (ids + ',' + String(callback)) : ids; return '<script type="text/javascript">atmjs.use(' + codes + ');</script>'; } function getCssTags() { var html = []; var arr = jsonData.css; for (var i in arr) { html.push(getCssTag(arr[i])); } return html.join('\n'); } function getCssTag(uri) { if (domain && uri.indexOf(domain) == -1) { uri = domain + uri; } return '<link data-from="atm" type="text/css" rel="stylesheet" href="' + uri + '" />'; } } }