wildpig 1.0.11 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,38 @@
1
+ import { getBrowserEnvironment } from "../utils/client/environment";
2
+ import { createBrowserRouter } from "react-router";
3
+ // 为了获取type而创建的router
4
+ const browserRouterForType = createBrowserRouter([
5
+ {
6
+ path: "/just-for-type",
7
+ Component: null,
8
+ }
9
+ ]);
10
+ export type BrowserRouter = typeof browserRouterForType;
11
+
12
+
13
+ /**
14
+ * 获取meta信息
15
+ * @param url like "/home?a=1"
16
+ */
17
+ const refreshMeta = (url: string) =>{
18
+ console.log("get url:", url);
19
+ fetch("/_WILDPIG_META_API" + url).then(res => res.json()).then(({title}) => {
20
+ document.title = title;
21
+ });
22
+ }
23
+
24
+ export const RouterMetaGuard = (browserRouter: BrowserRouter): BrowserRouter => {
25
+
26
+ // 检查meta,判断是否是dev环境
27
+ const isDev = getBrowserEnvironment() === "development";
28
+ if(isDev){
29
+ // 开发环境首次执行,生产阶段为了seo,无需首次执行
30
+ refreshMeta(window.location.pathname + window.location.search);
31
+ }
32
+
33
+ // 每次跳转都会触发,包括 <Link>/navigate/前进后退
34
+ browserRouter.subscribe(({ location }) => {
35
+ refreshMeta(location.pathname + location.search);
36
+ });
37
+ return browserRouter;
38
+ }
@@ -2,8 +2,10 @@ import chalk from "chalk";
2
2
  import { htmlString } from "./htmlString";
3
3
  import { routes, metaRoutes } from "./prepareRoutes";
4
4
  import { readFileSync } from "node:fs";
5
+ import devIndexHtml from "#/public/devIndex.html"
5
6
 
6
7
  const env = process.env;
8
+ const isDev = env.NODE_ENV === "development";
7
9
 
8
10
 
9
11
  export const startServer = () => {
@@ -21,10 +23,11 @@ export const startServer = () => {
21
23
  "/render.js": () => new Response((readFileSync("./public/render.js.br")), {
22
24
  headers: {
23
25
  "Content-Encoding": "br",
24
- "content-type": "text/javascript; charset=utf-8",
26
+ "Content-Type": "text/javascript; charset=utf-8",
27
+ "Cache-Control": isDev ? "no-cache" : "public, max-age=31536000, immutable"
25
28
  }
26
29
  }),
27
- "/*": async (request) => {
30
+ "/*": isDev ? devIndexHtml : async (request) => {
28
31
  const url = "/" + (request.url.split("/")[3] || "");
29
32
  // console.log("url:", url);
30
33
  const pathname = "/_WILDPIG_META_API" + url.split("?")[0];
@@ -42,7 +45,7 @@ export const startServer = () => {
42
45
  })
43
46
  },
44
47
  },
45
- development: false,
48
+ development: isDev
46
49
  })
47
50
  console.clear();
