statics.js 2.91 KB
const _ = require('lodash');
const config = global.yoho.config;

module.exports = (app) => {
    let manifest,
        manifestQcdn;
    let assetUrl = config.assetUrl,
        assetUrlQcdn = assetUrl.replace(/\/\/cdn.yoho.cn/gi, '//qcdn.yoho.cn');

    if (!app.locals.devEnv) {
        let manifestPath = '../../manifest.json';

        if (app.locals.isTest) {
            manifestPath = `../../dist/statics/${config.appName}/${app.locals.version}/manifest.json`;
        }

        manifest = require(manifestPath);
    }

    if (manifest) {
        try {
            let strManifest = JSON.stringify(manifest);

            strManifest = strManifest.replace(/\/\/cdn.yoho.cn/gi, '//qcdn.yoho.cn');

            manifestQcdn = JSON.parse(strManifest);
        } catch(e) { // eslint-disable-line
            manifestQcdn = manifest;
        }
    }

    function getStatic(path, def, qcdn) {
        return _.get(qcdn ? manifestQcdn : manifest, path, `${config.assetUrl}${def}`);
    }

    function getPreloads(list, type, cross) {
        let _list = [];

        _.forEach(list, url => {
            _list.push({url, type, cross});
        });

        return _list;
    }

    return (req, res, next) => {
        res.on('beforeRender', (params) => {
            if (params) {
                const qcdn = _.get(req.app.locals, 'wap.qcloud_cdn');
                const {data} = params;
                const {module: moduleName, page, localCss, isFeature, vue} = Object.assign({}, res.locals, data);

                const getStaticWithCdn = (path, def) => {
                    return getStatic(path, def, qcdn);
                };

                if (moduleName && page) {
                    const statics = {
                        name: `${moduleName}.${page}`,
                        styles: [],
                        javascripts: [
                            getStaticWithCdn('common.vendors.js', 'js/vendors.js'),
                            getStaticWithCdn('common.main.js', 'js/main.js'),
                        ]
                    };

                    if (isFeature || localCss || vue) {

                        if (!isFeature) {
                            statics.styles.push(getStaticWithCdn('common.main.css', 'css/main.css'));
                        }
                        statics.styles.push(
                            getStaticWithCdn(`pages.${moduleName}.${page}.css`, `css/page.${moduleName}.${page}.css`));
                    } else {
                        statics.styles.push(getStaticWithCdn('common.index.css', 'css/index.css'));
                    }

                    res.locals.statics = statics;
                    res.locals.staticAssetUrl = qcdn ? assetUrlQcdn : assetUrl;
                    res.locals.preloads = _.concat(getPreloads(statics.styles, 'style'),
                        getPreloads(statics.javascripts, 'script', true));
                }
            }
        });
        return next();
    };
};