@bleedingdev/modern-js-main-doc 3.8.2-ultramodern.9 → 3.8.3-ultramodern.2
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/docs/en/community/showcase.mdx +4 -5
- package/docs/en/components/init-app.mdx +8 -7
- package/docs/en/components/init-rspack-app.mdx +1 -3
- package/docs/en/components/prerequisites.mdx +1 -1
- package/docs/en/configure/app/bff/effect.mdx +7 -7
- package/docs/en/guides/advanced-features/bff/frameworks.mdx +1 -1
- package/docs/en/guides/basic-features/deploy.mdx +2 -2
- package/docs/en/guides/get-started/quick-start.mdx +1 -1
- package/docs/en/guides/get-started/tech-stack.mdx +1 -1
- package/docs/en/guides/get-started/ultramodern.mdx +123 -38
- package/docs/en/guides/troubleshooting/cli.mdx +1 -1
- package/docs/en/tutorials/examples/csr-auth.mdx +3 -1
- package/docs/zh/community/showcase.mdx +4 -5
- package/docs/zh/components/init-app.mdx +7 -7
- package/docs/zh/components/init-rspack-app.mdx +1 -3
- package/docs/zh/components/prerequisites.mdx +1 -1
- package/docs/zh/configure/app/bff/effect.mdx +7 -7
- package/docs/zh/guides/basic-features/deploy.mdx +2 -2
- package/docs/zh/guides/get-started/quick-start.mdx +1 -1
- package/docs/zh/guides/get-started/tech-stack.mdx +1 -1
- package/docs/zh/guides/get-started/ultramodern.mdx +116 -38
- package/docs/zh/guides/troubleshooting/cli.mdx +1 -1
- package/docs/zh/tutorials/examples/csr-auth.mdx +3 -1
- package/package.json +3 -2
- package/rspress.config.ts +16 -54
- package/src/sandbox/csr-auth/src/routes/Auth-tsx.txt +13 -3
- package/src/sandbox/csr-auth/src/routes/layout-tsx.txt +3 -3
- package/src/sandbox/csr-auth/src/routes/login/page-tsx.txt +7 -3
- package/ultramodern-preset/assets/img/ultramodern-logo-dark.svg +7 -0
- package/ultramodern-preset/assets/img/ultramodern-social-card.png +0 -0
- package/ultramodern-preset/package.json +19 -0
- package/ultramodern-preset/src/index.ts +127 -0
- package/static/img/social-card.svg +0 -12
- /package/{static/img/logo.svg → ultramodern-preset/assets/img/ultramodern-logo-light.svg} +0 -0
|
@@ -62,9 +62,9 @@ UltraModern.js 的增强能力是新 SuperApp 的默认产品面。框架方向
|
|
|
62
62
|
旧版生成 workspace 迁移时,以已发布的包 cohort 作为事实来源:
|
|
63
63
|
|
|
64
64
|
```bash
|
|
65
|
-
pnpm dlx @bleedingdev/modern-js-create@latest --help
|
|
66
|
-
pnpm dlx @bleedingdev/modern-js-create@latest catalog --vertical --dry-run
|
|
67
|
-
pnpm dlx @bleedingdev/modern-js-create@latest catalog --vertical
|
|
65
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create@latest --help
|
|
66
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create@latest catalog --vertical --dry-run
|
|
67
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create@latest catalog --vertical
|
|
68
68
|
mise install
|
|
69
69
|
mise exec -- pnpm install
|
|
70
70
|
mise exec -- pnpm check
|
|
@@ -81,8 +81,8 @@ server runtime 中。请求 `/` 时,框架会按语言协商在服务端返回
|
|
|
81
81
|
先解析当前 cohort 版本,再运行同版本迁移命令:
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
|
-
COHORT="$(npm view @bleedingdev/modern-js-create version)"
|
|
85
|
-
pnpm dlx "@bleedingdev/modern-js-create@$COHORT" ultramodern \
|
|
84
|
+
COHORT="$(npm view @bleedingdev/modern-js-ultramodern-create version)"
|
|
85
|
+
pnpm dlx "@bleedingdev/modern-js-ultramodern-create@$COHORT" ultramodern \
|
|
86
86
|
migrate-strict-effect --version "$COHORT"
|
|
87
87
|
pnpm install
|
|
88
88
|
pnpm check
|
|
@@ -114,8 +114,8 @@ postprocess、生成产物编辑或本地 redirect shim 来修复旧版本的 ro
|
|
|
114
114
|
手写 package alias 或生成 metadata 之前,先在目标 workspace 运行框架迁移命令:
|
|
115
115
|
|
|
116
116
|
```bash
|
|
117
|
-
COHORT="$(npm view @bleedingdev/modern-js-create version)"
|
|
118
|
-
pnpm dlx "@bleedingdev/modern-js-create@$COHORT" ultramodern \
|
|
117
|
+
COHORT="$(npm view @bleedingdev/modern-js-ultramodern-create version)"
|
|
118
|
+
pnpm dlx "@bleedingdev/modern-js-ultramodern-create@$COHORT" ultramodern \
|
|
119
119
|
migrate-strict-effect --version "$COHORT"
|
|
120
120
|
pnpm api:check
|
|
121
121
|
pnpm contract:check
|
|
@@ -128,8 +128,8 @@ pnpm overrides/trust policy 和 pnpm lockfile。剩余失败就是源码迁移
|
|
|
128
128
|
`api/lambda`、`shared/effect` 和 `src/effect`。
|
|
129
129
|
|
|
130
130
|
严格 Effect 生成 workspace 会通过 pnpm overrides 固定兼容版本组:
|
|
131
|
-
`effect@4.0.0-
|
|
132
|
-
`@effect/vitest@4.0.0-
|
|
131
|
+
`effect@4.0.0-rc.112`、`@effect/opentelemetry@4.0.0-rc.112` 和
|
|
132
|
+
`@effect/vitest@4.0.0-rc.112`。不要添加与这些 overrides 冲突的 app 本地直接
|
|
133
133
|
Effect 版本。严格的 24 小时发布年龄门禁适用于实际安装的包;当前版本组不包含 Effect
|
|
134
134
|
年龄豁免,仅用于 override 的 `@effect/vitest` 也不是已安装的审批目标。
|
|
135
135
|
`trustPolicyExclude` 是独立策略,仅为 `effect` 和
|
|
@@ -140,12 +140,21 @@ provenance attestation 的迁移;它不属于 release-age 审批。
|
|
|
140
140
|
|
|
141
141
|
| 范围 | 固定版本 |
|
|
142
142
|
| --- | --- |
|
|
143
|
-
| Effect runtime 与测试版本组 | `effect`、`@effect/opentelemetry`、`@effect/vitest`:`4.0.0-
|
|
144
|
-
| Effect compiler | `@effect/tsgo@0.
|
|
145
|
-
|
|
|
146
|
-
|
|
|
147
|
-
|
|
|
148
|
-
|
|
|
143
|
+
| Effect runtime 与测试版本组 | `effect`、`@effect/opentelemetry`、`@effect/vitest`:`4.0.0-rc.112` |
|
|
144
|
+
| Effect compiler | `@effect/tsgo@0.37.0` |
|
|
145
|
+
| Oxc 与 Ultracite | `oxlint@1.80.0`、`oxfmt@0.65.0`、`ultracite@7.10.6` |
|
|
146
|
+
| TanStack Router | `@tanstack/react-router@1.170.32`、`@tanstack/router-core@1.171.27`、`@tanstack/history@1.162.1` |
|
|
147
|
+
| Module Federation | `bridge-react`、`manifest`、`modern-js-v3`、`rspack`:`2.9.0`;`@module-federation/node@2.7.50` |
|
|
148
|
+
| Tailwind CSS | `tailwindcss@4.3.3` |
|
|
149
|
+
| Node 与包管理工具 | Node `26.7.0`、`@types/node@^26.2.0`、pnpm `11.24.0` |
|
|
150
|
+
|
|
151
|
+
生成的 workspace 默认使用 `@module-federation/bridge-react` 的
|
|
152
|
+
router-free base entry(`bridge.enableBridgeRouter: false`),应用路由由
|
|
153
|
+
TanStack Router 承担;某个 app 的 package.json 直接依赖中声明了
|
|
154
|
+
`react-router`(或 `react-router-dom`),该 app 就会被标记为 React Router
|
|
155
|
+
consumer:generator/migration 会为该 app 的 federation 配置生成
|
|
156
|
+
`enableBridgeRouter: true`,workspace validator 也会接受这个值,UltraModern
|
|
157
|
+
preset 会为该 app 自身的路由 alias `react-router` 的入口。
|
|
149
158
|
|
|
150
159
|
渐进迁移意味着尚未迁移的旧 Modern.js app 可以保留现有 runtime,直到被转换为
|
|
151
160
|
UltraModern。一个 surface 一旦生成为或迁移为 UltraModern HTTP API,就只能使用
|
|
@@ -212,6 +221,87 @@ migration 时不要再用 app 本地 postprocess。Cloudflare public output 默
|
|
|
212
221
|
会按 app、构建目标和 Rspack environment 隔离,避免本地 `build`、`cloudflare:build`
|
|
213
222
|
以及多 environment compiler 共享可变构建状态。
|
|
214
223
|
|
|
224
|
+
## 配置公开预设
|
|
225
|
+
|
|
226
|
+
在标准 Modern.js `defineConfig` 调用中使用
|
|
227
|
+
`presetUltramodern(appConfig, presetOptions)`:
|
|
228
|
+
|
|
229
|
+
```ts title="modern.config.ts"
|
|
230
|
+
import { defineConfig, presetUltramodern } from '@modern-js/app-tools';
|
|
231
|
+
|
|
232
|
+
export default defineConfig(
|
|
233
|
+
presetUltramodern(
|
|
234
|
+
{
|
|
235
|
+
output: {
|
|
236
|
+
precompress: false,
|
|
237
|
+
},
|
|
238
|
+
server: {
|
|
239
|
+
telemetry: {
|
|
240
|
+
failLoudStartup: true,
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
appId: 'catalog',
|
|
246
|
+
enableModuleFederationSSR: false,
|
|
247
|
+
enableTelemetryExporters: false,
|
|
248
|
+
},
|
|
249
|
+
),
|
|
250
|
+
);
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
第一个参数是普通的 `AppUserConfig`,用于应用自己拥有的配置,并在提供覆盖值时胜出。
|
|
254
|
+
第二个参数控制预设本身。关闭预设能力时,使用它提供的类型化选项,例如
|
|
255
|
+
`enableBffRequestId: false`、`enableTelemetry: false`、
|
|
256
|
+
`enableTelemetryExporters: false` 和 `enableModuleFederationSSR: false`。
|
|
257
|
+
|
|
258
|
+
组合过程遵循 Modern.js 配置合并规则:
|
|
259
|
+
|
|
260
|
+
- 嵌套对象会递归合并。修改一个嵌套字段时,预设中的同级字段会保留。
|
|
261
|
+
- 应用提供的标量和 `false` 会覆盖预设值。省略字段或将其保留为 `undefined` 时,
|
|
262
|
+
预设值会保留。
|
|
263
|
+
- 数组和配置 hook 按预设优先的顺序组合。非函数数组项按深度相等去重,函数项则全部
|
|
264
|
+
保留。空数组或空对象不会清除预设已经提供的值。
|
|
265
|
+
|
|
266
|
+
这里没有通用的 reset sentinel。预设拥有的行为应使用类型化预设选项控制,应用拥有的
|
|
267
|
+
行为应使用普通应用配置覆盖。
|
|
268
|
+
|
|
269
|
+
`createPresetUltramodernConfig(options)` 是用于检查或生成一份全新预设配置的高级 API。
|
|
270
|
+
不要把它的结果展开进另一个配置对象。对象展开是浅层操作,替换 `server`、`output`
|
|
271
|
+
或其他嵌套对象时,会无提示地丢弃预设中的同级字段。编写 `modern.config.ts` 时应使用
|
|
272
|
+
`presetUltramodern(...)`。
|
|
273
|
+
|
|
274
|
+
### 裸预设与生成 workspace 的策略
|
|
275
|
+
|
|
276
|
+
预设和 workspace 生成器分别负责不同的配置:
|
|
277
|
+
|
|
278
|
+
| 来源 | 身份配置 | 其他配置 |
|
|
279
|
+
| --- | --- | --- |
|
|
280
|
+
| 裸 `createPresetUltramodernConfig()` 的结果 | 使用 `appId: 'app'`,不设置 `deliveryUnit` | 使用预设默认值。Telemetry 保持启用,但只有设置具体端点后才会配置对应导出器。 |
|
|
281
|
+
| 生成的应用 | 提供应用专属的 `appId` 和生成时写入的 `deliveryUnit` | 其他严格默认值继承自 `presetUltramodern(...)`。 |
|
|
282
|
+
| 应用 | 通过第一个 `appConfig` 参数提供配置 | 按 Modern.js 的正常合并规则覆盖应用拥有的字段。 |
|
|
283
|
+
|
|
284
|
+
应保留生成的 `appId` 和 `deliveryUnit` 选项。修改预设拥有的行为时,使用类型化选项,
|
|
285
|
+
例如
|
|
286
|
+
`enableTelemetryExporters: false`、`enableTelemetry: false`、
|
|
287
|
+
`enableBffRequestId: false` 或 `enableModuleFederationSSR: false`。修改应用拥有的
|
|
288
|
+
字段时,应像上面的示例一样,把覆盖值放在第一个参数中。
|
|
289
|
+
|
|
290
|
+
Telemetry 导出端点默认不设置:
|
|
291
|
+
|
|
292
|
+
- `MODERN_TELEMETRY_OTLP_ENDPOINT` 只启用 OTLP 导出器。
|
|
293
|
+
- `MODERN_TELEMETRY_VICTORIA_ENDPOINT` 只启用 VictoriaMetrics 导出器。
|
|
294
|
+
- 同时设置两个变量会启用两个导出器。两个变量都未设置时,telemetry 管线保持启用,
|
|
295
|
+
但不会配置导出器。
|
|
296
|
+
|
|
297
|
+
类型化的 `otlpEndpoint` 和 `victoriaMetricsEndpoint` 预设选项也能提供同样的
|
|
298
|
+
逐导出器行为,无需使用环境变量。
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
MODERN_TELEMETRY_OTLP_ENDPOINT=https://otel.example.com/v1/logs \
|
|
302
|
+
mise exec -- pnpm dev
|
|
303
|
+
```
|
|
304
|
+
|
|
215
305
|
## 人类工作流
|
|
216
306
|
|
|
217
307
|
公开的 BleedingDev create 包只有一个受支持的生成产品。默认命令会创建一个
|
|
@@ -220,7 +310,7 @@ SSR、TanStack Router、Tailwind CSS v4、i18n、Effect HttpApi BFF、Module Fed
|
|
|
220
310
|
topology、生成质量 gate,以及 Cloudflare 部署基础:
|
|
221
311
|
|
|
222
312
|
```bash
|
|
223
|
-
pnpm dlx @bleedingdev/modern-js-create myapp
|
|
313
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create myapp
|
|
224
314
|
cd myapp
|
|
225
315
|
mise install
|
|
226
316
|
mise exec -- pnpm install
|
|
@@ -231,10 +321,10 @@ workspace 从 shell 和平台契约起步,不强制生成演示业务域。真
|
|
|
231
321
|
再添加对应 MicroVertical:
|
|
232
322
|
|
|
233
323
|
```bash
|
|
234
|
-
pnpm dlx @bleedingdev/modern-js-create transportation --vertical
|
|
235
|
-
pnpm dlx @bleedingdev/modern-js-create food-delivery --vertical
|
|
236
|
-
pnpm dlx @bleedingdev/modern-js-create payments --vertical
|
|
237
|
-
pnpm dlx @bleedingdev/modern-js-create maps --vertical
|
|
324
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create transportation --vertical
|
|
325
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create food-delivery --vertical
|
|
326
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create payments --vertical
|
|
327
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create maps --vertical
|
|
238
328
|
mise exec -- pnpm check
|
|
239
329
|
```
|
|
240
330
|
|
|
@@ -247,10 +337,10 @@ ownership 记录、shell Module Federation、开发 overlays、包依赖、生
|
|
|
247
337
|
自动化脚本可以使用显式 MicroVertical 语法,不必依赖位置参数:
|
|
248
338
|
|
|
249
339
|
```bash
|
|
250
|
-
pnpm dlx @bleedingdev/modern-js-create --vertical=transportation
|
|
251
|
-
pnpm dlx @bleedingdev/modern-js-create --vertical-name transportation
|
|
252
|
-
pnpm dlx @bleedingdev/modern-js-create transportation --vertical --dry-run
|
|
253
|
-
pnpm dlx @bleedingdev/modern-js-create transportation --vertical \
|
|
340
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create --vertical=transportation
|
|
341
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create --vertical-name transportation
|
|
342
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create transportation --vertical --dry-run
|
|
343
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create transportation --vertical \
|
|
254
344
|
--codesmith-overlay ./generators/vertical-overlay
|
|
255
345
|
```
|
|
256
346
|
|
|
@@ -268,7 +358,7 @@ import {
|
|
|
268
358
|
addUltramodernVertical,
|
|
269
359
|
generateUltramodernWorkspace,
|
|
270
360
|
planUltramodernVertical,
|
|
271
|
-
} from '@modern-js/create/ultramodern-workspace';
|
|
361
|
+
} from '@modern-js/ultramodern-create/ultramodern-workspace';
|
|
272
362
|
|
|
273
363
|
const workspace = generateUltramodernWorkspace({
|
|
274
364
|
targetDir: '/tmp/my-workspace',
|
|
@@ -299,7 +389,7 @@ MicroVertical dry-run 返回相同结构,并额外包含 `dryRun`、`selectedP
|
|
|
299
389
|
CodeSmith 消费方可以使用 adapter subpath:
|
|
300
390
|
|
|
301
391
|
```ts
|
|
302
|
-
import ultramodernCodeSmith from '@modern-js/create/ultramodern-workspace/codesmith';
|
|
392
|
+
import ultramodernCodeSmith from '@modern-js/ultramodern-create/ultramodern-workspace/codesmith';
|
|
303
393
|
|
|
304
394
|
await ultramodernCodeSmith({
|
|
305
395
|
config: {
|
|
@@ -377,18 +467,6 @@ Live Cloudflare 与 Zephyr 证明需要公开 Worker URL 和 Zephyr 凭据。没
|
|
|
377
467
|
BleedingDev 包通过 GitHub Actions trusted publishing 发布。公开发布 workflow 不使用
|
|
378
468
|
长期 npm token;不要从开发机器手动发布包。
|
|
379
469
|
|
|
380
|
-
## 基线开关(可按需关闭)
|
|
381
|
-
|
|
382
|
-
生成的 `presetUltramodern(...)` 脚手架会开启更严格的平台契约。以下环境变量会在生成的 `modern.config.ts` 中读取,可按应用或按环境关闭/覆盖:
|
|
383
|
-
|
|
384
|
-
- `MODERN_BASELINE_ENABLE_MF_SSR`(默认:`true`):开启应用级 MF SSR 基线契约(`server.ssr.mode: 'stream'` + `moduleFederationAppSSR`)。应用不使用 app-level MF SSR 或希望先走普通 SSR/CSR 路径时可关闭。
|
|
385
|
-
- `MODERN_BASELINE_ENABLE_BFF_REQUEST_ID`(默认:`true`):开启默认 BFF producer 身份契约(`bff.requestId`)。应用不需要跨项目 producer 隔离时可关闭。
|
|
386
|
-
- `MODERN_BASELINE_ENABLE_TELEMETRY_EXPORTERS`(默认:`true`):在基线配置中启用 telemetry 导出器。当前环境还没有 telemetry 后端时可关闭。
|
|
387
|
-
- `MODERN_BASELINE_APP_ID`(默认:`basename(process.cwd())`):覆盖基线 `bff.requestId` 身份。需要固定、可治理的统一 producer ID 命名时建议设置。
|
|
388
|
-
- `MODERN_TELEMETRY_OTLP_ENDPOINT`(默认:`http://127.0.0.1:4318/v1/logs`):OTLP 导出端点。接入其他 OTLP collector 地址时覆盖。
|
|
389
|
-
- `MODERN_TELEMETRY_VICTORIA_ENDPOINT`(默认:`http://127.0.0.1:8428/api/v1/import/prometheus`):VictoriaMetrics 导出端点。接入其他 VM 写入地址时覆盖。
|
|
390
|
-
- `MODERN_TELEMETRY_FAIL_LOUD_STARTUP`(默认:`true`):导出器健康检查失败时启动即失败(fail-loud)。本地/开发环境希望 telemetry 故障不阻断启动时可关闭。
|
|
391
|
-
|
|
392
470
|
## 相关文档
|
|
393
471
|
|
|
394
472
|
- [BFF 运行时框架](/guides/advanced-features/bff/frameworks)
|
|
@@ -4,7 +4,7 @@ title: 路由鉴权
|
|
|
4
4
|
|
|
5
5
|
# 路由鉴权
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
UltraModern.js 默认使用基于 TanStack Router 的约定式路由,具体可查看[路由方案](/guides/basic-features/routes/routes#路由方案)。
|
|
8
8
|
|
|
9
9
|
在一个 Web 应用中如果存在多个路由,我们可能需要对部分路由进行鉴权后才能访问。例如下面这个案例:
|
|
10
10
|
|
|
@@ -12,6 +12,7 @@ Modern.js 默认提供的路由方式是基于 React Router 的约定式路由
|
|
|
12
12
|
- 访问 `/protected` 路由,需要鉴权,如果无,自动跳转到 `/login` 路由,登录成功后返回 `/protected`。
|
|
13
13
|
|
|
14
14
|
import Sandpack from '@site/src/components/Sandpack';
|
|
15
|
+
import { ultramodernSandpackFiles } from '@modern-js/ultramodern-sandpack-profile';
|
|
15
16
|
import srcRoutesPageText from '../../../../src/sandbox/csr-auth/src/routes/page-tsx.txt';
|
|
16
17
|
import srcRoutesLayoutText from '../../../../src/sandbox/csr-auth/src/routes/layout-tsx.txt';
|
|
17
18
|
import srcRoutesAuthText from '../../../../src/sandbox/csr-auth/src/routes/Auth-tsx.txt';
|
|
@@ -20,6 +21,7 @@ import srcRoutesProtectedPageText from '../../../../src/sandbox/csr-auth/src/rou
|
|
|
20
21
|
import srcRoutesLoginPageText from '../../../../src/sandbox/csr-auth/src/routes/login/page-tsx.txt';
|
|
21
22
|
|
|
22
23
|
<Sandpack template="web-app" files={{
|
|
24
|
+
...ultramodernSandpackFiles,
|
|
23
25
|
'/src/routes/page.tsx': srcRoutesPageText,
|
|
24
26
|
'/src/routes/layout.tsx': srcRoutesLayoutText,
|
|
25
27
|
'/src/routes/Auth.tsx': srcRoutesAuthText,
|
package/package.json
CHANGED
|
@@ -19,12 +19,13 @@
|
|
|
19
19
|
"modern.js",
|
|
20
20
|
"ultramodern.js"
|
|
21
21
|
],
|
|
22
|
-
"version": "3.8.
|
|
22
|
+
"version": "3.8.3-ultramodern.2",
|
|
23
23
|
"publishConfig": {
|
|
24
24
|
"access": "public"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@modern-js/sandpack-react": "npm:@bleedingdev/modern-js-sandpack-react@3.8.
|
|
27
|
+
"@modern-js/sandpack-react": "npm:@bleedingdev/modern-js-sandpack-react@3.8.3-ultramodern.2",
|
|
28
|
+
"@modern-js/ultramodern-sandpack-profile": "npm:@bleedingdev/modern-js-ultramodern-sandpack-profile@3.8.3-ultramodern.2",
|
|
28
29
|
"mermaid": "^11.16.0"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
package/rspress.config.ts
CHANGED
|
@@ -1,44 +1,26 @@
|
|
|
1
1
|
import { pluginSass } from '@rsbuild/plugin-sass';
|
|
2
|
-
import { defineConfig } from '@rspress/core';
|
|
3
2
|
import { transformerNotationHighlight } from '@shikijs/transformers';
|
|
4
3
|
import path from 'path';
|
|
5
4
|
import { pluginOpenGraph } from 'rsbuild-plugin-open-graph';
|
|
5
|
+
import { defineUltraModernConfig as defineConfig } from './ultramodern-preset/src/index.ts';
|
|
6
6
|
|
|
7
7
|
const docPath = path.join(__dirname, 'docs');
|
|
8
|
-
const
|
|
9
|
-
const siteTitle = 'UltraModern.js 3.0';
|
|
8
|
+
const siteTitle = 'Modern.js';
|
|
10
9
|
const siteDescription =
|
|
11
|
-
'
|
|
10
|
+
'The Modern.js framework is a progressive web framework based on React. At ByteDance, we use Modern.js to build upper-level frameworks that have supported the development of thousands of web applications.';
|
|
12
11
|
const socialDescription =
|
|
13
|
-
'A
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const trimmed = base.trim();
|
|
17
|
-
const withLeadingSlash = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
|
|
18
|
-
return withLeadingSlash.endsWith('/')
|
|
19
|
-
? withLeadingSlash
|
|
20
|
-
: `${withLeadingSlash}/`;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// Set by CI for GitHub Pages project sites. Defaults to root for local dev/custom domains.
|
|
24
|
-
const docsBase = normalizeBase(process.env.DOCS_BASE);
|
|
25
|
-
const docsOrigin = (
|
|
26
|
-
process.env.DOCS_ORIGIN || 'https://bleedingdev.github.io'
|
|
27
|
-
).replace(/\/+$/, '');
|
|
28
|
-
const siteUrl = new URL(docsBase, `${docsOrigin}/`).toString();
|
|
29
|
-
const socialImage = new URL('img/social-card.svg', siteUrl).toString();
|
|
30
|
-
const faviconUrl = new URL('img/favicon.ico', siteUrl).toString();
|
|
31
|
-
const docsAsset = (assetPath: string) =>
|
|
32
|
-
`${docsBase}${assetPath.replace(/^\//, '')}`;
|
|
12
|
+
'A Progressive React Framework for modern web development.';
|
|
13
|
+
const socialImage =
|
|
14
|
+
'https://lf3-static.bytednsdoc.com/obj/eden-cn/nuvjhpqnuvr/modern-website/banner.jpeg';
|
|
33
15
|
|
|
34
16
|
export default defineConfig({
|
|
35
17
|
root: docPath,
|
|
36
18
|
llms: true,
|
|
37
19
|
title: siteTitle,
|
|
38
20
|
description: siteDescription,
|
|
39
|
-
base:
|
|
40
|
-
logo:
|
|
41
|
-
icon:
|
|
21
|
+
base: '/',
|
|
22
|
+
logo: 'https://lf-cdn-tos.bytescm.com/obj/static/webinfra/modern-js-website/assets/images/images/modernjs-logo.svg',
|
|
23
|
+
icon: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/uhbfnupenuhf/favicon.ico',
|
|
42
24
|
lang: 'en',
|
|
43
25
|
themeDir: path.join(__dirname, 'src'),
|
|
44
26
|
markdown: {
|
|
@@ -50,40 +32,24 @@ export default defineConfig({
|
|
|
50
32
|
search: {
|
|
51
33
|
codeBlocks: true,
|
|
52
34
|
},
|
|
53
|
-
// head: [
|
|
54
|
-
// () => {
|
|
55
|
-
// return [
|
|
56
|
-
// `<meta property="og:image" content="${socialImage}">`,
|
|
57
|
-
// `<meta property="og:description" content="${socialDescription}">`,
|
|
58
|
-
// `<meta property="og:image:alt" content="${siteTitle}">`,
|
|
59
|
-
// `<meta name="twitter:card" content="summary_large_image">`,
|
|
60
|
-
// `<meta name="twitter:title" content="${siteTitle}">`,
|
|
61
|
-
// `<meta name="twitter:description" content="${socialDescription}">`,
|
|
62
|
-
// `<meta name="twitter:image" content="${socialImage}">`,
|
|
63
|
-
// `<meta name="twitter:image:alt" content="${siteTitle}">`,
|
|
64
|
-
// ].join('');
|
|
65
|
-
// },
|
|
66
|
-
// ],
|
|
67
35
|
themeConfig: {
|
|
68
36
|
locales: [
|
|
69
37
|
{
|
|
70
38
|
lang: 'zh',
|
|
71
39
|
title: siteTitle,
|
|
72
40
|
description: socialDescription,
|
|
73
|
-
// nav: getNavbar('zh'),
|
|
74
41
|
label: '简体中文',
|
|
75
42
|
},
|
|
76
43
|
{
|
|
77
44
|
lang: 'en',
|
|
78
45
|
title: siteTitle,
|
|
79
46
|
description: socialDescription,
|
|
80
|
-
// nav: getNavbar('en'),
|
|
81
47
|
label: 'English',
|
|
82
48
|
},
|
|
83
49
|
],
|
|
84
50
|
editLink: {
|
|
85
51
|
docRepoBaseUrl:
|
|
86
|
-
'https://github.com/
|
|
52
|
+
'https://github.com/web-infra-dev/modern.js/tree/main/packages/document/docs',
|
|
87
53
|
text: 'Edit this page on GitHub',
|
|
88
54
|
},
|
|
89
55
|
socialLinks: [
|
|
@@ -95,7 +61,7 @@ export default defineConfig({
|
|
|
95
61
|
{
|
|
96
62
|
icon: 'github',
|
|
97
63
|
mode: 'link',
|
|
98
|
-
content: 'https://github.com/
|
|
64
|
+
content: 'https://github.com/web-infra-dev/modern.js',
|
|
99
65
|
},
|
|
100
66
|
],
|
|
101
67
|
},
|
|
@@ -105,7 +71,8 @@ export default defineConfig({
|
|
|
105
71
|
},
|
|
106
72
|
replaceRules: [
|
|
107
73
|
{
|
|
108
|
-
//
|
|
74
|
+
// The major version is different inside the ByteDance,
|
|
75
|
+
// so we use a flag to define it.
|
|
109
76
|
search: /MAJOR_VERSION/g,
|
|
110
77
|
replace: '2',
|
|
111
78
|
},
|
|
@@ -128,11 +95,6 @@ export default defineConfig({
|
|
|
128
95
|
output: {
|
|
129
96
|
dataUriLimit: 0,
|
|
130
97
|
},
|
|
131
|
-
server: {
|
|
132
|
-
publicDir: {
|
|
133
|
-
name: staticPath,
|
|
134
|
-
},
|
|
135
|
-
},
|
|
136
98
|
dev: {
|
|
137
99
|
lazyCompilation: process.env.LAZY !== 'false',
|
|
138
100
|
},
|
|
@@ -147,15 +109,15 @@ export default defineConfig({
|
|
|
147
109
|
pluginSass(),
|
|
148
110
|
pluginOpenGraph({
|
|
149
111
|
// Note, title is page-specific
|
|
150
|
-
title: '
|
|
112
|
+
title: 'Modern.js Home Page',
|
|
151
113
|
// While site name is site wide
|
|
152
114
|
siteName: siteTitle,
|
|
153
115
|
type: 'website',
|
|
154
|
-
url:
|
|
116
|
+
url: 'https://modernjs.dev/',
|
|
155
117
|
image: socialImage,
|
|
156
118
|
description: socialDescription,
|
|
157
119
|
twitter: {
|
|
158
|
-
site: '@
|
|
120
|
+
site: '@_Modern_JS',
|
|
159
121
|
card: 'summary_large_image',
|
|
160
122
|
},
|
|
161
123
|
}),
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
Navigate,
|
|
3
|
+
useLocation,
|
|
4
|
+
useNavigate,
|
|
5
|
+
} from '@modern-js/plugin-tanstack/runtime';
|
|
2
6
|
import React from 'react';
|
|
3
7
|
import { fakeAuthProvider } from './fakeAuth';
|
|
4
8
|
|
|
@@ -49,7 +53,7 @@ export function AuthStatus() {
|
|
|
49
53
|
<button
|
|
50
54
|
type="button"
|
|
51
55
|
onClick={() => {
|
|
52
|
-
auth.signout(() => navigate('/'));
|
|
56
|
+
auth.signout(() => void navigate({ to: '/' }));
|
|
53
57
|
}}
|
|
54
58
|
>
|
|
55
59
|
Sign out
|
|
@@ -67,7 +71,13 @@ export function RequireAuth({ children }: { children: JSX.Element }) {
|
|
|
67
71
|
// trying to go to when they were redirected. This allows us to send them
|
|
68
72
|
// along to that page after they login, which is a nicer user experience
|
|
69
73
|
// than dropping them off on the home page.
|
|
70
|
-
return
|
|
74
|
+
return (
|
|
75
|
+
<Navigate
|
|
76
|
+
replace
|
|
77
|
+
search={{ redirect: location.pathname }}
|
|
78
|
+
to="/login"
|
|
79
|
+
/>
|
|
80
|
+
);
|
|
71
81
|
}
|
|
72
82
|
|
|
73
83
|
return children;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Link, Outlet } from '@modern-js/runtime
|
|
1
|
+
import { Link, Outlet } from '@modern-js/plugin-tanstack/runtime';
|
|
2
2
|
import { AuthProvider, AuthStatus } from './Auth';
|
|
3
3
|
|
|
4
4
|
export default function Layout() {
|
|
@@ -8,10 +8,10 @@ export default function Layout() {
|
|
|
8
8
|
|
|
9
9
|
<ul>
|
|
10
10
|
<li>
|
|
11
|
-
<Link to="/">Public Page</Link>
|
|
11
|
+
<Link prefetch="render" to="/">Public Page</Link>
|
|
12
12
|
</li>
|
|
13
13
|
<li>
|
|
14
|
-
<Link to="/protected">Protected Page</Link>
|
|
14
|
+
<Link prefetch="render" to="/protected">Protected Page</Link>
|
|
15
15
|
</li>
|
|
16
16
|
</ul>
|
|
17
17
|
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
useLocation,
|
|
3
|
+
useNavigate,
|
|
4
|
+
} from '@modern-js/plugin-tanstack/runtime';
|
|
2
5
|
import { useAuth } from '../Auth';
|
|
3
6
|
|
|
4
7
|
export default function Login() {
|
|
@@ -6,7 +9,8 @@ export default function Login() {
|
|
|
6
9
|
const location = useLocation();
|
|
7
10
|
const auth = useAuth();
|
|
8
11
|
|
|
9
|
-
const from =
|
|
12
|
+
const from =
|
|
13
|
+
new URLSearchParams(location.searchStr).get('redirect') || '/';
|
|
10
14
|
|
|
11
15
|
function handleSubmit(event: React.FormEvent<HTMLFormElement>) {
|
|
12
16
|
event.preventDefault();
|
|
@@ -21,7 +25,7 @@ export default function Login() {
|
|
|
21
25
|
// when they get to the protected page and click the back button, they
|
|
22
26
|
// won't end up back on the login page, which is also really nice for the
|
|
23
27
|
// user experience.
|
|
24
|
-
navigate(
|
|
28
|
+
void navigate({ replace: true, to: from });
|
|
25
29
|
});
|
|
26
30
|
}
|
|
27
31
|
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="220" height="48" viewBox="0 0 220 48" role="img" aria-labelledby="title">
|
|
2
|
+
<title id="title">UltraModern.js</title>
|
|
3
|
+
<rect width="48" height="48" rx="12" fill="#020617"/>
|
|
4
|
+
<path fill="#14b8a6" d="M13 13h7v13c0 5 2.6 8 7 8s7-3 7-8V13h7v13c0 8.8-5.6 14-14 14s-14-5.2-14-14V13z"/>
|
|
5
|
+
<path fill="#38bdf8" d="M31 13h8v27h-8V13z"/>
|
|
6
|
+
<text x="60" y="31" fill="#f8fafc" font-family="Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="23" font-weight="700">UltraModern.js</text>
|
|
7
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@modern-js/ultramodern-docs-preset",
|
|
3
|
+
"version": "3.8.3",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "node --test tests/*.test.ts"
|
|
8
|
+
},
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=26.7.0"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"rsbuild-plugin-open-graph": "1.1.3"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@rspress/core": "2.0.17",
|
|
17
|
+
"@types/node": "^26.2.0"
|
|
18
|
+
}
|
|
19
|
+
}
|