@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
215 lines (197 loc) • 12.9 kB
JavaScript
;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["default"] = void 0;var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));var _from = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/from"));var _assign = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/assign"));var _entries = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/entries"));var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
var _path = _interopRequireDefault(require("path"));
var _index = require("../../cli-shared-utils/index.js");
var paths = _interopRequireWildcard(require("../lib/paths.js"));
var _manifest = require("../lib/manifest.js");
var _glob = _interopRequireDefault(require("glob"));
var _chalk = _interopRequireDefault(require("chalk"));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;} /**
* 打出带 main.js 入口的游戏包,适配联盟引擎
*/ /**
* 将webpack引用的js资源保存到webpack_use_moudle.json文件中,动态编译js时在webpack的webpackEmptyContext中可能会用到
* @param {*} modules
*/
function saveWebpackUseModules(chunkGraph, modules, unUsedFile) {
try {
var modulePathMap = {};
unUsedFile.forEach(function (file) {
try {
modulePathMap[file.replace(/\\/g, '/')] = -1;
} catch (err) {
(0, _index.error)(err);
}
});
// 遍历所有模块,生成模块 ID 和路径的映射
modules.forEach(function (module) {
try {
var id = chunkGraph.getModuleId(module);
if (id != null) {
var ss = module.resource;
if (ss && ss.indexOf(paths.SRC) !== -1) {
var arr = _path["default"].relative(paths.SRC, ss).replace(/\\/g, '/');
modulePathMap[arr] = chunkGraph.getModuleId(module);
}
}
} catch (err) {
}
});
var webpackUseModule = _path["default"].join(paths.BUILD, 'webpack_use_moudle.json');
if (!_index.fs.existsSync(webpackUseModule)) {
(0, _index.info)("webpackUseModule \u4FDD\u5B58\u5230 ".concat(webpackUseModule));
_index.fs.writeFileSync(webpackUseModule, (0, _stringify["default"])(modulePathMap), 'utf8');
}
} catch (err) {
(0, _index.error)(err);
}
}
/**
* 将webpack未引用的js文件copy到build目录下参与打包,动态编译js时在webpack的webpackEmptyContext中可能会用到
* @param {*} fileDependencies
* @returns
*/
function copyUnUsedFiles(fileDependencies) {
try {
// 过滤掉workers配置文件
var workersPath = (0, _manifest.getWorkersPath)();
// 获取webpack使用的js模块
var usedModules = (0, _from["default"])(fileDependencies).
filter(function (file) {return file.indexOf(paths.SRC) !== -1 && (workersPath === '' || file.indexOf(workersPath) === -1);}).
reduce(function (obj, item) {return (0, _assign["default"])(obj, (0, _defineProperty2["default"])({}, item, true));}, {});
var normalizedUsedModules = Object.fromEntries(
(0, _entries["default"])(usedModules).map(function (_ref) {var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),key = _ref2[0],value = _ref2[1];return [
_path["default"].normalize(key),
value];}
)
);
// 获取src下所有的js文件
var files = _glob["default"].sync('**/*.js', { ignore: ['node_modules/**'], cwd: paths.SRC, absolute: true });
// 过滤src下未使用的js文件
var unUsedFiles = files.filter(function (file) {return !normalizedUsedModules[_path["default"].normalize(file)];});
var allFiles = unUsedFiles.reduce(
function (array, item) {return array.concat(item);},
[]
);
if (!allFiles.length) {
return [];
}
// 将所有未使用的js文件copy到build目录下
(0, _index.info)(_chalk["default"].green('*** Unused Plugin ***'));
(0, _index.info)("".concat(allFiles.length, " unused source files found."));
var unUsedFile = [];
allFiles.forEach(function (file) {
if (!file.includes('@babel/runtime') && _index.fs.existsSync(file) && !_index.fs.statSync(file).isDirectory()) {
var relative = _path["default"].relative(paths.SRC, file);
var destFile = _path["default"].resolve(paths.BUILD, relative);
if (!_index.fs.existsSync(destFile)) {
(0, _index.info)("unused JS File ".concat(relative, " copy to Build dir."));
// 默认情况下,如果 dest 已经存在,则覆盖它。
var destDir = _path["default"].dirname(destFile);
if (!_index.fs.existsSync(destDir)) {
_index.fs.mkdirSync(destDir, { recursive: true });
}
_index.fs.copyFileSync(file, destFile);
unUsedFile.push(relative);
}
}
});
// 将未引用的文件缓存下来,webpack完成打包时使用
paths.unUsedFiles = unUsedFile;
return unUsedFile;
} catch (err) {}
}var
ZipMainPlugin = /*#__PURE__*/function () {
function ZipMainPlugin(options) {(0, _classCallCheck2["default"])(this, ZipMainPlugin);
this.options = options;
}return (0, _createClass2["default"])(ZipMainPlugin, [{ key: "apply", value:
function apply(compiler) {
var pluginName = 'ZipMainPlugin';
var _this$options = this.options,singlePackage = _this$options.singlePackage,alliance = _this$options.alliance,subpackages = _this$options.subpackages;
compiler.hooks.afterEmit.tapPromise(pluginName, function (compilation) {
return new _promise["default"](function (resolve) {
// 将webpack未引入的js文件 copy到build目录下
var unUsedFile = copyUnUsedFiles(compilation.fileDependencies);
// 将webpack的映射信息保存下来
saveWebpackUseModules(compilation.chunkGraph, compilation.modules, unUsedFile);
// 如果是打原整包
if (singlePackage) {
// 联盟适配转换代码
var needTransferAlliance = true;
var allianceAdapterJS = 'alliance_adapter';
var gameContent = _index.fs.readFileSync(_path["default"].resolve(paths.BUILD, './game.js'), {
encoding: 'utf-8'
});
if (gameContent.includes(allianceAdapterJS)) {
needTransferAlliance = false;
if (alliance) {
(0, _index.info)('game.js 包含联盟 alliance_adapter.js 转换代码,不进行二次转换...');
}
}
if (needTransferAlliance) {
(0, _index.info)('开始写入联盟适配代码...');
// 生成 main.js文件,引入 game.js,作为适配联盟api的入口
if (_index.fs.existsSync(_path["default"].resolve(paths.BUILD, './main.js'))) {
(0, _index.info)('main.js为入口文件,不允许作为业务文件引入进来,如果游戏有报错,请修改文件名,重新打包');
var content = _index.fs.readFileSync(_path["default"].resolve(paths.BUILD, './main.js'), {
encoding: 'utf-8'
});
// 判断build是否包含适配文件
var allianceJs = _path["default"].resolve(paths.BUILD, './alliance_adapter.js');
if (!_index.fs.existsSync(allianceJs)) {
var _allianceJs = _path["default"].join(__dirname, '../alliance_adapter/alliance_adapter.js');
_index.fs.copyFileSync(_allianceJs, _path["default"].resolve(paths.BUILD, './alliance_adapter.js'));
}
// 判断main.js是否已引入适配js
if (!content.includes(allianceAdapterJS)) {
// 重新写入vivo_alliance_adapter
var allianceAdapterContent = 'require(\'alliance_adapter.js\');\n';
_index.fs.outputFileSync(_path["default"].resolve(paths.BUILD, './main.js'), allianceAdapterContent + content, 'utf8');
}
} else {
var _allianceJs2 = _path["default"].join(__dirname, '../alliance_adapter/alliance_adapter.js');
_index.fs.copyFileSync(_allianceJs2, _path["default"].resolve(paths.BUILD, './alliance_adapter.js'));
_index.fs.outputFileSync(_path["default"].resolve(paths.BUILD, './main.js'), 'require(\'alliance_adapter.js\');\nrequire("game.js");', 'utf8');
}
} else {
// 生成 main.js文件,引入 game.js,作为适配联盟api的入口
if (_index.fs.existsSync(_path["default"].resolve(paths.BUILD, './main.js'))) {
(0, _index.info)('main.js为入口文件,不允许作为业务文件引入进来,如果游戏有报错,请修改文件名,重新打包');
} else {
_index.fs.outputFileSync(_path["default"].resolve(paths.BUILD, './main.js'), 'require("game.js");', 'utf8');
}
}
resolve();
} else {
// 如果是打分包,检查是目录的分包,增加main.js,引入 game.js
subpackages.forEach(function (_ref3) {var root = _ref3.root;
var ext = _path["default"].extname(root);
if (ext === '') {
// 如果是联盟,则为了兼容荣耀分包,将分包内的game.js copy到main.js,防止require引用失败
if (alliance) {
try {
if (_index.fs.existsSync(_path["default"].resolve(paths.BUILD, root, './game.js'))) {
_index.fs.renameSync(_path["default"].resolve(paths.BUILD, root, './game.js'), _path["default"].resolve(paths.BUILD, root, './main.js'));
}
if (_index.fs.existsSync(_path["default"].resolve(paths.BUILD, root, './game.js.map'))) {
_index.fs.renameSync(_path["default"].resolve(paths.BUILD, root, './game.js.map'), _path["default"].resolve(paths.BUILD, root, './main.js.map'));
}
} catch (err) {
console.error(err);
}
} else {
// 如果是目录
// 生成 main.js文件,引入 game.js,作为分包适配联盟api的入口
if (_index.fs.existsSync(_path["default"].resolve(paths.BUILD, root, './main.js'))) {
// console.warn('main.js为入口文件,不允许作为业务文件引入进来,如果游戏有报错,请修改文件名,重新打包')
(0, _index.info)(root + '/main.js为入口文件,不允许作为业务文件引入进来,如果游戏有报错,请修改文件名,重新打包');
// throw new Error('main.js为子包入口文件,不允许作为业务文件引入,请修改文件名,重新打包')
} else {
_index.fs.outputFileSync(_path["default"].resolve(paths.BUILD, root, './main.js'), 'require("./game.js");', 'utf8');
}
}
}
});
resolve();
}
});
});
} }]);}();var _default = exports["default"] =
ZipMainPlugin;