@quark-fw/plugin-react 0.1.10 → 0.1.12
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.
- package/package.json +9 -9
- package/src/utils/createViteConfig.ts +109 -81
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quark-fw/plugin-react",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.12",
|
|
4
4
|
"main": "src/index.ts",
|
|
5
5
|
"types": "src/index.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"access": "public"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@quark-fw/atom": "0.1.
|
|
26
|
-
"@quark-fw/plugin": "0.1.
|
|
25
|
+
"@quark-fw/atom": "0.1.12",
|
|
26
|
+
"@quark-fw/plugin": "0.1.12",
|
|
27
27
|
"@trpc/client": "^11.0.0",
|
|
28
28
|
"@types/react-dom": "^19.2.3",
|
|
29
29
|
"express": "^5.2.1",
|
|
@@ -32,12 +32,12 @@
|
|
|
32
32
|
"vite-tsconfig-paths": "^6.1.1"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
|
-
"@mantine/core": "^
|
|
36
|
-
"@mantine/dates": "^
|
|
37
|
-
"@mantine/modals": "^
|
|
38
|
-
"@mantine/notifications": "^
|
|
39
|
-
"@quark-fw/core": "0.1.
|
|
40
|
-
"@quark-fw/store": "0.1.
|
|
35
|
+
"@mantine/core": "^9.0.0",
|
|
36
|
+
"@mantine/dates": "^9.0.0",
|
|
37
|
+
"@mantine/modals": "^9.0.0",
|
|
38
|
+
"@mantine/notifications": "^9.0.0",
|
|
39
|
+
"@quark-fw/core": "0.1.12",
|
|
40
|
+
"@quark-fw/store": "0.1.12",
|
|
41
41
|
"@vitejs/plugin-react": "^5.1.0",
|
|
42
42
|
"react": "^19.2.4",
|
|
43
43
|
"react-dom": "^19.2.4",
|
|
@@ -1,81 +1,109 @@
|
|
|
1
|
-
import type { InlineConfig } from "vite";
|
|
2
|
-
import react from "@vitejs/plugin-react";
|
|
3
|
-
import tsconfigPaths from "vite-tsconfig-paths";
|
|
4
|
-
import svgr from "vite-plugin-svgr";
|
|
5
|
-
import { patchCssModules } from "vite-css-modules";
|
|
6
|
-
import fs from "node:fs";
|
|
7
|
-
import path from "node:path";
|
|
8
|
-
import { fileURLToPath } from "node:url";
|
|
9
|
-
import { loadModulesFromExternalFolderPlugin } from "./plugins.js";
|
|
10
|
-
|
|
11
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Пакеты @quark/* в приложении — это симлинки на ИСХОДНИКИ соседних
|
|
15
|
-
* workspace-пакетов. Если позволить vite их пре-бандлить, он кэширует
|
|
16
|
-
* результат в node_modules/.vite и продолжает отдавать старую версию даже
|
|
17
|
-
* после правок в пакете (правка видна только после ручной очистки кэша).
|
|
18
|
-
* Поэтому исключаем их из оптимизации — тогда HMR работает как для
|
|
19
|
-
* обычных файлов приложения.
|
|
20
|
-
*/
|
|
21
|
-
const workspacePackages = (cwd: string): string[] => {
|
|
22
|
-
try {
|
|
23
|
-
const pkg = JSON.parse(
|
|
24
|
-
fs.readFileSync(path.join(cwd, "package.json"), "utf8"),
|
|
25
|
-
) as Record<string, Record<string, string> | undefined>;
|
|
26
|
-
return Object.keys({
|
|
27
|
-
...(pkg.dependencies ?? {}),
|
|
28
|
-
...(pkg.devDependencies ?? {}),
|
|
29
|
-
}).filter(
|
|
30
|
-
(name) =>
|
|
31
|
-
name.startsWith("@quark/") || name.startsWith("@quark-fw/"),
|
|
32
|
-
);
|
|
33
|
-
} catch {
|
|
34
|
-
return [];
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
/** Плагин поставлен из npm (лежит внутри node_modules), а не симлинкован из монорепы. */
|
|
39
|
-
const installedFromRegistry = fs
|
|
40
|
-
.realpathSync(__dirname)
|
|
41
|
-
.replace(/\\/g, "/")
|
|
42
|
-
.includes("/node_modules/");
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
1
|
+
import type { InlineConfig, PluginOption } from "vite";
|
|
2
|
+
import react from "@vitejs/plugin-react";
|
|
3
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
4
|
+
import svgr from "vite-plugin-svgr";
|
|
5
|
+
import { patchCssModules } from "vite-css-modules";
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { loadModulesFromExternalFolderPlugin } from "./plugins.js";
|
|
10
|
+
|
|
11
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Пакеты @quark/* в приложении — это симлинки на ИСХОДНИКИ соседних
|
|
15
|
+
* workspace-пакетов. Если позволить vite их пре-бандлить, он кэширует
|
|
16
|
+
* результат в node_modules/.vite и продолжает отдавать старую версию даже
|
|
17
|
+
* после правок в пакете (правка видна только после ручной очистки кэша).
|
|
18
|
+
* Поэтому исключаем их из оптимизации — тогда HMR работает как для
|
|
19
|
+
* обычных файлов приложения.
|
|
20
|
+
*/
|
|
21
|
+
const workspacePackages = (cwd: string): string[] => {
|
|
22
|
+
try {
|
|
23
|
+
const pkg = JSON.parse(
|
|
24
|
+
fs.readFileSync(path.join(cwd, "package.json"), "utf8"),
|
|
25
|
+
) as Record<string, Record<string, string> | undefined>;
|
|
26
|
+
return Object.keys({
|
|
27
|
+
...(pkg.dependencies ?? {}),
|
|
28
|
+
...(pkg.devDependencies ?? {}),
|
|
29
|
+
}).filter(
|
|
30
|
+
(name) =>
|
|
31
|
+
name.startsWith("@quark/") || name.startsWith("@quark-fw/"),
|
|
32
|
+
);
|
|
33
|
+
} catch {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/** Плагин поставлен из npm (лежит внутри node_modules), а не симлинкован из монорепы. */
|
|
39
|
+
const installedFromRegistry = fs
|
|
40
|
+
.realpathSync(__dirname)
|
|
41
|
+
.replace(/\\/g, "/")
|
|
42
|
+
.includes("/node_modules/");
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Реестр страниц (`import.meta.glob` по /Pages) лежит внутри самого плагина, то
|
|
46
|
+
* есть в node_modules приложения. Такие модули vite отдаёт с
|
|
47
|
+
* `Cache-Control: max-age=31536000, immutable`, считая их неизменяемыми, и
|
|
48
|
+
* версионирует хэшем зависимостей — а он не меняется от появления новой
|
|
49
|
+
* страницы в приложении. Браузер продолжает исполнять старый реестр: сервер
|
|
50
|
+
* страницу отрисовал, а клиентский роутер её маршрута не знает и после
|
|
51
|
+
* гидратации показывает 404 (лечилось только Ctrl+F5). Содержимое этого модуля
|
|
52
|
+
* зависит от файлов приложения, поэтому кэшировать его нельзя.
|
|
53
|
+
*/
|
|
54
|
+
const pageRegistryNoCachePlugin = (): PluginOption => ({
|
|
55
|
+
name: "quark:page-registry-no-cache",
|
|
56
|
+
apply: "serve",
|
|
57
|
+
configureServer(server) {
|
|
58
|
+
server.middlewares.use((req, res, next) => {
|
|
59
|
+
if (req.url?.includes("/Router/gatherPages.")) {
|
|
60
|
+
const setHeader = res.setHeader.bind(res);
|
|
61
|
+
res.setHeader = (name, value) =>
|
|
62
|
+
/^cache-control$/i.test(name)
|
|
63
|
+
? setHeader(name, "no-cache")
|
|
64
|
+
: setHeader(name, value);
|
|
65
|
+
}
|
|
66
|
+
next();
|
|
67
|
+
});
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
/** Единая конфигурация vite для dev-сервера и для сборки. */
|
|
72
|
+
export function createViteConfig(overrides?: InlineConfig): InlineConfig {
|
|
73
|
+
return {
|
|
74
|
+
plugins: [
|
|
75
|
+
patchCssModules(),
|
|
76
|
+
svgr({ include: "**/*.svg" }),
|
|
77
|
+
react(),
|
|
78
|
+
tsconfigPaths(),
|
|
79
|
+
loadModulesFromExternalFolderPlugin(),
|
|
80
|
+
pageRegistryNoCachePlugin(),
|
|
81
|
+
],
|
|
82
|
+
// Установленный из реестра плагин лежит в node_modules, куда
|
|
83
|
+
// @vitejs/plugin-react не заглядывает (у него exclude /node_modules/).
|
|
84
|
+
// Без явного automatic-рантайма его собственный JSX собирается в
|
|
85
|
+
// React.createElement и падает с "React is not defined".
|
|
86
|
+
esbuild: { jsx: "automatic", jsxImportSource: "react" },
|
|
87
|
+
optimizeDeps: {
|
|
88
|
+
exclude: workspacePackages(process.cwd()),
|
|
89
|
+
// Плагин исключён из оптимизации, поэтому vite не сканирует его
|
|
90
|
+
// импорты: установленный из реестра, он тянет react-router и mantine
|
|
91
|
+
// сырыми, и CJS-пакеты внутри них (cookie) падают на named-импортах.
|
|
92
|
+
// В монорепо, наоборот, форсировать пре-бандл нельзя — рядом с
|
|
93
|
+
// симлинкованными исходниками появилась бы вторая копия React.
|
|
94
|
+
include: installedFromRegistry
|
|
95
|
+
? [
|
|
96
|
+
"react",
|
|
97
|
+
"react-dom",
|
|
98
|
+
"react-dom/client",
|
|
99
|
+
"react-router-dom",
|
|
100
|
+
"@mantine/core",
|
|
101
|
+
"@mantine/dates",
|
|
102
|
+
"@mantine/modals",
|
|
103
|
+
"@mantine/notifications",
|
|
104
|
+
]
|
|
105
|
+
: [],
|
|
106
|
+
},
|
|
107
|
+
...overrides,
|
|
108
|
+
};
|
|
109
|
+
}
|