atm-node
Version:
226 lines (203 loc) • 7.99 kB
JavaScript
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 + '" />';
}
}
}