export.js 4.91 KB
const { relative, dirname } = require("path");
const gulp = require("gulp");
const imagemin = require("gulp-imagemin");
const replace = require("gulp-replace");
const del = require("del");
const pump = require("pump");
const cleanCss = require("../plugin/clean-css");
const util = require("../common/util");
const { DEFAULT_REL_BUILD_TASK } = require("../common/constants");

module.exports = (baseUrl, mainoutput) => {
    const _path = `${baseUrl}/export`;
    const _js = mainoutput.js;
    const _css = mainoutput.css;
    const _html = mainoutput.html;
    const config = {
        src: {
            css: `${_path}/css/**/*.css`,
            images: `${baseUrl}/images/plugin/**/*`,
            js: [`${_js}/**/*`, `!${_js}/*.js`],
            html: `${_path}/template/**/*.html`
        },
        output: {
            css: `${_path}/css`,
            images: `${_path}/images/plugin`,
            js: `${_path}/js`,
            html: `${_path}/template`
        },
        clean: [`${_path}/**/*`, `!${_path}/*.html`]
    };
    const { src, output } = config;
    const TASK_EXPORT_CLEAN = "export-clean";
    const _task = util._task([DEFAULT_REL_BUILD_TASK, TASK_EXPORT_CLEAN]);

    const _export = {
        _clean: () => {
            gulp.task(TASK_EXPORT_CLEAN, [DEFAULT_REL_BUILD_TASK], cb => {
                return del(config.clean, { force: true });
            });
            return TASK_EXPORT_CLEAN;
        },
        _css: () => {
            let taskName = "export-css";
            _task(taskName, cb => {
                pump([
                    gulp.src(`${_css}/**/*.css`),
                    gulp.dest(output.css)
                ], cb);
            });

            return taskName;
        },
        _transformCss: () => {
            let taskName = "export-transform-css";

            _task(taskName, ['export-css'], cb => {
                let _transform = (propName, propVal, filepath) => {
                    if (propName.indexOf('background') > -1 && propVal.indexOf('/mobilemode/mobile/images') > -1) {
                        const rel = relative(dirname(filepath), `${output.images}`).replace(/\\/g, "/");

                        return propVal.replace('/mobilemode/mobile/images/plugin', rel);
                    }
                };

                pump([
                    gulp.src(src.css),
                    cleanCss({ rebase: false, transform: _transform }),
                    gulp.dest(output.css)
                ], cb);
            });

            return taskName;
        },
        _imagemin: () => {
            let taskName = "export-image";

            _task(taskName, cb => {
                pump([
                    gulp.src(src.images),
                    imagemin(),
                    gulp.dest(output.images)
                ], cb);
            });

            return taskName;
        },
        _html: () => {
            let taskName = "export-html";

            _task(taskName, cb => {
                pump([
                    gulp.src(`${_html}/**/*`),
                    gulp.dest(output.html)
                ], cb);
            });

            return taskName;
        },
        _jsminify: () => {
            let taskName = "export-js";

            _task(taskName, cb => {
                pump([
                    gulp.src(src.js),
                    replace(/\/mobilemode\/mobile\/(dist|page\/app.*?\/)/g, match => {
                        return "./";
                    }),
                    gulp.dest(output.js)
                ], cb);
            });

            return taskName;
        },
        _cleanJs: () => {
            let taskName = "export-cleanJS";

            _task(taskName, ['export-js'], cb => {
                const modes = ["cacheManager", "portal", "main", "main_demo", "extension"];

                return del(modes.map(m => `${output.js}/${m}`), { force: true });
            });

            return taskName;
        },
        _cleanCss: () => {
            let taskName = "export-cleanCss";

            _task(taskName, ['export-transform-css'], cb => {
                const modes = ["cacheManager", "portal", "mobile.css", "!(main-default).css", "+(common|component|service)/*-!(default).css"];

                return del(modes.map(m => `${output.css}/${m}`), { force: true });
            });

            return taskName;
        },
        _del: () => {
            let taskName = "export-del-unused"; // 删除dist目录下 export相关文件

            _task(taskName, ['export-css', 'export-js'], () => {
                return del([`${_js}/main_export`], { force: true });
            });

            return taskName;
        }
    };

    return {
        regsiter: () => {
            let { _clean, _css, _transformCss, _html, _imagemin, _jsminify, _cleanJs, _cleanCss, _del } = _export;

            gulp.task("export", [_clean(), _css(), _transformCss(), _imagemin(), _html(), _jsminify(), _cleanJs(), _cleanCss(), _del()]);
        },
        config: config
    };
};