@lark-apaas/fullstack-rspack-preset 0.1.2-alpha.2 → 0.1.2-alpha.3
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 +318 -0
- package/lib/index.js +7 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# @lark-apaas/fullstack-rspack-preset
|
|
2
|
+
|
|
3
|
+
> 开箱即用的 Fullstack Rspack 配置预设
|
|
4
|
+
|
|
5
|
+
提供开箱即用的 Rspack 配置,包含路由解析、性能监控、模块别名、HMR 等完整功能。
|
|
6
|
+
|
|
7
|
+
## 特性
|
|
8
|
+
|
|
9
|
+
- ✅ **零配置** - 环境变量驱动,开箱即用
|
|
10
|
+
- ✅ **路由解析** - 自动解析 React Router 路由生成 routes.json
|
|
11
|
+
- ✅ **性能监控** - 集成 Slardar 性能监控
|
|
12
|
+
- ✅ **模块优化** - clsx + tailwind-merge、echarts 别名
|
|
13
|
+
- ✅ **HMR 监控** - 热更新时间统计
|
|
14
|
+
- ✅ **React Refresh** - 支持 React 快速刷新
|
|
15
|
+
- ✅ **TypeScript** - 完整的类型定义
|
|
16
|
+
- ✅ **向后兼容** - 同时支持新旧两种 API
|
|
17
|
+
|
|
18
|
+
## 安装
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install @lark-apaas/fullstack-rspack-preset
|
|
22
|
+
# or
|
|
23
|
+
yarn add @lark-apaas/fullstack-rspack-preset
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 快速开始
|
|
27
|
+
|
|
28
|
+
### 1. 简化版 API(推荐)
|
|
29
|
+
|
|
30
|
+
只需提供必要的覆盖配置,其他都通过环境变量控制。
|
|
31
|
+
|
|
32
|
+
```javascript
|
|
33
|
+
// rspack.config.js
|
|
34
|
+
const path = require('path');
|
|
35
|
+
const { createFullstackRspackConfig } = require('@lark-apaas/fullstack-rspack-preset');
|
|
36
|
+
|
|
37
|
+
module.exports = createFullstackRspackConfig({
|
|
38
|
+
entry: {
|
|
39
|
+
main: './client/src/index.tsx',
|
|
40
|
+
},
|
|
41
|
+
resolve: {
|
|
42
|
+
alias: {
|
|
43
|
+
'@': path.resolve(__dirname, 'client/src'),
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 2. 环境变量配置
|
|
50
|
+
|
|
51
|
+
在项目根目录创建 `.env` 文件:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# 环境模式
|
|
55
|
+
NODE_ENV=development
|
|
56
|
+
|
|
57
|
+
# 功能开关
|
|
58
|
+
ENABLE_REACT_REFRESH=true
|
|
59
|
+
ENABLE_INSPECTOR=false
|
|
60
|
+
NEED_ROUTES=true
|
|
61
|
+
|
|
62
|
+
# 路径配置
|
|
63
|
+
CLIENT_BASE_PATH=/
|
|
64
|
+
ASSETS_CDN_PATH=https://cdn.example.com
|
|
65
|
+
|
|
66
|
+
# 端口配置
|
|
67
|
+
SERVER_PORT=3000
|
|
68
|
+
CLIENT_DEV_PORT=8080
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 3. 运行
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# 开发模式
|
|
75
|
+
npx rspack serve --config rspack.config.js --env mode=development
|
|
76
|
+
|
|
77
|
+
# 生产构建
|
|
78
|
+
NODE_ENV=production npx rspack build --config rspack.config.js
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## API 文档
|
|
82
|
+
|
|
83
|
+
### createFullstackRspackConfig (简化版)
|
|
84
|
+
|
|
85
|
+
自动从环境变量读取配置,用户只需提供覆盖配置。
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
function createFullstackRspackConfig(
|
|
89
|
+
overrides?: Partial<Configuration>
|
|
90
|
+
): Configuration;
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**参数:**
|
|
94
|
+
- `overrides` - Rspack 配置对象,会与默认配置深度合并
|
|
95
|
+
|
|
96
|
+
**环境变量:**
|
|
97
|
+
|
|
98
|
+
| 环境变量 | 类型 | 默认值 | 说明 |
|
|
99
|
+
|---------|------|--------|------|
|
|
100
|
+
| `NODE_ENV` | `development \| production` | `development` | 环境模式 |
|
|
101
|
+
| `ENABLE_REACT_REFRESH` | `boolean` | `false` | 是否启用 React Refresh |
|
|
102
|
+
| `ENABLE_INSPECTOR` | `boolean` | `false` | 是否启用 Miaoda Inspector |
|
|
103
|
+
| `NEED_ROUTES` | `boolean` | `true` | 是否需要路由解析 |
|
|
104
|
+
| `CLIENT_BASE_PATH` | `string` | `/` | 客户端基础路径 |
|
|
105
|
+
| `ASSETS_CDN_PATH` | `string` | `/` | 生产环境 CDN 路径 |
|
|
106
|
+
| `SERVER_PORT` | `number` | `3000` | 服务器端口 |
|
|
107
|
+
| `CLIENT_DEV_PORT` | `number` | `8080` | 客户端开发端口 |
|
|
108
|
+
|
|
109
|
+
### createRecommendRspackConfig (传统版)
|
|
110
|
+
|
|
111
|
+
提供更细粒度的控制,需要手动处理环境变量。
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
function createRecommendRspackConfig(
|
|
115
|
+
options: CreateRecommendRspackConfigOptions
|
|
116
|
+
): Configuration;
|
|
117
|
+
|
|
118
|
+
interface CreateRecommendRspackConfigOptions {
|
|
119
|
+
isDev?: boolean;
|
|
120
|
+
enableReactRefresh?: boolean;
|
|
121
|
+
needRoutes?: boolean;
|
|
122
|
+
clientBasePath?: string;
|
|
123
|
+
publicPath?: string;
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**示例:**
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
const { createRecommendRspackConfig } = require('@lark-apaas/fullstack-rspack-preset');
|
|
131
|
+
const { normalizeBasePath } = require('@lark-apaas/devtool-kits');
|
|
132
|
+
|
|
133
|
+
require('dotenv').config();
|
|
134
|
+
|
|
135
|
+
const isDev = process.env.NODE_ENV !== 'production';
|
|
136
|
+
|
|
137
|
+
module.exports = createRecommendRspackConfig({
|
|
138
|
+
isDev,
|
|
139
|
+
enableReactRefresh: true,
|
|
140
|
+
clientBasePath: normalizeBasePath(process.env.CLIENT_BASE_PATH || '/'),
|
|
141
|
+
publicPath: isDev ? '/' : 'https://cdn.example.com',
|
|
142
|
+
});
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 内置插件和功能
|
|
146
|
+
|
|
147
|
+
### 1. RouteParserPlugin
|
|
148
|
+
|
|
149
|
+
自动解析 React Router 路由,生成 `routes.json` 文件。
|
|
150
|
+
|
|
151
|
+
- **输入**:`./client/src/app.tsx`
|
|
152
|
+
- **输出**:`dist/client/routes.json`
|
|
153
|
+
- **控制**:`NEED_ROUTES` 环境变量
|
|
154
|
+
|
|
155
|
+
### 2. SlardarPerformanceMonitorPlugin
|
|
156
|
+
|
|
157
|
+
注入 Slardar 性能监控脚本到 HTML。
|
|
158
|
+
|
|
159
|
+
- **位置**:`<head>` 标签末尾
|
|
160
|
+
- **包含**:Slardar SDK + Performance 监控
|
|
161
|
+
|
|
162
|
+
### 3. Module Alias
|
|
163
|
+
|
|
164
|
+
#### clsx 别名
|
|
165
|
+
将 `clsx` 替换为增强版本,自动集成 `tailwind-merge`:
|
|
166
|
+
|
|
167
|
+
```javascript
|
|
168
|
+
import { clsx } from 'clsx'; // 自动包含 twMerge 功能
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
#### echarts 别名
|
|
172
|
+
优化 echarts 导入路径。
|
|
173
|
+
|
|
174
|
+
### 4. HMR Timing Monitor
|
|
175
|
+
|
|
176
|
+
开发模式下自动监控热更新时间,通过 WebSocket 推送给客户端。
|
|
177
|
+
|
|
178
|
+
### 5. 代理配置
|
|
179
|
+
|
|
180
|
+
自动配置开发服务器代理:
|
|
181
|
+
- API 代理:`${CLIENT_BASE_PATH}/api` → `http://localhost:${SERVER_PORT}`
|
|
182
|
+
- HTML 代理:所有 HTML 请求 → `http://localhost:${SERVER_PORT}`
|
|
183
|
+
|
|
184
|
+
## 项目结构要求
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
your-project/
|
|
188
|
+
├── .env # 环境变量配置
|
|
189
|
+
├── rspack.config.js # Rspack 配置
|
|
190
|
+
├── client/
|
|
191
|
+
│ ├── public/ # 静态资源
|
|
192
|
+
│ └── src/
|
|
193
|
+
│ ├── app.tsx # 路由定义(需包含 React Router)
|
|
194
|
+
│ └── index.tsx # 入口文件
|
|
195
|
+
├── server/ # 服务端代码
|
|
196
|
+
└── dist/
|
|
197
|
+
└── client/ # 构建产物
|
|
198
|
+
├── routes.json # 路由文件(自动生成)
|
|
199
|
+
└── ...
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## 迁移指南
|
|
203
|
+
|
|
204
|
+
### 从旧 API 迁移到新 API
|
|
205
|
+
|
|
206
|
+
**之前(15 行):**
|
|
207
|
+
|
|
208
|
+
```javascript
|
|
209
|
+
const { defineConfig } = require('@rspack/cli');
|
|
210
|
+
const { createRecommendRspackConfig } = require('@lark-apaas/fullstack-rspack-preset');
|
|
211
|
+
const { normalizeBasePath } = require('@lark-apaas/devtool-kits');
|
|
212
|
+
const { default: merge } = require('webpack-merge');
|
|
213
|
+
|
|
214
|
+
require('dotenv').config();
|
|
215
|
+
|
|
216
|
+
module.exports = defineConfig(({mode}) => {
|
|
217
|
+
const isDev = mode !== 'production';
|
|
218
|
+
const basePathWithoutTrailingSlash = normalizeBasePath(process.env.CLIENT_BASE_PATH || '/');
|
|
219
|
+
const publicPath = isDev ? '/' : process.env.ASSETS_CDN_PATH;
|
|
220
|
+
|
|
221
|
+
const baseConfig = createRecommendRspackConfig({
|
|
222
|
+
isDev,
|
|
223
|
+
clientBasePath: basePathWithoutTrailingSlash,
|
|
224
|
+
publicPath: publicPath,
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
return merge(baseConfig, {
|
|
228
|
+
entry: { main: './client/src/index.tsx' },
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**现在(8 行):**
|
|
234
|
+
|
|
235
|
+
```javascript
|
|
236
|
+
const path = require('path');
|
|
237
|
+
const { createFullstackRspackConfig } = require('@lark-apaas/fullstack-rspack-preset');
|
|
238
|
+
|
|
239
|
+
module.exports = createFullstackRspackConfig({
|
|
240
|
+
entry: {
|
|
241
|
+
main: './client/src/index.tsx',
|
|
242
|
+
},
|
|
243
|
+
resolve: {
|
|
244
|
+
alias: {
|
|
245
|
+
'@': path.resolve(__dirname, 'client/src'),
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**迁移步骤:**
|
|
252
|
+
|
|
253
|
+
1. 修改导入:`createRecommendRspackConfig` → `createFullstackRspackConfig`
|
|
254
|
+
2. 删除手动环境变量处理代码
|
|
255
|
+
3. 删除 `defineConfig`、`normalizeBasePath`、`merge` 等导入
|
|
256
|
+
4. 只保留覆盖配置(entry、resolve 等)
|
|
257
|
+
5. 确保 `.env` 文件包含必要的环境变量
|
|
258
|
+
|
|
259
|
+
## 常见问题
|
|
260
|
+
|
|
261
|
+
### Q: 如何禁用某个功能?
|
|
262
|
+
|
|
263
|
+
通过环境变量控制:
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
# 禁用路由解析
|
|
267
|
+
NEED_ROUTES=false
|
|
268
|
+
|
|
269
|
+
# 禁用 React Refresh
|
|
270
|
+
ENABLE_REACT_REFRESH=false
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Q: 如何自定义 DefinePlugin 变量?
|
|
274
|
+
|
|
275
|
+
直接在 `overrides` 中添加:
|
|
276
|
+
|
|
277
|
+
```javascript
|
|
278
|
+
module.exports = createFullstackRspackConfig({
|
|
279
|
+
plugins: [
|
|
280
|
+
new rspack.DefinePlugin({
|
|
281
|
+
'process.env.CUSTOM_VAR': JSON.stringify('custom-value'),
|
|
282
|
+
}),
|
|
283
|
+
],
|
|
284
|
+
});
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Q: 如何使用生产环境 CDN?
|
|
288
|
+
|
|
289
|
+
设置环境变量:
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
NODE_ENV=production
|
|
293
|
+
ASSETS_CDN_PATH=https://cdn.example.com
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Q: 为什么 DefinePlugin 没有生效?
|
|
297
|
+
|
|
298
|
+
检查:
|
|
299
|
+
1. `.env` 文件是否存在
|
|
300
|
+
2. 环境变量名是否正确
|
|
301
|
+
3. `process.env.runtimeMode` 缺少 `JSON.stringify`(已知问题,待修复)
|
|
302
|
+
|
|
303
|
+
## 版本历史
|
|
304
|
+
|
|
305
|
+
### 0.1.2-alpha.2
|
|
306
|
+
- ✨ 新增 `createFullstackRspackConfig` 简化 API
|
|
307
|
+
- ✨ 自动加载 `.env` 环境变量
|
|
308
|
+
- ✨ 支持环境变量驱动配置
|
|
309
|
+
- 🐛 修复 `@rspack/core` 版本冲突
|
|
310
|
+
- 🐛 修复 Slardar 插件在 npm link 环境下的问题
|
|
311
|
+
- 📝 完善文档和示例
|
|
312
|
+
|
|
313
|
+
### 0.1.0
|
|
314
|
+
- 🎉 初始版本
|
|
315
|
+
|
|
316
|
+
## License
|
|
317
|
+
|
|
318
|
+
MIT
|
package/lib/index.js
CHANGED
|
@@ -32,10 +32,14 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
35
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
39
|
exports.createFullstackRspackConfig = createFullstackRspackConfig;
|
|
37
40
|
const webpack_merge_1 = require("webpack-merge");
|
|
38
41
|
const devtool_kits_1 = require("@lark-apaas/devtool-kits");
|
|
42
|
+
const path_1 = __importDefault(require("path"));
|
|
39
43
|
const preset_1 = require("./preset");
|
|
40
44
|
/**
|
|
41
45
|
* 创建 Fullstack Rspack 配置(简化版)
|
|
@@ -74,7 +78,9 @@ const preset_1 = require("./preset");
|
|
|
74
78
|
function createFullstackRspackConfig(overrides = {}) {
|
|
75
79
|
// 1. 自动加载 .env 文件
|
|
76
80
|
try {
|
|
77
|
-
Promise.resolve().then(() => __importStar(require('dotenv'))).then((dotenv) => dotenv.config(
|
|
81
|
+
Promise.resolve().then(() => __importStar(require('dotenv'))).then((dotenv) => dotenv.config({
|
|
82
|
+
path: path_1.default.resolve(process.cwd(), '.env'),
|
|
83
|
+
}));
|
|
78
84
|
}
|
|
79
85
|
catch (e) {
|
|
80
86
|
// dotenv 是可选依赖,如果没有安装也不影响使用
|