import fss from 'fs'; import fs from 'fs-extra'; import Fontmin from 'fontmin'; import * as babel from '@babel/core'; import * as rollup from 'rollup'; import typescript from '@rollup/plugin-typescript'; import rollupBabel from '@rollup/plugin-babel'; import terser from '@rollup/plugin-terser'; import resolve from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import { splitResorce } from './resource.js'; import compressing from 'compressing'; import * as vite from 'vite'; import legacy from '@vitejs/plugin-legacy'; import { buildDeclaration } from './buildDeclaration.js'; const type = process.argv[2]; const map = false; const resorce = false; const compress = type === 'dist'; (async function () { const timestamp = Date.now(); // 1. vite打包 await vite.build({ plugins: [ legacy({ targets: ['since 2015', '> 50%'], polyfills: true, modernPolyfills: true }) ] }); // 2. 压缩游戏进程 try { await fs.remove('./dist/project/processG.min.js'); const build = await rollup.rollup({ input: 'src/game/index.ts', plugins: [ typescript({ sourceMap: false, declaration: true, declarationDir: './dist/types/' }), rollupBabel({ // todo: 是否需要添加 polyfill? babelHelpers: 'bundled', sourceType: 'module' }), terser(), resolve(), commonjs() ] }); await build.write({ format: 'iife', name: 'CorePlugin', file: './dist/project/processG.min.js' }); await fs.remove('./dist/project/plugin/'); } catch (e) { console.log('压缩插件失败'); console.log(e); } // 3. 压缩main.js try { // 先获取不能压缩的部分 const main = (await fs.readFile('./public/main.js', 'utf-8')) .replace( /this.pluginUseCompress\s*=\s*false\;/, 'this.pluginUseCompress = true;' ) .replace('this.timestamp = 0', `this.timestamp = ${timestamp};`); const endIndex = main.indexOf('// >>>> body end'); const nonCompress = main.slice(0, endIndex); const needCompress = main.slice(endIndex + 17); const compressed = babel.transformSync(needCompress)?.code; await fs.writeFile('./dist/main.js', nonCompress + compressed, 'utf-8'); } catch (e) { console.log('main.js压缩失败'); console.log(e); } // 4. 打包类型标注 try { await buildDeclaration(); } catch (e) { console.log('打包类型标注失败'); console.log(e); } // 5. 迁移类型标注文件 try { await fs.copyFile('./_temp/types/index.d.ts', './dist/index.d.ts'); await fs.copy('./src/types', './dist/types'); await fs.copy('./src/source', './dist/source'); } catch (e) { console.log('迁移类型标注文件'); console.log(e); } // 6. 部分修改类型标注 try { const indexDTS = await fs.readFile('./dist/index.d.ts', 'utf-8'); const re = '///\n' + indexDTS; await fs.writeFile('./dist/index.d.ts', re, 'utf-8'); const pluginDTS = await fs.readFile( './dist/types/plugin.d.ts', 'utf-8' ); const rep = pluginDTS.replaceAll(`../game/system`, `../index.d.ts`); await fs.writeFile('./dist/types/plugin.d.ts', rep); const js = ['functions.js', 'plugins.js']; for (const file of js) { const info = await fs.readFile('./dist/project/' + file, 'utf-8'); const re = info.replace( /\/\/\/\/g, `///` ); await fs.writeFile('./dist/project/' + file, re, 'utf-8'); } } catch (e) { console.log('修改类型标注失败'); console.log(e); } // 7. tsconfig.json try { const content = `{ "compilerOptions": { "lib": ["ESNext", "DOM", "DOM.Iterable"] }, "include": ["index.d.ts", "types/**/d.ts"] }`; await fs.writeFile('./dist/tsconfig.json', content, 'utf-8'); } catch (e) { console.log('添加tsconfig.json失败'); console.log(e); } // 8. 文档 try { await fs.move('./docs/.vitepress/dist', './dist/_docs'); } catch (e) { console.log('移动文档失败'); console.log(e); } // 9. 启动服务 try { await fs.copy('./script/template/启动服务.exe', './dist/启动服务.exe'); } catch (e) { console.log('移动启动服务失败'); console.log(e); } // 10. 移动端编辑器及常用工具 try { await fs.copy( './script/template/editor-mobile.html', './dist/editor-mobile.html' ); await fs.copy('./script/template/常用工具', './dist/常用工具'); } catch (e) { console.log('移动端编辑器及常用工具失败'); console.log(e); } // 11. 压缩 if (compress) { try { await fs.ensureDir('./out'); await compressing.zip.compressDir('./dist', './dist.zip'); } catch (e) { console.log('压缩为zip失败!'); console.log(e); } } })();