UNPKG

@gdjiami/cli

Version:

CLI for build front end project.

203 lines (202 loc) 8.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getEntries = void 0; var tslib_1 = require("tslib"); /** * 多页入口相关方法 */ var glob_1 = tslib_1.__importDefault(require("glob")); var path_1 = tslib_1.__importDefault(require("path")); var json5_1 = tslib_1.__importDefault(require("json5")); var fs_extra_1 = tslib_1.__importDefault(require("fs-extra")); var chalk_1 = tslib_1.__importDefault(require("chalk")); var uniq_1 = tslib_1.__importDefault(require("lodash/uniq")); var difference_1 = tslib_1.__importDefault(require("lodash/difference")); var utils_1 = require("../../utils"); var constants_1 = require("../../constants"); var paths_1 = tslib_1.__importDefault(require("../../paths")); var HtmlWebpackPlugin = require('html-webpack-plugin'); var PageLessFileRegexp = /.*\/(.*)\.page\..*$/; /** * scan entries in src */ function getEntries(option) { var context = option.context; var entries = {}; var templatePlugins = []; var templates = getTraditionalEntries(option); var traditionalEntries = Object.keys(templates); var pageLessEntries = getPagelessEntries(option); var electronEntries = getElectronEntries(option); var defaultHtmlTempalte = getDefaultTemplate(); // 检验是否找到指定的入口文件 checkEntryExisting(traditionalEntries.concat(electronEntries), option); // 剔除.page文件 difference_1.default(traditionalEntries, pageLessEntries).forEach(function (page) { entries[page] = ["./" + page]; // 生成html-webpack-plugin var tplPath = path_1.default.join(context, page + "." + templates[page]); templatePlugins.push(new HtmlWebpackPlugin(tslib_1.__assign(tslib_1.__assign({}, getCommonTemplatePluginOptions(page, option)), { template: tplPath }))); }); pageLessEntries.forEach(function (page) { entries[page] = ["./" + page + ".page"]; var tplPath = traditionalEntries.indexOf(page) !== -1 ? path_1.default.join(context, page + "." + templates[page]) : defaultHtmlTempalte; templatePlugins.push(new HtmlWebpackPlugin(tslib_1.__assign(tslib_1.__assign({}, getCommonTemplatePluginOptions(page, option)), { template: tplPath }))); }); electronEntries.forEach(function (page) { if (page in entries) { // 已经有tradition 入口定义 return; } entries[page] = ["./" + page]; templatePlugins.push(new HtmlWebpackPlugin(tslib_1.__assign(tslib_1.__assign({}, getCommonTemplatePluginOptions(page, option)), { template: defaultHtmlTempalte }))); }); // 警告并使用默认入口 if (Object.keys(entries).length === 0) { var defaultIndex = path_1.default.join(context, 'index'); var ext = findJsFiles(defaultIndex, false); if (ext) { utils_1.message.warn("Use 'index" + ext + "' as default entry"); var page = 'index'; entries[page] = ["./" + page]; templatePlugins.push(new HtmlWebpackPlugin(tslib_1.__assign(tslib_1.__assign({}, getCommonTemplatePluginOptions(page, option)), { template: defaultHtmlTempalte }))); } else { utils_1.message.error("Not entries found in " + context + "."); process.exit(1); } } // 添加开发环境依赖 if (!option.isProduction && option.hotreload) { for (var entry in entries) { entries[entry].unshift(require.resolve('webpack/hot/dev-server')); entries[entry].unshift(require.resolve('webpack-dev-server/client') + '?/'); } } for (var externalEntry in option.inject) { entries[externalEntry] = [option.inject[externalEntry]]; } return { entries: entries, templatePlugins: templatePlugins, }; } exports.getEntries = getEntries; /** * 传统的入口方式, 一个page.{ext} 对应 一个page.js */ function getTraditionalEntries(_a) { var context = _a.context, entry = _a.entry; var globStr = path_1.default.join(context, "*.@(" + constants_1.TemplateExtensions.map(function (i) { return i.slice(1); }).join('|') + ")"); var reg = /^.*\/(.*)\.([a-zA-Z]*)$/; var matchPages = glob_1.default.sync(globStr, {}); var pages = matchPages.reduce(function (entries, page) { var matched = page.match(reg); if (matched) { var name = matched[1], ext = matched[2]; if (entry == null || entry.indexOf(name) !== -1) { entries[name] = ext; } } return entries; }, {}); return pages; } /** * 从page.json 中获取入口文件信息 */ function getElectronEntries(_a) { var context = _a.context, entry = _a.entry; var configPath = path_1.default.join(context, 'page.json'); if (!fs_extra_1.default.existsSync(configPath)) { return []; } var json = fs_extra_1.default.readFileSync(configPath); var config = json5_1.default.parse(json.toString()); return Object.keys(config).filter(function (p) { return (entry ? entry.indexOf(p) !== -1 : true); }); } /** * 获取*.page.ext 形式的入口 * @param param0 */ function getPagelessEntries(_a) { var context = _a.context, entry = _a.entry; return glob_1.default .sync(path_1.default.join(context, "*.page.@(" + constants_1.Extensions.map(function (i) { return i.slice(1); }).join('|') + ")")) .map(function (p) { var match = p.match(PageLessFileRegexp); return match[1]; }) .filter(function (p) { return (entry ? entry.indexOf(p) !== -1 : true); }); } /** * 检查对应的Javascript入口是否存在 * @param page */ function findJsFiles(page, checkPageless) { if (checkPageless === void 0) { checkPageless = true; } var exts = constants_1.Extensions.concat(checkPageless ? constants_1.Extensions.map(function (i) { return ".page" + i; }) : []); for (var _i = 0, exts_1 = exts; _i < exts_1.length; _i++) { var ext = exts_1[_i]; if (fs_extra_1.default.existsSync(page + ext)) { return ext; } } return undefined; } /** * 检查是否存在入口 * @param entries * @param param1 */ function checkEntryExisting(entries, _a) { var context = _a.context; uniq_1.default(entries).forEach(function (page) { var pagePath = path_1.default.join(context, page); var entryFileExt = findJsFiles(pagePath); if (entryFileExt == null) { utils_1.message.error("not any entry file(" + chalk_1.default.blue(page + ".{tsx|ts|js|jsx}") + " or " + chalk_1.default.blue(page + ".page.{tsx|ts|js|jsx}") + ") found in " + context + "."); process.exit(1); } }); } /** * 获取默认的html-webpack-plugin 模板 */ function getDefaultTemplate() { if (fs_extra_1.default.existsSync(paths_1.default.appHtml)) { return paths_1.default.appHtml; } return paths_1.default.ownHtml; } /** * 获取通用的html-webpack-plugin配置项 * @param page 入口名称 * @param param0 */ function getCommonTemplatePluginOptions(page, _a) { var isProduction = _a.isProduction, templateParameters = _a.templateParameters, inject = _a.inject; var preinjected = Object.keys(inject); return { title: page, filename: page + ".html", chunks: tslib_1.__spreadArrays(preinjected, [page]), chunksSortMode: preinjected && preinjected.length ? 'manual' : 'auto', templateParameters: templateParameters, inject: true, minify: isProduction ? { removeComments: true, collapseWhitespace: true, removeRedundantAttributes: true, useShortDoctype: true, removeEmptyAttributes: true, removeStyleLinkTypeAttributes: true, keepClosingSlash: true, minifyJS: true, minifyCSS: true, minifyURLs: true, } : undefined, }; }