From 2c3d6c86b7f6cfd571a4c517234d3f77b3ad3458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E4=BA=9A=E6=98=95?= <1549469775@qq.com> Date: Mon, 30 Jun 2025 18:24:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20Vite=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=EF=BC=8C=E8=AE=BE=E7=BD=AE=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E5=92=8C=E6=8F=92=E4=BB=B6=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.lockb | Bin 107506 -> 137342 bytes database/development.sqlite3-shm | Bin 32768 -> 32768 bytes database/development.sqlite3-wal | Bin 379072 -> 457352 bytes entrypoint.sh | 5 +- package.json | 7 +- public/css/page/index.css | 12 ++++ public/styles.css | 33 +++++++++ src/db/seeds/20250621013324_site_config_seed.mjs | 3 +- src/utils/ForRegister.js | 8 +++ src/views/htmx/footer.pug | 12 ++-- src/views/layouts/base.pug | 2 +- src/views/layouts/page.pug | 1 - src/views/page/index/index.pug | 88 ++--------------------- vite.config.ts | 83 +++++++++++++++++++++ 14 files changed, 158 insertions(+), 96 deletions(-) create mode 100644 public/css/page/index.css create mode 100644 vite.config.ts diff --git a/bun.lockb b/bun.lockb index 2df1c7bd77e90e566f46d0cc586f9b1c1ca7c244..f91fe0837afdac46026a04b8198ab809c212323e 100644 GIT binary patch delta 37549 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 N_iSu^U2lEo{{yfxdIA6d diff --git a/database/development.sqlite3-shm b/database/development.sqlite3-shm index 5ef3ae71b0cbde0a6e348e1eb8b0fdda5703a2ac..e97f00a5b63eee207049dbfb515df1f6ba9dd98a 100644 GIT binary patch delta 246 zcmZo@U}|V!s+V}A%K!o_K+MR%AdnBFIe>Vc@bgIr4z+Lm)}i#@iCy8x!kP&&yPrRL zL#le9QD6Wv_dgPV3NtaJZ)_}QocKp$vJ9ij<{yl^95(-R5@TadV#wXh$n=nD@(*tj z&RB+2hBStBh75?%H$O4vIEG9h=PA?VFM(pr@eElI&ZiJ9_5_AxhHQpBpukzC$sfYC Q*b^C27;+f$fdco{0kM@+g8%>k delta 206 zcmZo@U}|V!s+V}A%K!t63=9G>Kn@2Gmup9_s-NEx^sPhbzZ1K{kNS>Eog2>`N=a1@ zGaF>?ewQM}`;bVCbc3sVbo3(FSP11BUH7#LW9nB!ZA(tjs*g&(KqUH==A?a8zK!zD%m z0ghXn?>XBsg%)pK@Da#MQgHpewEq9o?FmI7$@46Aot}mlHMcML&XUZxoqId$T1F1Z zh9nWY(vGfPtAlhPe{ndKquoc#2Bdl6<` z2rnhIIJqdZpd>Rt&yJ5-5h7TUS(1}#3$z9$u2=R8bk2wj?BBj2mybQ`wv-aEo{P2Pb9|Q$tT2dClC)z|_jb0y(cig)BTE zc@4J;M|VVC!>!8I4UyMys|t4o=e2rJzQwJ|!G(=MS>D(foIw&xOEU6{p6{Lha_+pB z8~0%G0u~_;XEp{!L#PShJOel2`K*@bk;`X1UEhX99~L3>Y(43@@Vt%fhYoOoB7=Vp z1OFWUrTh>1H}Rk0-^c$E7#ZdK)AuDZ@~3bxi!y==Jx}C}?}3!@-BB{W8@7z^%FnC} N$@q|9a6v5yoB{KJxD)^Y delta 19 acmeD9Dt%z0ctZ/dev/null 2>&1; then @@ -16,8 +17,8 @@ fi # 如果数据库文件不存在,先 migrate 再 seed if [ ! -f "$DB_FILE" ]; then echo "Database not found, running migration and seed..." - $RUNNER npx knex migrate:latest - $RUNNER npx knex seed:run + $RUNNER npx knex migrate:latest --env $ENV + $RUNNER npx knex seed:run --env $ENV else echo "Database exists, running migration only..." $RUNNER npx knex migrate:latest diff --git a/package.json b/package.json index 6ae4bd6..8ff90bb 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "scripts": { "dev": "bun --hot src/main.js", "start": "bun run src/main.js", + "build": "vite build", "migrate:make": "npx knex migrate:make ", "migrate": "npx knex migrate:latest", "seed:make": "npx knex seed:make ", @@ -13,7 +14,8 @@ }, "devDependencies": { "@types/bun": "latest", - "@types/node": "^24.0.1" + "@types/node": "^24.0.1", + "vite": "^7.0.0" }, "dependencies": { "bcryptjs": "^3.0.2", @@ -31,7 +33,8 @@ "node-cron": "^4.1.0", "path-to-regexp": "^8.2.0", "pug": "^3.0.3", - "sqlite3": "^5.1.7" + "sqlite3": "^5.1.7", + "vite-plugin-static-copy": "^3.1.0" }, "_moduleAliases": { "@": "./src", diff --git a/public/css/page/index.css b/public/css/page/index.css new file mode 100644 index 0000000..fdc3fa9 --- /dev/null +++ b/public/css/page/index.css @@ -0,0 +1,12 @@ +.home-hero { + margin: 20px 20px 40px; + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(12px); +} + +@media screen and (max-width: 768px) { + .home-hero { + margin: 0; + margin-top: 20px; + } +} \ No newline at end of file diff --git a/public/styles.css b/public/styles.css index ae1b050..14841b6 100644 --- a/public/styles.css +++ b/public/styles.css @@ -123,4 +123,37 @@ body::after { background: rgba(255, 255, 255, 0.25); backdrop-filter: blur(18px); color: #fff; +} + + +@media screen and (max-width: 768px) { + .nav { + width: 0; + height: 0; + overflow: hidden; + padding: 0; + margin: 0; + } + .flota-nav { + position: fixed; + top: 0; + left: 0; + right: 0; + width: 100%; + display: flex; + z-index: 9999; + padding: 0 10px; + height: 40px; + border-radius: 0; + } + + .flota-nav .item{ + margin-bottom: 0; + padding: 0 10px; + } + + .content { + padding: 0 10px; + padding-top: 40px; + } } \ No newline at end of file diff --git a/src/db/seeds/20250621013324_site_config_seed.mjs b/src/db/seeds/20250621013324_site_config_seed.mjs index afb8a67..e182c53 100644 --- a/src/db/seeds/20250621013324_site_config_seed.mjs +++ b/src/db/seeds/20250621013324_site_config_seed.mjs @@ -4,7 +4,8 @@ export const seed = async (knex) => { // 插入常用站点配置项 await knex('site_config').insert([ - { key: 'site_title', value: '🥔未野明的小屋' }, + { key: 'site_title', value: '罗非鱼的秘密' }, + { key: 'site_author', value: '罗非鱼' }, { key: 'site_description', value: '一屋很小,却也很大' }, { key: 'site_logo', value: '/static/logo.png' }, { key: 'site_bg', value: '/static/bg.jpg' }, diff --git a/src/utils/ForRegister.js b/src/utils/ForRegister.js index ad0499f..21a1df7 100644 --- a/src/utils/ForRegister.js +++ b/src/utils/ForRegister.js @@ -3,6 +3,14 @@ import fs from "fs" import path from "path" +// 保证不会被摇树(tree-shaking),即使在生产环境也会被打包 +if (import.meta.env.PROD) { + // 通过引用返回值,防止被摇树优化 + let controllers = import.meta.glob("../controllers/**/*Controller.js", { eager: true }) + controllers = null + console.log(controllers); +} + /** * 自动扫描 controllers 目录,注册所有导出的路由 * 自动检测 routes 目录下已手动注册的 controller,避免重复注册 diff --git a/src/views/htmx/footer.pug b/src/views/htmx/footer.pug index dbe4f62..ce17895 100644 --- a/src/views/htmx/footer.pug +++ b/src/views/htmx/footer.pug @@ -1,16 +1,16 @@ .footer-panel .footer-content - p © 2023-2025 My Website. 保留所有权利。 + p © 2023-#{new Date().getFullYear()} #{$site.site_title}. 保留所有权利。 ul.footer-links li a(href="/about") 关于我们 - li - a(href="/contact") 联系方式 - li - a(href="/privacy") 隐私 + //- li + //- a(href="/contact") 联系方式 + //- li + //- a(href="/privacy") 隐私 style. .footer-panel { - background: rgba(34,34,34,.6); + background: rgba(34,34,34,.3); backdrop-filter: blur(12px); color: #eee; padding: 40px 0 24px 0; diff --git a/src/views/layouts/base.pug b/src/views/layouts/base.pug index 1e5118a..cc6c9ec 100644 --- a/src/views/layouts/base.pug +++ b/src/views/layouts/base.pug @@ -4,7 +4,7 @@ mixin include() mixin css(url, extranl = false) if extranl || url.startsWith('http') || url.startsWith('//') - style(type="text/css" href=url) + link(rel="stylesheet" type="text/css" href=url) else link(rel="stylesheet", href=($config && $config.base || "") + url) diff --git a/src/views/layouts/page.pug b/src/views/layouts/page.pug index d9395b3..f6353e1 100644 --- a/src/views/layouts/page.pug +++ b/src/views/layouts/page.pug @@ -5,7 +5,6 @@ block head block pageHead block content - // 页面整体flex布局,footer吸底 .page-layout .page - const navs = []; diff --git a/src/views/page/index/index.pug b/src/views/page/index/index.pug index 5026816..97b371c 100644 --- a/src/views/page/index/index.pug +++ b/src/views/page/index/index.pug @@ -1,88 +1,10 @@ extends /layouts/page.pug +block pageHead + +css("css/page/index.css") + block pageContent - .home-hero + .card.home-hero h1 #{$site.site_title} p.subtitle #{$site.site_description} - - style. - .home-hero { - text-align: center; - padding: 60px 0 40px 0; - margin: 20px 20px; - //- background: linear-gradient(90deg, #4fc3f7 0%, #1976d2 100%); - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(12px); - color: #fff; - border-radius: 12px; - margin-bottom: 40px; - } - .home-hero h1 { - font-size: 2.8em; - margin-bottom: 42px; - letter-spacing: 2px; - } - .home-hero .subtitle { - font-size: 1.3em; - margin-bottom: 28px; - color: #e3f2fd; - } - .home-hero .actions { - margin-top: 18px; - } - .btn-primary, .btn-secondary { - display: inline-block; - padding: 10px 28px; - border-radius: 24px; - font-size: 1em; - margin: 0 10px; - text-decoration: none; - transition: background 0.2s, color 0.2s; - } - .btn-primary { - background: #fff; - color: #1976d2; - font-weight: bold; - border: none; - } - .btn-primary:hover { - background: #e3f2fd; - color: #1565c0; - } - .btn-secondary { - background: transparent; - color: #fff; - border: 1px solid #fff; - } - .btn-secondary:hover { - background: #1976d2; - color: #fff; - border-color: #e3f2fd; - } - .features { - display: flex; - justify-content: space-around; - margin-top: 40px; - gap: 24px; - flex-wrap: wrap; - } - .feature { - background: #fafbfc; - border-radius: 10px; - box-shadow: 0 2px 8px rgba(30, 136, 229, 0.08); - padding: 28px 24px; - flex: 1 1 220px; - min-width: 220px; - max-width: 320px; - text-align: center; - margin: 0 8px; - } - .feature h2 { - font-size: 1.3em; - margin-bottom: 10px; - color: #1976d2; - } - .feature p { - color: #333; - font-size: 1em; - margin: 0; \ No newline at end of file + diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..fcf832d --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,83 @@ +import { dirname, resolve } from "node:path" +import { fileURLToPath } from "node:url" +import module from "node:module" +import { defineConfig } from "vite" +import pkg from "./package.json" +import { viteStaticCopy } from "vite-plugin-static-copy" + +const __dirname = dirname(fileURLToPath(import.meta.url)) + +function getExternal(): string[] { + return [...Object.keys(pkg.dependencies || {}), ...module.builtinModules] +} + +export default defineConfig({ + publicDir: false, + resolve: { + alias: { + "@": resolve(__dirname, "src"), + db: resolve(__dirname, "src/db"), + config: resolve(__dirname, "src/config"), + utils: resolve(__dirname, "src/utils"), + services: resolve(__dirname, "src/services"), + }, + }, + build: { + lib: { + entry: resolve(__dirname, "src/main.js"), + formats: ["es"], + fileName: () => `[name].js`, + }, + outDir: resolve(__dirname, "dist"), + rollupOptions: { + external: getExternal(), + // watch: { + // include: "src/**", + // exclude: "node_modules/**", + // }, + output: { + preserveModules: true, + preserveModulesRoot: "src", + inlineDynamicImports: false, + }, + }, + }, + plugins: [ + viteStaticCopy({ + targets: [ + { + src: "public", + dest: "", + }, + { + src: "src/views", + dest: "", + }, + { + src: "src/db/migrations", + dest: "db", + }, + { + src: "src/db/seeds", + dest: "db", + }, + { + src: "entrypoint.sh", + dest: "", + }, + { + src: "package.json", + dest: "", + }, + { + src: "knexfile.mjs", + dest: "", + }, + { + src: "bun.lockb", + dest: "", + }, + ], + }), + ], +})