diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..002c943 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,62 @@ +name: Build and Release + +on: + push: + tags: + - 'v*' + +jobs: + build-and-release: + runs-on: ubuntu-latest + + permissions: + contents: write + + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '22.x' + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Build for production + run: pnpm build + + - name: Build for file protocol + run: pnpm build:file + + - name: Prepare directories + run: | + mv dist dist-prod + mv dist-prod/index.html dist-prod/404.html + + - name: Create production build archive + run: | + tar -czf dist.tar.gz dist-prod + + - name: Create file protocol build archive + run: | + tar -czf dist-file.tar.gz dist-file + + - name: Release + uses: softprops/action-gh-release@v1 + with: + files: | + dist.tar.gz + dist-file.tar.gz + draft: true + prerelease: false + generate_release_notes: true \ No newline at end of file diff --git a/package.json b/package.json index 0e47df5..4ad1910 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "log-lottery", "private": true, - "version": "0.0.3", + "version": "0.0.4", "type": "module", "license": "MIT", "scripts": { @@ -83,4 +83,4 @@ "vitest": "^2.1.5", "vue-tsc": "^2.1.10" } -} +} \ No newline at end of file diff --git a/src/components.d.ts b/src/components.d.ts index 8db03bd..89b8fbe 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -2,6 +2,7 @@ // @ts-nocheck // Generated by unplugin-vue-components // Read more: https://github.com/vuejs/core/pull/3399 +// biome-ignore lint: disable export {} /* prettier-ignore */ diff --git a/vite.config.ts b/vite.config.ts index a0e5b70..b873adc 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -19,132 +19,133 @@ const require = createRequire(import.meta.url) const process = require('node:process') export default defineConfig(({ mode }) => { - const env = loadEnv(mode, __dirname) - const chunkName = mode === 'prebuild' ? '[name]' : 'chunk' + const env = loadEnv(mode, __dirname) + const chunkName = mode === 'prebuild' ? '[name]' : 'chunk' - return { - base: mode === 'file' ? './' : '/log-lottery/', - plugins: [ - vue(), - mode === 'file' - ? legacy({ - additionalLegacyPolyfills: ['regenerator-runtime/runtime'], - }) - : null, - // vueDevTools(), - viteCompression({ - verbose: true, - disable: false, - threshold: 10240, - algorithm: 'gzip', - ext: '.gz', - }), - visualizer({ - emitFile: true, // 是否被触摸 - filename: 'test.html', // 生成分析网页文件名 - open: true, // 在默认用户代理中打开生成的文件 - gzipSize: true, // 从源代码中收集 gzip 大小并将其显示在图表中 - brotliSize: true, // 从源代码中收集 brotli 大小并将其显示在图表中 - }), + return { + base: mode === 'file' ? './' : '/log-lottery/', + plugins: [ + vue(), + mode === 'file' + ? legacy({ + additionalLegacyPolyfills: ['regenerator-runtime/runtime'], + }) + : null, + // vueDevTools(), + viteCompression({ + verbose: true, + disable: false, + threshold: 10240, + algorithm: 'gzip', + ext: '.gz', + }), + visualizer({ + emitFile: true, // 是否被触摸 + filename: 'test.html', // 生成分析网页文件名 + open: true, // 在默认用户代理中打开生成的文件 + gzipSize: true, // 从源代码中收集 gzip 大小并将其显示在图表中 + brotliSize: true, // 从源代码中收集 brotli 大小并将其显示在图表中 + }), - createSvgIconsPlugin({ - // 指定需要缓存的图标文件夹 - iconDirs: [path.resolve(process.cwd(), 'src/icons')], - // 指定symbolId格式 - symbolId: 'icon-[dir]-[name]', - }), - AutoImport({ - resolvers: [ - // 自动导入图标组件 - IconsResolver({ - prefix: 'Icon', - }), + createSvgIconsPlugin({ + // 指定需要缓存的图标文件夹 + iconDirs: [path.resolve(process.cwd(), 'src/icons')], + // 指定symbolId格式 + symbolId: 'icon-[dir]-[name]', + }), + AutoImport({ + resolvers: [ + // 自动导入图标组件 + IconsResolver({ + prefix: 'Icon', + }), + ], + dts: path.resolve(path.resolve(__dirname, 'src'), 'auto-imports.d.ts'), + }), + Components({ + resolvers: [ + // 自动注册图标组件 + IconsResolver({ + enabledCollections: ['ep'], + }), + ], + dts: path.resolve(path.resolve(__dirname, 'src'), 'components.d.ts'), + }), + Icons({ + autoInstall: true, + }), ], - dts: path.resolve(path.resolve(__dirname, 'src'), 'auto-imports.d.ts'), - }), - Components({ - resolvers: [ - // 自动注册图标组件 - IconsResolver({ - enabledCollections: ['ep'], - }), - ], - dts: path.resolve(path.resolve(__dirname, 'src'), 'components.d.ts'), - }), - Icons({ - autoInstall: true, - }), - ], - css: { - preprocessorOptions: { - scss: { - additionalData: '@use "@/style/global.scss" as *;', + css: { + preprocessorOptions: { + scss: { + additionalData: '@use "@/style/global.scss" as *;', + }, + }, + // postcss: { + // plugins: [ + // require('tailwindcss'), + // require('autoprefixer'), + // ] + // } }, - }, - // postcss: { - // plugins: [ - // require('tailwindcss'), - // require('autoprefixer'), - // ] - // } - }, - server: { - host: 'localhost', - port: 6719, - proxy: { - '/api': { - target: env.VITE_BASE_URL, - // 是否跨域 - changeOrigin: true, - // 路径重写 - rewrite: path => path.replace(/^\/api/, ''), + server: { + host: 'localhost', + port: 6719, + proxy: { + '/api': { + target: env.VITE_BASE_URL, + // 是否跨域 + changeOrigin: true, + // 路径重写 + rewrite: path => path.replace(/^\/api/, ''), + }, + }, }, - }, - }, - resolve: { - alias: { - '@': path.resolve(__dirname, './src'), - }, - }, - build: { - minify: 'terser', - terserOptions: { - compress: { - // 生产环境时移除console - drop_console: true, - drop_debugger: true, + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, }, - }, - // 关闭文件计算 - reportCompressedSize: false, - // 关闭生成map文件 可以达到缩小打包体积 - sourcemap: false, // 这个生产环境一定要关闭,不然打包的产物会很大 - rollupOptions: { - output: { - chunkFileNames: `js/${chunkName}-[hash].js`, // 引入文件名的名称 - entryFileNames: `js/${chunkName}-[hash].js`, // 包的入口文件名称 - assetFileNames: `[ext]/${chunkName}-[hash].[ext]`, // 资源文件像 字体,图片等 - manualChunks(id: any): string { - if (id.includes('node_modules')) { - return id - .toString() - .split('node_modules/')[1] - .split('/')[0] - .toString() - } - }, + build: { + outDir: mode === 'file' ? 'dist-file' : 'dist', + minify: 'terser', + terserOptions: { + compress: { + // 生产环境时移除console + drop_console: true, + drop_debugger: true, + }, + }, + // 关闭文件计算 + reportCompressedSize: false, + // 关闭生成map文件 可以达到缩小打包体积 + sourcemap: false, // 这个生产环境一定要关闭,不然打包的产物会很大 + rollupOptions: { + output: { + chunkFileNames: `js/${chunkName}-[hash].js`, // 引入文件名的名称 + entryFileNames: `js/${chunkName}-[hash].js`, // 包的入口文件名称 + assetFileNames: `[ext]/${chunkName}-[hash].[ext]`, // 资源文件像 字体,图片等 + manualChunks(id: any): string { + if (id.includes('node_modules')) { + return id + .toString() + .split('node_modules/')[1] + .split('/')[0] + .toString() + } + }, + }, + }, }, - }, - }, - // 使用这个必须在上面加/// 不然会有类型报错 - test: { - globals: true, // --> 0.8.1+ 请修改成globals - environment: 'jsdom', - // include: ['**/__tests__/**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - // passWithNoTests: true, - transformMode: { - web: [/\.[jt]sx$/], - }, - }, - } + // 使用这个必须在上面加/// 不然会有类型报错 + test: { + globals: true, // --> 0.8.1+ 请修改成globals + environment: 'jsdom', + // include: ['**/__tests__/**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + // passWithNoTests: true, + transformMode: { + web: [/\.[jt]sx$/], + }, + }, + } })