enhance: Vite HMR while yarn dev, and more build tuning (#9361)
* enhance: Vite HMR while yarn dev, and more build tuning * use localhost Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
This commit is contained in:
parent
b4b9d5d552
commit
2fe86fd869
15 changed files with 102 additions and 23 deletions
|
@ -28,6 +28,7 @@
|
|||
"@fastify/accepts": "4.1.0",
|
||||
"@fastify/cookie": "^8.3.0",
|
||||
"@fastify/cors": "8.2.0",
|
||||
"@fastify/http-proxy": "^8.4.0",
|
||||
"@fastify/multipart": "7.3.0",
|
||||
"@fastify/static": "6.6.0",
|
||||
"@fastify/view": "7.3.0",
|
||||
|
|
|
@ -91,6 +91,7 @@ export type Mixin = {
|
|||
driveUrl: string;
|
||||
userAgent: string;
|
||||
clientEntry: string;
|
||||
clientManifestExists: boolean;
|
||||
};
|
||||
|
||||
export type Config = Source & Mixin;
|
||||
|
@ -112,7 +113,10 @@ const path = process.env.NODE_ENV === 'test'
|
|||
|
||||
export function loadConfig() {
|
||||
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../../../built/meta.json`, 'utf-8'));
|
||||
const clientManifest = JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_client_dist_/manifest.json`, 'utf-8'));
|
||||
const clientManifestExists = fs.existsSync(_dirname + '/../../../built/_vite_/manifest.json')
|
||||
const clientManifest = clientManifestExists ?
|
||||
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_vite_/manifest.json`, 'utf-8'))
|
||||
: { 'src/init.ts': { file: 'src/init.ts' } };
|
||||
const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source;
|
||||
|
||||
const mixin = {} as Mixin;
|
||||
|
@ -134,6 +138,7 @@ export function loadConfig() {
|
|||
mixin.driveUrl = `${mixin.scheme}://${mixin.host}/files`;
|
||||
mixin.userAgent = `Misskey/${meta.version} (${config.url})`;
|
||||
mixin.clientEntry = clientManifest['src/init.ts'];
|
||||
mixin.clientManifestExists = clientManifestExists;
|
||||
|
||||
if (!config.redis.prefix) config.redis.prefix = mixin.host;
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@ import { In, IsNull } from 'typeorm';
|
|||
import fastifyStatic from '@fastify/static';
|
||||
import fastifyView from '@fastify/view';
|
||||
import fastifyCookie from '@fastify/cookie';
|
||||
import fastifyProxy from '@fastify/http-proxy';
|
||||
import type { Config } from '@/config.js';
|
||||
import { getNoteSummary } from '@/misc/get-note-summary.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
|
@ -39,6 +40,7 @@ const staticAssets = `${_dirname}/../../../assets/`;
|
|||
const clientAssets = `${_dirname}/../../../../client/assets/`;
|
||||
const assets = `${_dirname}/../../../../../built/_client_dist_/`;
|
||||
const swAssets = `${_dirname}/../../../../../built/_sw_dist_/`;
|
||||
const viteOut = `${_dirname}/../../../../../built/_vite_/`;
|
||||
|
||||
@Injectable()
|
||||
export class ClientServerService {
|
||||
|
@ -151,9 +153,6 @@ export class ClientServerService {
|
|||
},
|
||||
defaultContext: {
|
||||
version: this.config.version,
|
||||
getClientEntry: () => process.env.NODE_ENV === 'production' ?
|
||||
this.config.clientEntry :
|
||||
JSON.parse(readFileSync(`${_dirname}/../../../../../built/_client_dist_/manifest.json`, 'utf-8'))['src/init.ts'],
|
||||
config: this.config,
|
||||
},
|
||||
});
|
||||
|
@ -164,6 +163,23 @@ export class ClientServerService {
|
|||
done();
|
||||
});
|
||||
|
||||
//#region vite assets
|
||||
if (this.config.clientManifestExists) {
|
||||
fastify.register(fastifyStatic, {
|
||||
root: viteOut,
|
||||
prefix: '/vite/',
|
||||
maxAge: ms('30 days'),
|
||||
decorateReply: false,
|
||||
});
|
||||
} else {
|
||||
fastify.register(fastifyProxy, {
|
||||
upstream: 'http://localhost:5173', // TODO: port configuration
|
||||
prefix: '/vite',
|
||||
rewritePrefix: '/vite',
|
||||
});
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//#region static assets
|
||||
|
||||
fastify.register(fastifyStatic, {
|
||||
|
|
|
@ -57,7 +57,7 @@
|
|||
|
||||
//#region Script
|
||||
function importAppScript() {
|
||||
import(`/assets/${CLIENT_ENTRY}`)
|
||||
import(`/vite/${CLIENT_ENTRY}`)
|
||||
.catch(async e => {
|
||||
await checkUpdate();
|
||||
console.error(e);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
block vars
|
||||
|
||||
block loadClientEntry
|
||||
- const clientEntry = getClientEntry();
|
||||
- const clientEntry = config.clientEntry;
|
||||
|
||||
doctype html
|
||||
|
||||
|
@ -35,11 +35,14 @@ html
|
|||
link(rel='prefetch' href='https://xn--931a.moe/assets/not-found.jpg')
|
||||
link(rel='prefetch' href='https://xn--931a.moe/assets/error.jpg')
|
||||
link(rel='stylesheet' href='/assets/tabler-icons/tabler-icons.css')
|
||||
link(rel='modulepreload' href=`/assets/${clientEntry.file}`)
|
||||
link(rel='modulepreload' href=`/vite/${clientEntry.file}`)
|
||||
|
||||
if !config.clientManifestExists
|
||||
script(type="module" src="/vite/@vite/client")
|
||||
|
||||
if Array.isArray(clientEntry.css)
|
||||
each href in clientEntry.css
|
||||
link(rel='stylesheet' href=`/assets/${href}`)
|
||||
link(rel='stylesheet' href=`/vite/${href}`)
|
||||
|
||||
title
|
||||
block title
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"name": "client",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"watch": "vite build --watch --mode development",
|
||||
"watch": "vite",
|
||||
"build": "vite build",
|
||||
"lint": "vue-tsc --noEmit && eslint --quiet \"src/**/*.{ts,vue}\""
|
||||
},
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
<script lang="ts" setup>
|
||||
import { computed } from 'vue';
|
||||
import * as Acct from 'misskey-js/built/acct';
|
||||
import MkSwitch from '@/components/ui/switch.vue';
|
||||
import MkPagination from '@/components/MkPagination.vue';
|
||||
import MkDriveFileThumbnail from '@/components/MkDriveFileThumbnail.vue';
|
||||
import bytes from '@/filters/bytes';
|
||||
|
|
|
@ -159,8 +159,6 @@ import {
|
|||
} from 'chart.js';
|
||||
import { enUS } from 'date-fns/locale';
|
||||
import tinycolor from 'tinycolor2';
|
||||
import MagicGrid from 'magic-grid';
|
||||
import XMetrics from './metrics.vue';
|
||||
import XFederation from './overview.federation.vue';
|
||||
import XQueueChart from './overview.queue-chart.vue';
|
||||
import XUser from './overview.user.vue';
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import * as fs from 'fs';
|
||||
import pluginVue from '@vitejs/plugin-vue';
|
||||
import { defineConfig } from 'vite';
|
||||
|
||||
|
@ -9,11 +8,9 @@ import pluginJson5 from './vite.json5';
|
|||
const extensions = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.json', '.json5', '.svg', '.sass', '.scss', '.css', '.vue'];
|
||||
|
||||
export default defineConfig(({ command, mode }) => {
|
||||
fs.mkdirSync(__dirname + '/../../built', { recursive: true });
|
||||
fs.writeFileSync(__dirname + '/../../built/meta.json', JSON.stringify({ version: meta.version }), 'utf-8');
|
||||
|
||||
return {
|
||||
base: '/assets/',
|
||||
base: '/vite/',
|
||||
|
||||
plugins: [
|
||||
pluginVue({
|
||||
|
@ -63,10 +60,10 @@ export default defineConfig(({ command, mode }) => {
|
|||
},
|
||||
},
|
||||
cssCodeSplit: true,
|
||||
outDir: __dirname + '/../../built/_client_dist_',
|
||||
outDir: __dirname + '/../../built/_vite_',
|
||||
assetsDir: '.',
|
||||
emptyOutDir: false,
|
||||
sourcemap: process.env.NODE_ENV !== 'production',
|
||||
sourcemap: process.env.NODE_ENV === 'development',
|
||||
reportCompressedSize: false,
|
||||
},
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue