um-react/vite.config.ts

108 lines
2.9 KiB
TypeScript
Raw Normal View History

2023-05-14 23:22:23 +00:00
import cp from 'node:child_process';
import url from 'node:url';
import path from 'node:path';
import fs from 'node:fs';
2023-05-09 00:22:00 +00:00
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import wasm from 'vite-plugin-wasm';
2023-05-14 23:22:23 +00:00
import replace from '@rollup/plugin-replace';
import topLevelAwait from 'vite-plugin-top-level-await';
2023-05-21 23:29:27 +00:00
import { VitePWA } from 'vite-plugin-pwa';
2023-05-07 19:11:16 +00:00
2023-05-14 23:22:23 +00:00
const gitRoot = url.fileURLToPath(new URL('.', import.meta.url));
const pkg = JSON.parse(fs.readFileSync(gitRoot + '/package.json', 'utf-8'));
function command(cmd, dir = '') {
return cp.execSync(cmd, { cwd: path.join(gitRoot, dir), encoding: 'utf-8' }).trim();
}
const COMMAND_GIT_VERSION = 'git describe --long --dirty --tags --always';
const shortCommit = command(COMMAND_GIT_VERSION);
const version = `${pkg.version}-${shortCommit}`;
2023-05-07 19:11:16 +00:00
// https://vitejs.dev/config/
export default defineConfig({
2023-06-09 00:00:57 +00:00
worker: {
format: 'es',
},
server: {
fs: {
// Note:
// This is _insecure_, but is required to get pnpm link to work.
// strict: false,
allow: [
'src',
'node_modules',
// Allow pnpm to link.
process.env.LIB_PARAKEET_JS_DIR || '../libparakeet-js',
],
},
},
base: './',
optimizeDeps: {
exclude: ['@jixun/libparakeet', 'sql.js'],
},
2023-05-14 23:22:23 +00:00
plugins: [
replace({
preventAssignment: true,
values: {
__APP_VERSION_SHORT__: pkg.version,
__APP_VERSION__: version,
},
}),
react(),
wasm(),
topLevelAwait(),
2023-05-21 23:29:27 +00:00
VitePWA({
registerType: 'prompt',
workbox: {
// Cache everything from dist
globPatterns: ['**/*.{js,css,html,ico,png,svg,wasm}'],
},
manifest: {
display: 'standalone',
name: '音乐解锁 (Unlock Music)',
short_name: '音乐解锁',
lang: 'zh-cmn-Hans-CN',
description: '在现代浏览器解锁已购的加密音乐!',
theme_color: '#ffffff',
icons: [
{
src: 'pwa-192x192.png',
sizes: '192x192',
type: 'image/png',
purpose: 'maskable',
},
{
src: 'pwa-512x512.png',
sizes: '512x512',
type: 'image/png',
},
],
},
}),
2023-05-14 23:22:23 +00:00
],
2023-05-09 00:22:00 +00:00
resolve: {
alias: {
'~': path.resolve(__dirname, 'src'),
'@nm': path.resolve(__dirname, 'node_modules'),
2023-06-09 00:00:57 +00:00
module: path.resolve(__dirname, 'src', 'dummy.mjs'),
2023-05-09 00:22:00 +00:00
},
},
2023-05-15 20:39:58 +00:00
build: {
rollupOptions: {
output: {
manualChunks: {
2023-06-11 21:40:39 +00:00
reacts: ['react', 'react-dom', 'react-dropzone', 'react-promise-suspense', 'react-redux', '@reduxjs/toolkit'],
chakra: ['@chakra-ui/react', '@emotion/react', '@emotion/styled', 'framer-motion'],
icons: ['react-icons', '@chakra-ui/icons'],
utility: ['radash', 'nanoid', 'immer', 'react-syntax-highlighter'],
2023-05-15 20:39:58 +00:00
},
},
},
},
2023-05-09 00:22:00 +00:00
});