laybot-vite-dev 0.1.0 → 1.0.0

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.
Files changed (3) hide show
  1. package/README.md +102 -93
  2. package/dist/index.js +1 -1
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,55 +1,79 @@
1
1
  # laybot-vite-dev
2
2
 
3
- Vite 开发服务器适配插件,用于 **LarryMS MPA(多页)+ runtime loader(`larryms.use`)** 的开发模式。
3
+ `laybot-vite-dev` Laybot/LarryMS MPA 项目在 **Vite 开发模式**下的 URL 重写适配插件。
4
4
 
5
- 它解决的核心问题是:LarryMS 在浏览器里按 **固定 URL 前缀**请求资源(如 `/assets/**`、`/laybot/**`、`/static/**`),但在 Vite dev 下源码实际位于 `src/**`。本插件会在 dev server 中间件层做 URL 重写,使 **开发环境访问路径与生产环境一致**,且不会破坏 Vite HMR WebSocket。
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
- - **MPA HTML 路由映射**
12
- - `/`、`/index.html` `src/views/index.html`
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
- - 你使用 LarryMS(`larryms.define/larryms.use`)做模块加载
31
- - 项目是 MPA:每个页面一个 `.html`,不走 Vue/React SPA 路由
32
- - 构建产物约定:
33
- - `dist/index.html`、`dist/login.html`(或更多页面)
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
- 在项目的 `vite.config.js` 中引入并加入 plugins:
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
- - http://localhost:5173/ → `src/views/index.html`
71
- - http://localhost:5173/login.html → `src/views/login.html`
91
+ ## 自定义:增加更多业务目录(例如 /service/)
72
92
 
73
- 页面里引用的生产路径在 dev 下仍然可用,例如:
93
+ 如果你新增了源码目录:
74
94
 