48
51
  console.log(` __ __ _ _ _ ____ _
@@ -51,8 +54,13 @@ console.log(` __ __ _ _ _ ____ _
51
54
  \\ V V / | || || (_| | | __/ | || (_| |
52
55
  \\_/\\_/ |_||_| \\__,_| |_| |_| \\__, |
53
56
  |___/ `)
54
- console.log(chalk.blue.bgGreen(" 🐗 WildPig version 1.0.0 by eriktse "));
57
+ console.log(chalk.blue.bgGreen(" 🐗 WildPig version 1.0.11 by eriktse "));
55
58
  console.log(chalk.green(" Strong & Fast Fullstack Framework\n"));
56
59
  console.log(chalk.green("✨ WildPig is running on port " + env.PORT || 3000));
60
+ if(isDev){
61
+ console.log(chalk.yellow("💻 Wildpig is Running in development mode."));
62
+ }else{
63
+ console.log(chalk.green("💻 Wildpig is Running in production mode."));
64
+ }
57
65
  console.log(chalk.green("🔗 Click to debug in Browser: http://localhost" + ":" + (env.PORT || 3000)));
58
66
  }
@@ -1,6 +1,6 @@
1
1
  import Bun from "bun";
2
2
  import fs, { readFileSync, writeFileSync } from "node:fs";
3
- import { brotliCompressSync } from "node:zlib";
3
+ import { brotliCompressSync, constants } from "node:zlib";
4
4
 
5
5
 
6
6
  export const packageStatic = async () => {
@@ -12,7 +12,16 @@ export const packageStatic = async () => {
12
12
  minify: true,
13
13
  });
14
14
  // 将 ./public/render.js 转为 ./public/render.br
15
- writeFileSync("./dist/public/render.js.br", brotliCompressSync(Buffer.from(readFileSync("./dist/public/render.js"))));
15
+ writeFileSync("./dist/public/render.js.br", brotliCompressSync(
16
+ Buffer.from(readFileSync("./dist/public/render.js")),
17
+ {
18
+ params: {
19
+ [constants.BROTLI_PARAM_QUALITY]: 11, // 最高质量
20
+ [constants.BROTLI_PARAM_LGWIN]: 16, // 最大窗口 16 MB
21
+ [constants.BROTLI_PARAM_MODE]: constants.BROTLI_MODE_TEXT, // 针对文本优化
22
+ }
23
+ }
24
+ ));
16
25
 
17
26
  /** 打包ico */
18
27
  fs.copyFileSync("./public/favicon.ico", "./dist/public/favicon.ico");
@@ -16,8 +16,8 @@ if(isDev){
16
16
  await Bun.build({
17
17
  entrypoints: ["./public/render.tsx"],
18
18
  outdir: "./public",
19
- format: "iife",
20
- minify: true,
19
+ format: "esm",
20
+ sourcemap: true,
21
21
  });
22
22
  // 将 ./public/render.js 转为 ./public/render.br
23
23
  writeFileSync("./public/render.js.br", brotliCompressSync(Buffer.from(readFileSync("./public/render.js"))));
package/test.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { startServer } from "./scripts/WildPig";
2
+
3
+ startServer();
@@ -0,0 +1,17 @@
1
+
2
+
3
+
4
+ export const getBrowserEnvironment = () => {
5
+ const metaTags = document.head.getElementsByTagName("meta");
6
+ if(!metaTags || metaTags.length === 0)
7
+ return "production";
8
+ // 如果某个meta标签的name属性为wildpig-environment,且content属性为development,则返回development
9
+ if(Array.from(metaTags).some(metaTag =>
10
+ metaTag.getAttribute("name") === "wildpig-environment"
11
+ && metaTag.getAttribute("content") === "development"
12
+ )){
13
+ return "development";
14
+ }
15
+
16
+ return "production";
17
+ }
package/src/App.tsx DELETED
@@ -1,7 +0,0 @@
1
- import { RouterProvider } from "react-router";
2
- import { browserRouter } from "./router";
3
- import { RouterGuard } from "./router/guard";
4
- RouterGuard(browserRouter);
5
-
6
-
7
- export const App = () => <RouterProvider router={browserRouter} />;
@@ -1,16 +0,0 @@
1
-
2
-
3
-
4
-
5
- export const GET = (req: Request) => {
6
- return Response.json({
7
- message: "hello get",
8
- })
9
- }
10
-
11
-
12
- export const POST = async (req: Request) => {
13
- return Response.json({
14
- message: "hello post",
15
- })
16
- }
package/src/middleware.ts DELETED
@@ -1,13 +0,0 @@
1
-
2
-
3
-
4
-
5
-
6
- export const middleware = async (req: Request, next: (req: Request) => Promise<Response>) => {
7
- console.log("middleware: ", req.url);
8
-
9
- const response = await next(req);
10
-
11
- response.headers.set("Access-Control-Allow-Origin", "*");
12
- return response;
13
- }
@@ -1,6 +0,0 @@
1
-
2
-
3
-
4
- export function Home(){
5
- return "Home";
6
- }
@@ -1,8 +0,0 @@
1
-
2
-
3
-
4
- export const getMeta = () => {
5
- return Response.json({
6
- title: "Home",
7
- })
8
- }
@@ -1,8 +0,0 @@
1
-
2
-
3
-
4
- export function Index(){
5
- return <div>
6
- Welcome to use WildPig!
7
- </div>
8
- }
@@ -1,10 +0,0 @@
1
- import { Outlet } from "react-router";
2
-
3
-
4
-
5
- export const MainLayout = () => {
6
- return <div>
7
- Main5567
8
- <Outlet />
9
- </div>
10
- }
package/src/page/meta.ts DELETED
@@ -1,8 +0,0 @@
1
-
2
-
3
-
4
- export const getMeta = async () => {
5
- return Response.json({
6
- title: "首页"
7
- });
8
- }
@@ -1,14 +0,0 @@
1
- import type { BrowserRouter } from "."
2
-
3
- export const RouterGuard = (browserRouter: BrowserRouter) => {
4
- // 每次跳转都会触发,包括 <Link>/navigate/前进后退
5
- browserRouter.subscribe(({ location }) => {
6
- // navigationType 值:'PUSH' | 'POP' | 'REPLACE'
7
- const url = location.pathname + location.search;
8
- // apiGetMeta(location.pathname);
9
- // 请求对应的meta api,修改title
10
- fetch("/_WILDPIG_META_API" + url).then(res => res.json()).then(({title}) => {
11
- document.title = title;
12
- })
13
- });
14
- }
@@ -1,11 +0,0 @@
1
- import { MainLayout } from "@/page/layout";
2
- import { createBrowserRouter } from "react-router";
3
-
4
- export const browserRouter = createBrowserRouter([
5
- {
6
- path: "/",
7
- Component: MainLayout,
8
- },
9
- ]);
10
-
11
- export type BrowserRouter = typeof browserRouter;