UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

209 lines (196 loc) 9.78 kB
"use strict";var _typeof = require("@babel/runtime-corejs2/helpers/typeof");var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");_Object$defineProperty(exports, "__esModule", { value: true });exports.base = base;exports.checkError = checkError;exports.multiConfig = multiConfig;exports.singleConfig = singleConfig;var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));var _assign = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/assign"));var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys")); var _copyWebpackPlugin = _interopRequireDefault(require("copy-webpack-plugin")); var _webpackInjectPlugin = _interopRequireWildcard(require("webpack-inject-plugin")); var _webpackZipPlugin = _interopRequireDefault(require("../plugins/webpack-zip-plugin.js")); var _webpackMainPlugin = _interopRequireDefault(require("../plugins/webpack-main-plugin.js")); var _webpackMerge = _interopRequireDefault(require("webpack-merge")); var _index = require("../../cli-shared-utils/index.js"); var _manifest = require("../lib/manifest.js"); var paths = _interopRequireWildcard(require("../lib/paths.js")); var _exConfig = _interopRequireDefault(require("../lib/exConfig.js")); var _constanst = require("../lib/constanst.js"); var _prettyjson = _interopRequireDefault(require("prettyjson")); var _nodePolyfillWebpackPlugin = _interopRequireDefault(require("node-polyfill-webpack-plugin")); var _prettyLoader = _interopRequireDefault(require("./pretty-loader"));function _getRequireWildcardCache(e) {if ("function" != typeof _WeakMap) return null;var r = new _WeakMap(),t = new _WeakMap();return (_getRequireWildcardCache = function _getRequireWildcardCache(e) {return e ? t : r;})(e);}function _interopRequireWildcard(e, r) {if (!r && e && e.__esModule) return e;if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e };var t = _getRequireWildcardCache(r);if (t && t.has(e)) return t.get(e);var n = { __proto__: null },a = _Object$defineProperty && _Object$getOwnPropertyDescriptor;for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) {var i = a ? _Object$getOwnPropertyDescriptor(e, u) : null;i && (i.get || i.set) ? _Object$defineProperty(n, u, i) : n[u] = e[u];}return n["default"] = e, t && t.set(e, n), n;} // import path from 'path' var TerserPlugin = require('terser-webpack-plugin'); /** * 基于给定的参数生成Webpack配置 * * @param {boolean} isRelease - 是否为发布模式 * @param {Object} entry - 入口文件配置 * @param {boolean} amd - 是否支持AMD模块 * @returns {Object} 生成的Webpack配置对象 */ function base(isRelease, entry, amd) { var ignoreRes = []; var webpackConfig = require('./webpack.config'); var config = (0, _webpackMerge["default"])(webpackConfig["default"], { mode: isRelease ? 'none' : 'development', optimization: { minimize: false, minimizer: [ new TerserPlugin({ terserOptions: { compress: { drop_console: false // 可选:设置为 true 可以移除 console 命令 }, format: { beautify: true, // 设置为 true 会输出格式良好的代码 comments: false // 若需要保留注释,设置为 true 或 'all' } }, extractComments: false // 若不希望将注释提取到单独的文件中,设置为 false })] }, devtool: isRelease ? false : 'cheap-module-source-map', stats: 'errors-only', entry: (0, _assign["default"])({ game: paths.ENTRY }, entry), plugins: [ new _nodePolyfillWebpackPlugin["default"](), new _copyWebpackPlugin["default"]({ patterns: [ { from: paths.SRC, // 使用 globOptions.ignore 替代旧版 ignore globOptions: { ignore: [].concat((0, _toConsumableArray2["default"])( _constanst.FILE_EXT_IGNORES.map(function (ext) {return "**/*".concat(ext);})), (0, _toConsumableArray2["default"])( ignoreRes.map(function (pattern) {return "**/".concat(pattern);}))) }, // transform 函数保持原有逻辑 transform: function transform(content, path) { if (path.includes(_constanst.MANIFEST)) {// 更现代的写法替代 indexOf return (0, _manifest.update)({ content: content, isRelease: isRelease }); } return content; } }] })] }); // 若amd设置为false,则关闭amd配置,表示不支持amd define转换,默认为true if (!amd) { config.amd = false; } // 对小游戏工程目录的webpack配置做postHook处理 (0, _exConfig["default"])(config, { context: paths.PROJECT_PATH, src: paths.SRC, build: paths.BUILD }); return config; } /** * 原整包打包webpack配置生成 * * @param {string} entry - 入口文件路径 * @param {boolean} isRelease - 是否为发布模式 * @param {Object} externals - 外部依赖配置 * @param {boolean} inject - 是否注入分包模块的依赖 * @param {boolean} amd - 是否使用AMD模块 * @returns {Object} 合并后的Webpack配置对象 */ function singleConfig(entry, isRelease, externals, inject, amd) { // 格式化微小相关的代码,便于调试和排查问题 (0, _prettyLoader["default"])(); var baseConfig = base(isRelease, entry, amd); // 是否注入对分包模块的依赖,如果不注入,由CP用户注入,能力开放给CP用户 var injectPlugins = inject ? [ new _webpackInjectPlugin["default"](function () {// 打原整包时,通过在主入口 src/game.js 注入其它分包的依赖,并结合externals来实现兼容 return (0, _keys["default"])(externals).reduce(function (acc, cur) {return "require('".concat(cur, "');").concat(acc);}, ''); }, { entryName: _constanst.ENTRY_NAME, entryOrder: _webpackInjectPlugin.ENTRY_ORDER.Last })] : []; // const compileStartTime = (new Date()).valueOf() return (0, _webpackMerge["default"])(baseConfig, { externals: externals, plugins: [ new _webpackMainPlugin["default"]({ singlePackage: true })].concat( injectPlugins) }); } /** * 生成分包的Webpack配置对象 * * @param {string} entry - 入口文件路径 * @param {boolean} isRelease - 是否为发布版本 * @param {string} packageName - 包名称 * @param {Array} externals - 外部依赖 * @param {Array} subpackages - 子包配置 * @param {Object} manifest - 清单文件 * @param {string} buildType - 构建类型 * @param {boolean} amd - 是否使用AMD模块 * @returns {Object} 合并后的Webpack配置对象 */ function multiConfig(entry, isRelease, packageName, externals, subpackages, manifest, buildType, amd) { var baseConfig = base(isRelease, entry, amd); var compileStartTime = new Date().valueOf(); return (0, _webpackMerge["default"])(baseConfig, { externals: externals, plugins: [ new _webpackMainPlugin["default"]({ singlePackage: false, subpackages: subpackages }), new _webpackZipPlugin["default"]({ isRelease: isRelease, packageName: packageName, singlePackage: false, // 打新分包,为false必须提供subpackages subpackages: subpackages, manifest: manifest, buildType: buildType, compileStartTime: compileStartTime })] }); } /** * 检查webpack编译完成后是否有错误 * @param {Object} err webpack错误 * @param {Object} stats 编译状态 */ function checkError(err, stats) { if (err) {// webpack错误,配置文件出错等 (0, _index.error)(err.stack || err); if (err.details) { (0, _index.error)(err.details); } return true; } var statsJson = stats.toJson(); if (stats.hasWarnings()) {// 编译警告, 只打印前十个警告 var warns = statsJson.warnings; if (warns.length > 10) { warns = warns.splice(0, 10); (0, _index.info)('编译结果warnings超过10个,只打印前10个!!!', statsJson.warnings.length); } var warnings = warns.map(function (warning) { var moduleIdentifier = warning.moduleIdentifier,moduleName = warning.moduleName,loc = warning.loc,message = warning.message; return { moduleIdentifier: moduleIdentifier, moduleName: moduleName, loc: loc, message: message }; }); (0, _index.info)(_prettyjson["default"].render(warnings)); } if (stats.hasErrors()) {// 编译错误,譬如缺失Module,语法错误等 var errors = statsJson.errors.map(function (er) { var moduleIdentifier = er.moduleIdentifier,moduleName = er.moduleName,loc = er.loc,message = er.message; var errMsg = message; if (!message) { errMsg = er; } // 找不到模块代码不影响rpk打包 if (errMsg.includes('Module not found')) { var tip = "\u3010\u4E0D\u5F71\u54CDrpk\u6253\u5305\u3011\u8BF7\u68C0\u67E5\u5BF9\u5E94\u6A21\u5757 ".concat(moduleName, "\u4E0B\u7684\u4EE3\u7801\uFF01"); (0, _index.info)(_prettyjson["default"].render({ moduleIdentifier: moduleIdentifier, moduleName: moduleName, loc: loc, errMsg: errMsg, tip: tip })); } else { return { moduleIdentifier: moduleIdentifier, moduleName: moduleName, loc: loc, errMsg: errMsg }; } }).filter(Boolean); if (errors.length) { (0, _index.error)(_prettyjson["default"].render(errors)); return true; } } }