75
- ```html
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
- ### 1)业务模块统一发布到 `/assets/`
87
- LarryMS MPA 建议约定:生产环境业务模块都在 `/assets/` 下。
101
+ 只需:
88
102
 
89
- - 好处:URL 语义统一、构建结构稳定、文档清晰、CDN 缓存策略统一
90
- - 你的源码可以自由组织(`src/app`、`src/biz`、`src/features`…),最终只要构建输出到 `dist/assets/**` 即可
91
-
92
- ### 2)框架运行时固定 `/laybot/`
93
- - `larryms.js` 与框架 css/font/images 固定在 `dist/laybot/**`
94
- - 业务项目无需理解其内部结构,只要按固定 URL 引用即可
103
+ ```js
104
+ laybotViteDev({
105
+ toSrcPrefixes: ['/service/']
106
+ })
107
+ ```
95
108
 
96
- ### 3)静态资源固定 `/static/`
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
- viewsDir: '/src/views', // 默认:/src/views
106
- assetsPrefix: '/assets/', // 默认:/assets/
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
- ### 1)`[vite] failed to connect to websocket`
126
- 原因:你在 Vite dev 中间件里重写了 WebSocket upgrade 请求(HMR 握手),导致连接失败。
126
+ // 需要直接映射到 /src 的前缀(可追加)
127
+ toSrcPrefixes: ['/service/'],
127
128
 
128
- 本插件已内置放行:
129
- - `upgrade: websocket`
130
- - `/@vite`、`/@id`、`/@fs`、`/__vite` 等 Vite 内部路径
129
+ // 需要去掉前缀再映射到 /src 的前缀
130
+ stripPrefixes: ['/assets/'],
131
131
 
132
- 若你自行添加了其它中间件,请确保它们不会重写 WebSocket 请求。
132
+ // 输出映射日志
133
+ debug: false
134
+ })
135
+ ```
133
136
 
134
137
  ---
135
138
 
136
- ### 2)`/laybot/larryms.js 404` 或 `/static/... 404`
137
- 请确认文件存在于源码目录:
139
+ ## 常见问题
138
140
 
139
- - `src/laybot/larryms.js`
140
- - `src/laybot/css/larryms.css`
141
- - `src/static/css/...`
142
- - `src/app/laybot.js`
141
+ ### 1) dev 下出现大量 404
142
+ 请检查:
143
+ - 插件是否已加入 Vite plugins
144
+ - 相关文件是否存在于 `src` 对应目录
145
+ - 是否请求了未在前缀列表中的路径(可通过 `toSrcPrefixes` 追加)
143
146
 
144
- 并确认插件已加入 Vite plugins 列表且 dev server 已重启。
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
- ### 3)为什么插件要强制统一 `/assets/`?
149
- 因为 LarryMS 的 runtime loader 会动态加载业务模块。如果允许业务模块在 dev/prod 中出现多套 URL 体系(例如 dev 用 `/api/*.js`,prod 用 `/assets/*.js`),很容易出现:
150
- - 某个页面忘了更新路径导致 404
151
- - devRewrite 规则越来越多、越来越难维护
152
- - MPA 页面之间初始化逻辑分裂
153
+ ## 推荐约定(稳定的大项目规范)
153
154
 
154
- 统一 `/assets/` 可以让开发环境与生产环境保持一致,减少路径问题。
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
- MIT (建议你根据实际发布策略修改许可证说明)
167
+
168
+ LayBot Grant PPL
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- function c(u={}){let i={viewsDir:u.viewsDir||"/src/views",debug:u.debug===!0,assetsPrefix:u.assetsPrefix||"/assets/",laybotPrefix:u.laybotPrefix||"/laybot/",staticPrefix:u.staticPrefix||"/static/",appPrefix:u.appPrefix||"/app/"},l=(...f)=>i.debug&&console.log("[laybot-vite-dev]",...f);return{name:"laybot-vite-dev",enforce:"pre",configureServer(f){f.middlewares.use((r,o,e)=>{let a=r.url||"/",[t,s=""]=a.split("?");if((r.headers.upgrade||"").toLowerCase()==="websocket"||t.startsWith("/@vite")||t.startsWith("/@id")||t.startsWith("/@fs")||t.startsWith("/__vite")||t==="/favicon.ico")return e();if(t==="/"||t==="/index.html")return r.url=`${i.viewsDir}/index.html`+(s?`?${s}`:""),l(a,"=>",r.url),e();if(/\.html$/i.test(t)&&!t.startsWith(i.viewsDir+"/"))return r.url=`${i.viewsDir}${t}`+(s?`?${s}`:""),l(a,"=>",r.url),e();if(t.startsWith(i.assetsPrefix))return r.url="/src"+t.slice(i.assetsPrefix.length-1)+(s?`?${s}`:""),l(a,"=>",r.url),e();if(t.startsWith(i.laybotPrefix))return r.url="/src"+t+(s?`?${s}`:""),l(a,"=>",r.url),e();if(t.startsWith(i.staticPrefix))return r.url="/src"+t+(s?`?${s}`:""),l(a,"=>",r.url),e();if(t.startsWith(i.appPrefix))return r.url="/src"+t+(s?`?${s}`:""),l(a,"=>",r.url),e();e()})}}}export{c as default};
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/"],stripPrefixes:["/assets/"]});function v(i){let c=[],f=new Set;for(let r of i||[]){let o=String(r||"").trim();o&&(f.has(o)||(f.add(o),c.push(o)))}return c}function l(i,c){return i+(c?`?${c}`:"")}function b(i={}){let c=i.prefixes||i.toSrcPrefixes||[],f=i.strip||i.stripPrefixes||[],r={...d,...i,toSrcPrefixes:v([...d.toSrcPrefixes,...c]),stripPrefixes:v([...d.stripPrefixes,...f])},o=(...h)=>{r.debug&&console.log("[laybot-vite-dev]",...h)};return{name:"laybot-vite-dev",enforce:"pre",configureServer(h){h.middlewares.use((e,m,n)=>{let u=e.url||"/",[t,a=""]=u.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(u,"=>",e.url),n()}if(/\.html$/i.test(t)&&!t.startsWith(r.viewsDir+"/")){let s=`${r.viewsDir}${t}`;return e.url=l(s,a),o(u,"=>",e.url),n()}for(let s of r.stripPrefixes)if(s&&t.startsWith(s)){let p=t.slice(s.length-1),S=`${r.srcRoot}${p}`;return e.url=l(S,a),o(u,"=>",e.url),n()}for(let s of r.toSrcPrefixes)if(s&&t.startsWith(s)){let p=`${r.srcRoot}${t}`;return e.url=l(p,a),o(u,"=>",e.url),n()}return n()})}}}export{b as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "laybot-vite-dev",
3
- "version": "0.1.0",
3
+ "version": "1.0.0",
4
4
  "description": "Vite dev rewrite plugin for LayBot/LarryMS MPA runtime loader",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",