laybot-vite-dev 0.1.0 → 1.0.1
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/README.md +102 -93
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,55 +1,79 @@
|
|
|
1
1
|
# laybot-vite-dev
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`laybot-vite-dev` 是 Laybot/LarryMS MPA 项目在 **Vite 开发模式**下的 URL 重写适配插件。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
它的目标是:让浏览器在 dev 环境仍然可以按“生产环境路径”访问资源与模块,例如:
|
|
6
|
+
|
|
7
|
+
- `/laybot/larryms.js`
|
|
8
|
+
- `/static/css/admin.dark.css`
|
|
9
|
+
- `/api/common.js`
|
|
10
|
+
- `/assets/app/main.js`
|
|
11
|
+
|
|
12
|
+
同时 **不破坏 Vite HMR 的 WebSocket 连接**。
|
|
6
13
|
|
|
7
14
|
---
|
|
8
15
|
|
|
9
|
-
##
|
|
16
|
+
## 为什么需要它?
|
|
10
17
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- `/xxx.html` → `src/views/xxx.html`
|
|
14
|
-
- **统一业务根目录 `/assets/`**
|
|
15
|
-
- `/assets/**` → `/src/**`(去掉 `assets` 前缀)
|
|
16
|
-
- 推荐 LarryMS MPA 项目统一把业务模块/资源发布在生产环境的 `dist/assets/**`
|
|
17
|
-
- **框架运行时 `/laybot/` 映射**
|
|
18
|
-
- `/laybot/**` → `/src/laybot/**`
|
|
19
|
-
- **静态资源 `/static/` 映射**
|
|
20
|
-
- `/static/**` → `/src/static/**`
|
|
21
|
-
- **兼容旧写法 `/app/`**
|
|
22
|
-
- `/app/**` → `/src/app/**`(可用于过渡期或老项目)
|
|
23
|
-
- **不会破坏 Vite HMR**
|
|
24
|
-
- 自动放行 WebSocket upgrade 与 Vite 内部路径(`/@vite`、`/@id`、`/@fs`、`/__vite`…)
|
|
18
|
+
LarryMS/Laybot 的 runtime loader(`larryms.use`)会在浏览器端动态插入 `<script src="...">` 加载模块。
|
|
19
|
+
在生产环境这些模块位于 `dist/` 目录结构下,而在 Vite dev 环境源码通常位于 `src/`。
|
|
25
20
|
|
|
26
|
-
|
|
21
|
+
如果不做 URL 映射,开发环境会出现大量 404(例如请求 `/api/common.js`,但文件真实在 `src/api/common.js`)。
|
|
27
22
|
|
|
28
|
-
|
|
23
|
+
本插件通过 Vite middleware 把这些 URL 改写到源码目录,从而实现:
|
|
29
24
|
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
|
|
34
|
-
- `dist/assets/**`(业务模块与资源)
|
|
35
|
-
- `dist/laybot/**`(框架运行时)
|
|
36
|
-
- `dist/static/**`(静态资源)
|
|
25
|
+
- **MPA 页面开发体验稳定**
|
|
26
|
+
- **dev/prod 路径语义一致**
|
|
27
|
+
- **无需在每个页面写大量初始化逻辑**
|
|
28
|
+
- **HMR 不会挂**
|
|
37
29
|
|
|
38
30
|
---
|
|
39
31
|
|
|
32
|
+
## 特性
|
|
33
|
+
|
|
34
|
+
### 1) MPA HTML 路由映射
|
|
35
|
+
- `/`、`/index.html` → `/src/views/index.html`
|
|
36
|
+
- `/xxx.html` → `/src/views/xxx.html`
|
|
37
|
+
|
|
38
|
+
### 2) 默认支持的目录前缀(开箱即用)
|
|
39
|
+
以下请求会自动映射到 `/src`:
|
|
40
|
+
|
|
41
|
+
| 请求 URL 前缀 | dev 映射目标 |
|
|
42
|
+
|---|---|
|
|
43
|
+
| `/api/` | `/src/api/` |
|
|
44
|
+
| `/route/` | `/src/route/` |
|
|
45
|
+
| `/mock/` | `/src/mock/` |
|
|
46
|
+
| `/store/` | `/src/store/` |
|
|
47
|
+
| `/utils/` | `/src/utils/` |
|
|
48
|
+
| `/plugin/` | `/src/plugin/` |
|
|
49
|
+
| `/components/` | `/src/components/` |
|
|
50
|
+
| `/laybot/` | `/src/laybot/` |
|
|
51
|
+
| `/static/` | `/src/static/` |
|
|
52
|
+
| `/app/` | `/src/app/` |
|
|
53
|
+
|
|
54
|
+
此外还支持“去前缀”映射(默认启用):
|
|
55
|
+
- `/assets/**` → `/src/**`(去掉 `assets` 前缀)
|
|
56
|
+
|
|
57
|
+
> 说明:这套默认值就是 LarryMS/Laybot 框架在 MPA 模式下常见的目录结构,保证你现有项目无需改动就能跑。
|
|
58
|
+
|
|
59
|
+
### 3) HMR WebSocket 安全放行
|
|
60
|
+
插件会自动放行:
|
|
61
|
+
- `upgrade: websocket` 的请求(Vite HMR)
|
|
62
|
+
- Vite 内部路径(`/@vite`、`/@id`、`/@fs`、`/__vite` 等)
|
|
63
|
+
|
|
64
|
+
避免出现:
|
|
65
|
+
- `[vite] failed to connect to websocket`
|
|
66
|
+
|
|
67
|
+
|
|
40
68
|
## 安装
|
|
41
69
|
|
|
42
70
|
```bash
|
|
43
71
|
npm i -D laybot-vite-dev
|
|
44
72
|
```
|
|
45
73
|
|
|
46
|
-
> 如果你使用 pnpm/yarn 也可对应安装。
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
74
|
## 使用
|
|
51
75
|
|
|
52
|
-
|
|
76
|
+
在 `vite.config.js` 中使用:
|
|
53
77
|
|
|
54
78
|
```js
|
|
55
79
|
import { defineConfig } from 'vite'
|
|
@@ -58,43 +82,31 @@ import laybotViteDev from 'laybot-vite-dev'
|
|
|
58
82
|
export default defineConfig({
|
|
59
83
|
server: { port: 5173 },
|
|
60
84
|
plugins: [
|
|
61
|
-
laybotViteDev(
|
|
62
|
-
debug: false
|
|
63
|
-
})
|
|
85
|
+
laybotViteDev()
|
|
64
86
|
]
|
|
65
87
|
})
|
|
66
88
|
```
|
|
67
89
|
|
|
68
|
-
然后访问:
|
|
69
90
|
|
|
70
|
-
|
|
71
|
-
- http://localhost:5173/login.html → `src/views/login.html`
|
|
91
|
+
## 自定义:增加更多业务目录(例如 /service/)
|
|
72
92
|
|
|
73
|
-
|
|
93
|
+
如果你新增了源码目录:
|
|
74
94
|
|
|
75
|
-
|
|
76
|
-
<link rel="stylesheet" href="/laybot/css/larryms.css" />
|
|
77
|
-
<link rel="stylesheet" href="/static/css/admin.dark.css" />
|
|
78
|
-
<script src="/laybot/larryms.js"></script>
|
|
79
|
-
<script src="/assets/app/laybot.js"></script>
|
|
80
|
-
```
|
|
95
|
+
- `src/service/**`
|
|
81
96
|
|
|
82
|
-
|
|
97
|
+
并希望 dev 下可以请求:
|
|
83
98
|
|
|
84
|
-
|
|
99
|
+
- `/service/xxx.js` → `/src/service/xxx.js`
|
|
85
100
|
|
|
86
|
-
|
|
87
|
-
LarryMS MPA 建议约定:生产环境业务模块都在 `/assets/` 下。
|
|
101
|
+
只需:
|
|
88
102
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
- 业务项目无需理解其内部结构,只要按固定 URL 引用即可
|
|
103
|
+
```js
|
|
104
|
+
laybotViteDev({
|
|
105
|
+
toSrcPrefixes: ['/service/']
|
|
106
|
+
})
|
|
107
|
+
```
|
|
95
108
|
|
|
96
|
-
|
|
97
|
-
- 例如主题 css、svg、音频等放在 `dist/static/**`
|
|
109
|
+
> 注意:**不需要手动拼接默认前缀列表**。插件会自动把你的 `toSrcPrefixes` 与默认列表合并(去重)。
|
|
98
110
|
|
|
99
111
|
---
|
|
100
112
|
|
|
@@ -102,58 +114,55 @@ LarryMS MPA 建议约定:生产环境业务模块都在 `/assets/` 下。
|
|
|
102
114
|
|
|
103
115
|
```js
|
|
104
116
|
laybotViteDev({
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
laybotPrefix: '/laybot/', // 默认:/laybot/
|
|
108
|
-
staticPrefix: '/static/', // 默认:/static/
|
|
109
|
-
appPrefix: '/app/', // 默认:/app/(兼容用)
|
|
110
|
-
debug: false // 默认 false;true 时打印 rewrite 前后关系
|
|
111
|
-
})
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### debug
|
|
115
|
-
开启后会输出每次重写的映射结果,便于定位 404:
|
|
116
|
-
|
|
117
|
-
```bash
|
|
118
|
-
[laybot-vite-dev] /static/css/admin.dark.css => /src/static/css/admin.dark.css
|
|
119
|
-
```
|
|
117
|
+
// MPA views 源目录
|
|
118
|
+
viewsDir: '/src/views',
|
|
120
119
|
|
|
121
|
-
|
|
120
|
+
// / 映射用的首页文件名
|
|
121
|
+
htmlFallback: 'index.html',
|
|
122
122
|
|
|
123
|
-
|
|
123
|
+
// 源码根目录(一般固定 /src)
|
|
124
|
+
srcRoot: '/src',
|
|
124
125
|
|
|
125
|
-
|
|
126
|
-
|
|
126
|
+
// 需要直接映射到 /src 的前缀(可追加)
|
|
127
|
+
toSrcPrefixes: ['/service/'],
|
|
127
128
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
- `/@vite`、`/@id`、`/@fs`、`/__vite` 等 Vite 内部路径
|
|
129
|
+
// 需要去掉前缀再映射到 /src 的前缀
|
|
130
|
+
stripPrefixes: ['/assets/'],
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
// 输出映射日志
|
|
133
|
+
debug: false
|
|
134
|
+
})
|
|
135
|
+
```
|
|
133
136
|
|
|
134
137
|
---
|
|
135
138
|
|
|
136
|
-
|
|
137
|
-
请确认文件存在于源码目录:
|
|
139
|
+
## 常见问题
|
|
138
140
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
-
|
|
142
|
-
- `src
|
|
141
|
+
### 1) dev 下出现大量 404
|
|
142
|
+
请检查:
|
|
143
|
+
- 插件是否已加入 Vite plugins
|
|
144
|
+
- 相关文件是否存在于 `src` 对应目录
|
|
145
|
+
- 是否请求了未在前缀列表中的路径(可通过 `toSrcPrefixes` 追加)
|
|
143
146
|
|
|
144
|
-
|
|
147
|
+
### 2) `[vite] failed to connect to websocket`
|
|
148
|
+
一般是你项目里其它中间件/代理重写了 WebSocket upgrade 请求。
|
|
149
|
+
本插件已做放行,但如果你自己还写了 `middlewares.use`,请确保对 `upgrade: websocket` 的请求不要重写 `req.url`。
|
|
145
150
|
|
|
146
151
|
---
|
|
147
152
|
|
|
148
|
-
|
|
149
|
-
因为 LarryMS 的 runtime loader 会动态加载业务模块。如果允许业务模块在 dev/prod 中出现多套 URL 体系(例如 dev 用 `/api/*.js`,prod 用 `/assets/*.js`),很容易出现:
|
|
150
|
-
- 某个页面忘了更新路径导致 404
|
|
151
|
-
- devRewrite 规则越来越多、越来越难维护
|
|
152
|
-
- MPA 页面之间初始化逻辑分裂
|
|
153
|
+
## 推荐约定(稳定的大项目规范)
|
|
153
154
|
|
|
154
|
-
|
|
155
|
+
- 生产结构建议固定为:
|
|
156
|
+
- `dist/laybot/**` 框架
|
|
157
|
+
- `dist/static/**` 静态资源
|
|
158
|
+
- `dist/assets/**` 业务产物(推荐统一业务模块 root)
|
|
159
|
+
|
|
160
|
+
- 开发环境路径建议与生产一致:
|
|
161
|
+
- 页面里引用 `/laybot/**`、`/static/**`
|
|
162
|
+
- 模块可使用 `/assets/**` 或框架内置的 `/api/ /route/ ...` 等目录
|
|
155
163
|
|
|
156
164
|
---
|
|
157
165
|
|
|
158
166
|
## License
|
|
159
|
-
|
|
167
|
+
|
|
168
|
+
LayBot Grant PPL
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
var d=Object.freeze({srcRoot:"/src",viewsDir:"/src/views",htmlFallback:"index.html",debug:!1,toSrcPrefixes:["/api/","/route/","/mock/","/store/","/utils/","/plugin/","/components/","/laybot/","/static/","/app/","/platform/"],stripPrefixes:["/assets/"]});function v(i){let c=[],u=new Set;for(let r of i||[]){let o=String(r||"").trim();o&&(u.has(o)||(u.add(o),c.push(o)))}return c}function l(i,c){return i+(c?`?${c}`:"")}function b(i={}){let c=i.prefixes||i.toSrcPrefixes||[],u=i.strip||i.stripPrefixes||[],r={...d,...i,toSrcPrefixes:v([...d.toSrcPrefixes,...c]),stripPrefixes:v([...d.stripPrefixes,...u])},o=(...p)=>{r.debug&&console.log("[laybot-vite-dev]",...p)};return{name:"laybot-vite-dev",enforce:"pre",configureServer(p){p.middlewares.use((e,m,n)=>{let f=e.url||"/",[t,a=""]=f.split("?");if((e.headers.upgrade||"").toLowerCase()==="websocket"||t.startsWith("/@vite")||t.startsWith("/@id")||t.startsWith("/@fs")||t.startsWith("/__vite")||t==="/favicon.ico")return n();if(t==="/"||t==="/index.html"){let s=`${r.viewsDir}/${r.htmlFallback}`;return e.url=l(s,a),o(f,"=>",e.url),n()}if(/\.html$/i.test(t)&&!t.startsWith(r.viewsDir+"/")){let s=`${r.viewsDir}${t}`;return e.url=l(s,a),o(f,"=>",e.url),n()}for(let s of r.stripPrefixes)if(s&&t.startsWith(s)){let h=t.slice(s.length-1),S=`${r.srcRoot}${h}`;return e.url=l(S,a),o(f,"=>",e.url),n()}for(let s of r.toSrcPrefixes)if(s&&t.startsWith(s)){let h=`${r.srcRoot}${t}`;return e.url=l(h,a),o(f,"=>",e.url),n()}return n()})}}}export{b as default};
|