@fchc8/vite-plugin-multi-page 1.0.5 → 1.1.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.
package/README.md CHANGED
@@ -13,6 +13,8 @@
13
13
  - 🔧 **完整 Vite 集成**:继承所有 Vite 配置选项
14
14
  - 🌍 **环境变量支持**:页面级和策略级环境变量定义
15
15
  - 🎨 **开发友好**:详细的调试日志和热重载支持
16
+ - ⚡ **开发构建一致性**:确保开发模式与构建模式使用相同的配置逻辑
17
+ - 🔄 **配置同步**:环境变量、模板选择、构建策略在开发和生产环境保持一致
16
18
 
17
19
  ## 📦 安装
18
20
 
@@ -419,3 +421,98 @@ MIT License
419
421
  - [Prettier](https://prettier.io/)
420
422
  - [Git Flow](https://nvie.com/posts/a-successful-git-branching-model/)
421
423
  - [语义化版本](https://semver.org/lang/zh-CN/)
424
+
425
+ ## ⚡ 开发与构建一致性
426
+
427
+ ### 配置同步机制
428
+
429
+ 本插件确保开发模式与构建模式使用**完全相同的配置逻辑**,避免开发环境和生产环境的差异问题。
430
+
431
+ #### 1. 页面配置一致性
432
+
433
+ ```typescript
434
+ // 开发和构建都使用相同的页面配置逻辑
435
+ pageConfigs: context => {
436
+ const { pageName, relativePath } = context;
437
+
438
+ // 移动端页面 - 开发和构建都使用 mobile.html 模板
439
+ if (relativePath.includes('/mobile/')) {
440
+ return {
441
+ template: 'mobile.html',
442
+ define: {
443
+ 'process.env.API_BASE': '"https://mobile-api.com"',
444
+ },
445
+ };
446
+ }
447
+
448
+ return { template: 'index.html' };
449
+ };
450
+ ```
451
+
452
+ #### 2. 环境变量同步
453
+
454
+ **构建时**:注入到 Vite 配置
455
+
456
+ ```typescript
457
+ // 环境变量会被 Vite 编译时替换
458
+ config.define = { 'process.env.API_BASE': '"https://api.com"' };
459
+ ```
460
+
461
+ **开发时**:动态注入到 HTML
462
+
463
+ ```html
464
+ <!-- 开发服务器自动注入到页面 -->
465
+ <script>
466
+ // 页面级环境变量
467
+ window['process.env.API_BASE'] = 'https://api.com';
468
+ </script>
469
+ ```
470
+
471
+ #### 3. 模板选择一致性
472
+
473
+ ```typescript
474
+ // 开发模式
475
+ if (pageConfig?.template) {
476
+ const templatePath = path.resolve(pageConfig.template);
477
+ // 使用指定模板
478
+ }
479
+
480
+ // 构建模式
481
+ const templateFile = pageConfig?.template || options.template;
482
+ // 使用相同的模板选择逻辑
483
+ ```
484
+
485
+ #### 4. 构建策略应用
486
+
487
+ ```typescript
488
+ // 开发模式:应用策略到开发配置
489
+ if (strategy.viteConfig) {
490
+ config.css = { ...config.css, ...strategy.viteConfig.css };
491
+ config.define = { ...config.define, ...strategy.define };
492
+ }
493
+
494
+ // 构建模式:应用策略到构建配置
495
+ if (strategy.viteConfig) {
496
+ applyBuildStrategy(config, strategy);
497
+ }
498
+ ```
499
+
500
+ ### 验证一致性
501
+
502
+ 运行示例项目验证配置一致性:
503
+
504
+ ```bash
505
+ # 开发模式
506
+ cd example
507
+ npm run dev
508
+ # 访问 http://localhost:5173/mobile.html
509
+
510
+ # 构建模式
511
+ npm run build
512
+ npm run preview
513
+ # 访问 http://localhost:4173/mobile.html
514
+
515
+ # 对比两种模式下的页面表现应该完全一致
516
+ ```
517
+
518
+ ## 🌟 使用场景
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ // @ts-nocheck
1
2
  "use strict";
2
3
  var __create = Object.create;
3
4
  var __defProp = Object.defineProperty;
@@ -30,12 +31,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
31
  // src/index.ts
31
32
  var src_exports = {};
32
33
  __export(src_exports, {
33
- default: () => viteMultiPage,
34
+ default: () => src_default,
34
35
  viteMultiPage: () => viteMultiPage
35
36
  });
36
37
  module.exports = __toCommonJS(src_exports);
37
38
  var path4 = __toESM(require("path"));
38
39
  var fs3 = __toESM(require("fs"));
40
+ var import_glob3 = require("glob");
39
41
 
40
42
  // src/utils.ts
41
43
  function escapeRegExp(string) {
@@ -112,16 +114,95 @@ function filterEntryFiles(files, entry, exclude, log) {
112
114
  }
113
115
 
114
116
  // src/dev-server.ts
117
+ function simpleMatch(pattern, text) {
118
+ const regexPattern = pattern.replace(/\*\*/g, "__DOUBLE_STAR__").replace(/\*/g, "[^/]*").replace(/__DOUBLE_STAR__/g, ".*");
119
+ const regex = new RegExp(`^${regexPattern}$`);
120
+ return regex.test(text);
121
+ }
122
+ function getPageConfig(pageConfigs, context, log) {
123
+ if (!pageConfigs)
124
+ return null;
125
+ if (typeof pageConfigs === "function") {
126
+ const result = pageConfigs(context);
127
+ if (result) {
128
+ log(`\u51FD\u6570\u914D\u7F6E\u5339\u914D\u9875\u9762 ${context.pageName}:`, result);
129
+ }
130
+ return result;
131
+ }
132
+ for (const [key, config] of Object.entries(pageConfigs)) {
133
+ if (key === context.pageName) {
134
+ log(`\u7CBE\u786E\u5339\u914D\u9875\u9762 ${context.pageName}:`, config);
135
+ return config;
136
+ }
137
+ if (config.match) {
138
+ const patterns = Array.isArray(config.match) ? config.match : [config.match];
139
+ const isMatched = patterns.some(
140
+ (pattern) => simpleMatch(pattern, context.pageName) || simpleMatch(pattern, context.relativePath) || simpleMatch(pattern, context.filePath)
141
+ );
142
+ if (isMatched) {
143
+ log(`\u6A21\u5F0F\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${config.match}):`, config);
144
+ return { ...config, match: void 0 };
145
+ }
146
+ }
147
+ if (simpleMatch(key, context.pageName)) {
148
+ log(`Glob\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${key}):`, config);
149
+ return config;
150
+ }
151
+ }
152
+ return null;
153
+ }
154
+ function applyDevStrategy(server, strategy, log) {
155
+ if (!strategy)
156
+ return;
157
+ log("\u5F00\u53D1\u6A21\u5F0F\u5E94\u7528\u6784\u5EFA\u7B56\u7565:", strategy);
158
+ if (strategy.define) {
159
+ log("\u5F00\u53D1\u73AF\u5883\u53D8\u91CF\u914D\u7F6E:", strategy.define);
160
+ }
161
+ if (strategy.alias) {
162
+ log("\u5F00\u53D1\u522B\u540D\u914D\u7F6E:", strategy.alias);
163
+ }
164
+ if (strategy.server) {
165
+ log("\u670D\u52A1\u5668\u914D\u7F6E:", strategy.server);
166
+ }
167
+ if (strategy.css) {
168
+ log("CSS\u914D\u7F6E:", strategy.css);
169
+ }
170
+ if (strategy.optimizeDeps) {
171
+ log("\u4F9D\u8D56\u4F18\u5316\u914D\u7F6E:", strategy.optimizeDeps);
172
+ }
173
+ }
115
174
  function configureDevServer(server, options, log) {
116
175
  const allFiles = import_glob.glob.sync(options.entry, { cwd: process.cwd() });
117
176
  const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);
118
177
  const pageMap = /* @__PURE__ */ new Map();
119
178
  entryFiles.forEach(({ name, file }) => {
120
- pageMap.set(name, file);
179
+ const pageConfig = getPageConfig(
180
+ options.pageConfigs,
181
+ {
182
+ pageName: name,
183
+ filePath: file,
184
+ relativePath: path2.relative(process.cwd(), file),
185
+ strategy: void 0,
186
+ isMatched: false
187
+ },
188
+ log
189
+ );
190
+ const strategy = (pageConfig == null ? void 0 : pageConfig.strategy) || "default";
191
+ pageMap.set(name, {
192
+ file,
193
+ config: pageConfig,
194
+ strategy
195
+ });
196
+ if (options.buildStrategies && (pageConfig == null ? void 0 : pageConfig.strategy)) {
197
+ const buildStrategy = options.buildStrategies[pageConfig.strategy];
198
+ if (buildStrategy) {
199
+ applyDevStrategy(server, buildStrategy, log);
200
+ }
201
+ }
121
202
  });
122
203
  const pageNames = Array.from(pageMap.keys());
123
204
  log("Available pages:", pageNames);
124
- log("Page mapping:", Object.fromEntries(pageMap));
205
+ log("Page mapping with configs:", Object.fromEntries(pageMap));
125
206
  server.middlewares.use((req, res, next) => {
126
207
  var _a;
127
208
  const originalUrl = req.url;
@@ -142,12 +223,20 @@ function configureDevServer(server, options, log) {
142
223
  log(`\u5339\u914D\u5230\u9875\u9762: ${pageName}`);
143
224
  log(`\u53EF\u7528\u9875\u9762\u5217\u8868: ${pageNames.join(", ")}`);
144
225
  if (pageMap.has(pageName)) {
145
- const relativeEntryPath = pageMap.get(pageName);
226
+ const pageInfo = pageMap.get(pageName);
227
+ if (!pageInfo) {
228
+ log(`\u9875\u9762\u4FE1\u606F\u83B7\u53D6\u5931\u8D25: ${pageName}`);
229
+ return next();
230
+ }
231
+ const relativeEntryPath = pageInfo.file;
232
+ const pageConfig = pageInfo.config;
146
233
  const entryPath = path2.resolve(process.cwd(), relativeEntryPath);
147
234
  log(`\u9875\u9762 ${pageName} \u5BF9\u5E94\u6587\u4EF6: ${relativeEntryPath}`);
235
+ log(`\u9875\u9762\u914D\u7F6E:`, pageConfig);
148
236
  if (fs.existsSync(entryPath)) {
149
237
  log(`\u627E\u5230\u5165\u53E3\u6587\u4EF6: ${entryPath}`);
150
- const templatePath = path2.resolve(process.cwd(), options.template);
238
+ const templateFile = (pageConfig == null ? void 0 : pageConfig.template) || options.template;
239
+ const templatePath = path2.resolve(process.cwd(), templateFile);
151
240
  if (fs.existsSync(templatePath)) {
152
241
  let html = fs.readFileSync(templatePath, "utf-8");
153
242
  log(`\u8BFB\u53D6\u6A21\u677F\u6587\u4EF6: ${templatePath}`);
@@ -160,8 +249,20 @@ function configureDevServer(server, options, log) {
160
249
  }
161
250
  const entryFile = `/${relativeEntryPath}`;
162
251
  html = html.replace(new RegExp(escapeRegExp(options.placeholder), "g"), entryFile);
252
+ if (pageConfig == null ? void 0 : pageConfig.define) {
253
+ const defineScript = Object.entries(pageConfig.define).map(([key, value]) => `window.${key} = ${JSON.stringify(value)};`).join("\n");
254
+ if (defineScript) {
255
+ const scriptTag = `<script>
256
+ // \u9875\u9762\u7EA7\u73AF\u5883\u53D8\u91CF
257
+ ${defineScript}
258
+ </script>`;
259
+ html = html.replace("</head>", `${scriptTag}
260
+ </head>`);
261
+ log(`\u6CE8\u5165\u9875\u9762\u73AF\u5883\u53D8\u91CF:`, pageConfig.define);
262
+ }
263
+ }
163
264
  log(`\u5360\u4F4D\u7B26 ${options.placeholder} \u66FF\u6362\u4E3A: ${entryFile}`);
164
- log(`\u66FF\u6362\u540E\u5305\u542B\u5360\u4F4D\u7B26: ${html.includes(options.placeholder)}`);
265
+ log(`\u4F7F\u7528\u6A21\u677F: ${templateFile}`);
165
266
  res.setHeader("Content-Type", "text/html");
166
267
  res.end(html);
167
268
  return;
@@ -183,7 +284,7 @@ function configureDevServer(server, options, log) {
183
284
  var path3 = __toESM(require("path"));
184
285
  var fs2 = __toESM(require("fs"));
185
286
  var import_glob2 = require("glob");
186
- function simpleMatch(pattern, str) {
287
+ function simpleMatch2(pattern, str) {
187
288
  const regexPattern = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*").replace(/\?/g, ".");
188
289
  const regex = new RegExp(`^${regexPattern}$`);
189
290
  return regex.test(str);
@@ -213,7 +314,7 @@ function createBuildConfig(config, options, log, tempFiles, pageMapping) {
213
314
  const defaultStrategy = "default";
214
315
  entryFiles.forEach((entryFile) => {
215
316
  const { name, file } = entryFile;
216
- const pageConfig = getPageConfig(
317
+ const pageConfig = getPageConfig2(
217
318
  options.pageConfigs,
218
319
  {
219
320
  pageName: name,
@@ -266,7 +367,7 @@ function createBuildConfig(config, options, log, tempFiles, pageMapping) {
266
367
  };
267
368
  }
268
369
  }
269
- function getPageConfig(pageConfigs, context, log) {
370
+ function getPageConfig2(pageConfigs, context, log) {
270
371
  if (!pageConfigs)
271
372
  return null;
272
373
  if (typeof pageConfigs === "function") {
@@ -284,14 +385,14 @@ function getPageConfig(pageConfigs, context, log) {
284
385
  if (config.match) {
285
386
  const patterns = Array.isArray(config.match) ? config.match : [config.match];
286
387
  const isMatched = patterns.some(
287
- (pattern) => simpleMatch(pattern, context.pageName) || simpleMatch(pattern, context.relativePath) || simpleMatch(pattern, context.filePath)
388
+ (pattern) => simpleMatch2(pattern, context.pageName) || simpleMatch2(pattern, context.relativePath) || simpleMatch2(pattern, context.filePath)
288
389
  );
289
390
  if (isMatched) {
290
391
  log(`\u6A21\u5F0F\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${config.match}):`, config);
291
392
  return { ...config, match: void 0 };
292
393
  }
293
394
  }
294
- if (simpleMatch(key, context.pageName)) {
395
+ if (simpleMatch2(key, context.pageName)) {
295
396
  log(`Glob\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${key}):`, config);
296
397
  return config;
297
398
  }
@@ -404,10 +505,77 @@ function viteMultiPage(options = {}) {
404
505
  );
405
506
  } else {
406
507
  createDevConfig({ entry, exclude }, log);
508
+ if (buildStrategies || pageConfigs) {
509
+ const allFiles = import_glob3.glob.sync(entry, { cwd: process.cwd() });
510
+ const entryFiles = filterEntryFiles(allFiles, entry, exclude, log);
511
+ const strategiesToApply = /* @__PURE__ */ new Set();
512
+ entryFiles.forEach(({ name, file }) => {
513
+ if (typeof pageConfigs === "function") {
514
+ const pageConfig = pageConfigs({
515
+ pageName: name,
516
+ filePath: file,
517
+ relativePath: path4.relative(process.cwd(), file),
518
+ strategy: void 0,
519
+ isMatched: false
520
+ });
521
+ if (pageConfig == null ? void 0 : pageConfig.strategy) {
522
+ strategiesToApply.add(pageConfig.strategy);
523
+ }
524
+ } else if (pageConfigs) {
525
+ const pageConfig = pageConfigs[name];
526
+ if (pageConfig == null ? void 0 : pageConfig.strategy) {
527
+ strategiesToApply.add(pageConfig.strategy);
528
+ }
529
+ }
530
+ });
531
+ strategiesToApply.forEach((strategyName) => {
532
+ const strategy = buildStrategies == null ? void 0 : buildStrategies[strategyName];
533
+ if (strategy) {
534
+ log(`\u5F00\u53D1\u6A21\u5F0F\u5E94\u7528\u7B56\u7565 ${strategyName}:`, strategy);
535
+ if (strategy.viteConfig) {
536
+ const { build, ...otherViteConfig } = strategy.viteConfig;
537
+ Object.keys(otherViteConfig).forEach((key) => {
538
+ if (key !== "plugins") {
539
+ const configKey = key;
540
+ const viteConfigValue = otherViteConfig[key];
541
+ if (viteConfigValue && typeof viteConfigValue === "object") {
542
+ config[configKey] = {
543
+ ...config[configKey] || {},
544
+ ...viteConfigValue
545
+ };
546
+ } else {
547
+ config[configKey] = viteConfigValue;
548
+ }
549
+ }
550
+ });
551
+ }
552
+ if (strategy.define) {
553
+ config.define = { ...config.define, ...strategy.define };
554
+ }
555
+ if (strategy.alias) {
556
+ config.resolve = config.resolve || {};
557
+ config.resolve.alias = { ...config.resolve.alias, ...strategy.alias };
558
+ }
559
+ if (strategy.server) {
560
+ config.server = { ...config.server, ...strategy.server };
561
+ }
562
+ if (strategy.css) {
563
+ config.css = { ...config.css, ...strategy.css };
564
+ }
565
+ if (strategy.optimizeDeps) {
566
+ config.optimizeDeps = { ...config.optimizeDeps, ...strategy.optimizeDeps };
567
+ }
568
+ }
569
+ });
570
+ }
407
571
  }
408
572
  },
409
573
  configureServer(server) {
410
- configureDevServer(server, { entry, exclude, template, placeholder }, log);
574
+ configureDevServer(
575
+ server,
576
+ { entry, exclude, template, placeholder, buildStrategies, pageConfigs },
577
+ log
578
+ );
411
579
  },
412
580
  generateBundle() {
413
581
  },
@@ -434,6 +602,7 @@ function viteMultiPage(options = {}) {
434
602
  }
435
603
  };
436
604
  }
605
+ var src_default = viteMultiPage;
437
606
  // Annotate the CommonJS export names for ESM import in node:
438
607
  0 && (module.exports = {
439
608
  viteMultiPage
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/dev-server.ts","../src/file-filter.ts","../src/build-config.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport type { MultiPageOptions } from './types';\nimport { createLogger } from './utils';\nimport { configureDevServer } from './dev-server';\nimport { createBuildConfig, createDevConfig } from './build-config';\n\nexport type { MultiPageOptions };\n\nexport default function viteMultiPage(options: MultiPageOptions = {}): Plugin {\n const {\n entry = 'src/**/*.{ts,js}',\n template = 'index.html',\n exclude = ['src/main.ts', 'src/vite-env.d.ts'],\n placeholder = '{{ENTRY_FILE}}',\n debug = false,\n buildStrategies,\n pageConfigs,\n } = options;\n\n const log = createLogger(debug);\n let tempFiles: string[] = [];\n const pageMapping: Map<string, string> = new Map();\n\n return {\n name: 'vite-plugin-multi-page',\n\n config(config: any, { command }: { command: string }) {\n if (command === 'build') {\n createBuildConfig(\n config,\n { entry, exclude, template, placeholder, buildStrategies, pageConfigs },\n log,\n tempFiles,\n pageMapping\n );\n } else {\n createDevConfig({ entry, exclude }, log);\n }\n },\n\n configureServer(server) {\n configureDevServer(server, { entry, exclude, template, placeholder }, log);\n },\n\n generateBundle() {\n // 用于处理JS/CSS资源,HTML在writeBundle中处理\n },\n\n writeBundle(options: any) {\n Array.from(pageMapping.entries()).forEach(([tempName, targetName]) => {\n const tempPath = path.resolve(options.dir || 'dist', tempName);\n const targetPath = path.resolve(options.dir || 'dist', targetName);\n\n if (fs.existsSync(tempPath)) {\n fs.renameSync(tempPath, targetPath);\n log(`重命名HTML文件: ${tempName} -> ${targetName}`);\n }\n });\n },\n\n closeBundle() {\n tempFiles.forEach(filePath => {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n const fileName = path.basename(filePath);\n log(`清理临时文件: ${fileName}`);\n }\n });\n tempFiles = [];\n pageMapping.clear();\n },\n };\n}\n\nexport { viteMultiPage };\n","export function escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function createLogger(debug: boolean) {\n return (...args: any[]) => {\n if (debug) {\n console.log('[vite-plugin-multi-page]', ...args);\n }\n };\n}\n","import type { ViteDevServer } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\n\nexport function configureDevServer(\n server: ViteDevServer,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const pageMap = new Map<string, string>();\n entryFiles.forEach(({ name, file }) => {\n pageMap.set(name, file);\n });\n\n const pageNames = Array.from(pageMap.keys());\n log('Available pages:', pageNames);\n log('Page mapping:', Object.fromEntries(pageMap));\n\n server.middlewares.use((req: any, res: any, next: any) => {\n const originalUrl = req.url;\n const url = originalUrl?.split('?')[0];\n\n if (!url) {\n return next();\n }\n\n log(`处理请求: ${url}`);\n\n if (url === '/' && pageNames.length > 0) {\n const defaultPage = pageNames.includes('index') ? 'index' : pageNames[0];\n log(`根路径重定向到: ${defaultPage}`);\n req.url = `/${defaultPage}.html`;\n }\n\n const finalUrl = req.url?.split('?')[0];\n // eslint-disable-next-line no-useless-escape\n const pageMatch = finalUrl?.match(/^\\/([^\\/\\.]+)(\\.html)?$/);\n\n if (pageMatch) {\n const pageName = pageMatch[1];\n\n log(`匹配到页面: ${pageName}`);\n log(`可用页面列表: ${pageNames.join(', ')}`);\n\n if (pageMap.has(pageName)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const relativeEntryPath = pageMap.get(pageName)!;\n const entryPath = path.resolve(process.cwd(), relativeEntryPath);\n\n log(`页面 ${pageName} 对应文件: ${relativeEntryPath}`);\n\n if (fs.existsSync(entryPath)) {\n log(`找到入口文件: ${entryPath}`);\n\n const templatePath = path.resolve(process.cwd(), options.template);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n\n log(`读取模板文件: ${templatePath}`);\n log(`模板内容包含占位符: ${html.includes(options.placeholder)}`);\n\n if (!html.includes(options.placeholder)) {\n console.warn(\n `[vite-plugin-multi-page] 模板文件中没有找到占位符: ${options.placeholder}`\n );\n return next();\n }\n\n const entryFile = `/${relativeEntryPath}`;\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), entryFile);\n\n log(`占位符 ${options.placeholder} 替换为: ${entryFile}`);\n log(`替换后包含占位符: ${html.includes(options.placeholder)}`);\n\n res.setHeader('Content-Type', 'text/html');\n res.end(html);\n return;\n } else {\n log(`模板文件不存在: ${templatePath}`);\n }\n } else {\n log(`入口文件不存在: ${entryPath}`);\n }\n } else {\n log(`页面 ${pageName} 不在可用列表中`);\n }\n }\n\n next();\n });\n}\n","import * as path from 'node:path';\nimport type { EntryFile, CandidateFile } from './types';\n\nexport function filterEntryFiles(\n files: string[],\n entry: string,\n exclude: string[],\n log: (...args: any[]) => void\n): EntryFile[] {\n const result: EntryFile[] = [];\n const nameToFile = new Map<string, string>();\n\n const basePattern = entry.replace(/\\/\\*\\*.*$/, '');\n log('基础目录模式:', basePattern);\n\n const candidateFiles: CandidateFile[] = [];\n\n for (const file of files) {\n if (exclude.includes(file)) {\n log(`跳过排除文件: ${file}`);\n continue;\n }\n\n const relativePath = path.relative(basePattern, file);\n const pathParts = relativePath.split(path.sep);\n\n log(`处理文件: ${file}`);\n log(`相对路径: ${relativePath}`);\n log(`路径部分: ${pathParts}`);\n\n if (pathParts.length === 1) {\n const fileName = pathParts[0];\n const name = path.basename(fileName, path.extname(fileName));\n candidateFiles.push({ name, file, priority: 1 });\n log(`📄 第一级文件: ${file} -> ${name}.html (优先级: 1)`);\n } else if (pathParts.length >= 2) {\n const fileName = path.basename(file, path.extname(file));\n const dirName = pathParts[0];\n\n if (fileName === 'main') {\n candidateFiles.push({ name: dirName, file, priority: 2 });\n log(`📁 目录main文件: ${file} -> ${dirName}.html (优先级: 2)`);\n } else {\n log(`❌ 跳过文件: ${file} (不是main文件)`);\n }\n } else {\n log(`❌ 跳过文件: ${file} (路径层级不符合)`);\n }\n }\n\n for (const candidate of candidateFiles) {\n const existing = nameToFile.get(candidate.name);\n\n if (!existing) {\n nameToFile.set(candidate.name, candidate.file);\n log(`✅ 添加页面: ${candidate.name} -> ${candidate.file}`);\n } else {\n const existingCandidate = candidateFiles.find(c => c.file === existing);\n if (existingCandidate && candidate.priority > existingCandidate.priority) {\n nameToFile.set(candidate.name, candidate.file);\n log(`🔄 替换页面: ${candidate.name} -> ${candidate.file} (替换 ${existing})`);\n } else {\n log(`⚠️ 冲突跳过: ${candidate.name} -> ${candidate.file} (保留 ${existing})`);\n }\n }\n }\n\n for (const [name, file] of nameToFile.entries()) {\n result.push({ name, file });\n }\n\n return result;\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\nimport type { BuildStrategy, PageConfig, PageConfigFunction, PageConfigContext } from './types';\n\n// 简单的 glob 模式匹配函数\nfunction simpleMatch(pattern: string, str: string): boolean {\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // 转义特殊字符\n .replace(/\\*/g, '.*') // * 匹配任意字符\n .replace(/\\?/g, '.'); // ? 匹配单个字符\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(str);\n}\n\nexport function createBuildConfig(\n config: any,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n buildStrategies?: Record<string, BuildStrategy>;\n pageConfigs?: Record<string, PageConfig> | PageConfigFunction;\n },\n log: (...args: any[]) => void,\n tempFiles: string[],\n pageMapping: Map<string, string>\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n if (entryFiles.length === 0) {\n console.warn('[vite-plugin-multi-page] No entry files found matching pattern:', options.entry);\n return;\n }\n\n log('扫描到的所有文件:', allFiles);\n log('过滤后的入口文件:', entryFiles);\n\n // 清理旧的临时文件\n const existingTempFiles = glob.sync('temp-*.html', { cwd: process.cwd() });\n existingTempFiles.forEach(file => {\n const fullPath = path.resolve(process.cwd(), file);\n if (fs.existsSync(fullPath)) {\n fs.unlinkSync(fullPath);\n log(`清理旧的临时文件: ${file}`);\n }\n });\n\n const input: Record<string, string> = {};\n tempFiles.length = 0; // 清空数组\n pageMapping.clear();\n\n // 分组页面按构建策略\n const strategyGroups: Record<string, typeof entryFiles> = {};\n const defaultStrategy = 'default';\n\n entryFiles.forEach(entryFile => {\n const { name, file } = entryFile;\n\n // 获取页面配置\n const pageConfig = getPageConfig(\n options.pageConfigs,\n {\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n },\n log\n );\n\n const strategy = pageConfig?.strategy || defaultStrategy;\n\n if (!strategyGroups[strategy]) {\n strategyGroups[strategy] = [];\n }\n strategyGroups[strategy].push(entryFile);\n\n // 创建HTML文件\n const templatePath = pageConfig?.template\n ? path.resolve(process.cwd(), pageConfig.template)\n : path.resolve(process.cwd(), options.template);\n\n const tempHtmlPath = path.resolve(process.cwd(), `temp-${name}.html`);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), `/${file}`);\n\n fs.writeFileSync(tempHtmlPath, html);\n tempFiles.push(tempHtmlPath);\n\n input[name] = tempHtmlPath;\n pageMapping.set(`temp-${name}.html`, `${name}.html`);\n\n log(`创建临时文件: temp-${name}.html -> ${name}.html (策略: ${strategy})`);\n }\n });\n\n log('Build input configuration:', input);\n log('Strategy groups:', Object.keys(strategyGroups));\n\n // 应用构建策略\n config.build = config.build || {};\n config.build.rollupOptions = config.build.rollupOptions || {};\n config.build.rollupOptions.input = input;\n\n // 应用默认或指定的构建策略\n const defaultStrategyConfig = options.buildStrategies?.[defaultStrategy];\n if (defaultStrategyConfig) {\n applyBuildStrategy(config, defaultStrategyConfig, log);\n }\n\n // 如果只有一个策略组且不是默认策略,应用该策略\n const strategyKeys = Object.keys(strategyGroups);\n if (strategyKeys.length === 1 && strategyKeys[0] !== defaultStrategy) {\n const singleStrategy = options.buildStrategies?.[strategyKeys[0]];\n if (singleStrategy) {\n applyBuildStrategy(config, singleStrategy, log);\n }\n }\n\n // 处理多策略情况(需要多次构建)\n if (\n strategyKeys.length > 1 ||\n (strategyKeys.length === 1 &&\n strategyKeys[0] !== defaultStrategy &&\n options.buildStrategies?.[strategyKeys[0]])\n ) {\n log('检测到多构建策略,将创建策略映射');\n // 在插件实例上存储策略信息,供后续处理\n (config as any).__multiPageStrategies = {\n groups: strategyGroups,\n strategies: options.buildStrategies,\n pageConfigs: options.pageConfigs,\n };\n }\n}\n\nfunction getPageConfig(\n pageConfigs: Record<string, PageConfig> | PageConfigFunction | undefined,\n context: PageConfigContext,\n log: (...args: any[]) => void\n): PageConfig | null {\n if (!pageConfigs) return null;\n\n // 如果是函数,直接调用\n if (typeof pageConfigs === 'function') {\n const result = pageConfigs(context);\n if (result) {\n log(`函数配置匹配页面 ${context.pageName}:`, result);\n }\n return result;\n }\n\n // 对象配置:支持精确匹配和模式匹配\n for (const [key, config] of Object.entries(pageConfigs)) {\n // 精确匹配页面名称\n if (key === context.pageName) {\n log(`精确匹配页面 ${context.pageName}:`, config);\n return config;\n }\n\n // 模式匹配\n if (config.match) {\n const patterns = Array.isArray(config.match) ? config.match : [config.match];\n const isMatched = patterns.some(\n pattern =>\n simpleMatch(pattern, context.pageName) ||\n simpleMatch(pattern, context.relativePath) ||\n simpleMatch(pattern, context.filePath)\n );\n\n if (isMatched) {\n log(`模式匹配页面 ${context.pageName} (模式: ${config.match}):`, config);\n return { ...config, match: undefined }; // 移除 match 属性避免传递给构建配置\n }\n }\n\n // glob 模式匹配页面名称\n if (simpleMatch(key, context.pageName)) {\n log(`Glob匹配页面 ${context.pageName} (模式: ${key}):`, config);\n return config;\n }\n }\n\n return null;\n}\n\nfunction applyBuildStrategy(config: any, strategy: BuildStrategy, log: (...args: any[]) => void) {\n log('应用构建策略:', strategy);\n\n // 应用完整的 Vite 配置\n if (strategy.viteConfig) {\n const { build: viteBuild, ...otherViteConfig } = strategy.viteConfig;\n\n // 合并非构建配置\n Object.keys(otherViteConfig).forEach(key => {\n if (key !== 'plugins') {\n // 跳过 plugins,避免冲突\n const configKey = key as keyof typeof config;\n const viteConfigValue = otherViteConfig[key as keyof typeof otherViteConfig];\n if (viteConfigValue && typeof viteConfigValue === 'object') {\n config[configKey] = {\n ...(config[configKey] || {}),\n ...viteConfigValue,\n };\n } else {\n config[configKey] = viteConfigValue;\n }\n }\n });\n\n // 合并构建配置\n if (viteBuild) {\n config.build = {\n ...config.build,\n ...viteBuild,\n };\n }\n }\n\n // 应用输出配置\n if (strategy.output) {\n config.build.rollupOptions.output = {\n ...config.build.rollupOptions.output,\n ...strategy.output,\n };\n }\n\n // 应用构建配置\n if (strategy.build) {\n config.build = {\n ...config.build,\n ...strategy.build,\n };\n }\n\n // 应用环境变量\n if (strategy.define) {\n config.define = {\n ...config.define,\n ...strategy.define,\n };\n }\n\n // 应用别名配置\n if (strategy.alias) {\n config.resolve = config.resolve || {};\n config.resolve.alias = {\n ...config.resolve.alias,\n ...strategy.alias,\n };\n }\n\n // 应用服务器配置\n if (strategy.server) {\n config.server = {\n ...config.server,\n ...strategy.server,\n };\n }\n\n // 应用 CSS 配置\n if (strategy.css) {\n config.css = {\n ...config.css,\n ...strategy.css,\n };\n }\n\n // 应用优化依赖配置\n if (strategy.optimizeDeps) {\n config.optimizeDeps = {\n ...config.optimizeDeps,\n ...strategy.optimizeDeps,\n };\n }\n}\n\nexport function createDevConfig(\n options: {\n entry: string;\n exclude: string[];\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const input: Record<string, string> = {};\n entryFiles.forEach(({ name, file }) => {\n input[name] = path.resolve(process.cwd(), file);\n });\n log('Dev input configuration:', input);\n}\n"],"mappings":"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","names":["path","fs","path","path","fs","import_glob","options"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/dev-server.ts","../src/file-filter.ts","../src/build-config.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport type { MultiPageOptions } from './types';\nimport { createLogger } from './utils';\nimport { configureDevServer } from './dev-server';\nimport { createBuildConfig, createDevConfig } from './build-config';\nimport { filterEntryFiles } from './file-filter';\n\nexport type { MultiPageOptions };\n\nfunction viteMultiPage(options: MultiPageOptions = {}): Plugin {\n const {\n entry = 'src/**/*.{ts,js}',\n template = 'index.html',\n exclude = ['src/main.ts', 'src/vite-env.d.ts'],\n placeholder = '{{ENTRY_FILE}}',\n debug = false,\n buildStrategies,\n pageConfigs,\n } = options;\n\n const log = createLogger(debug);\n let tempFiles: string[] = [];\n const pageMapping: Map<string, string> = new Map();\n\n return {\n name: 'vite-plugin-multi-page',\n\n config(config: any, { command }: { command: string }) {\n if (command === 'build') {\n createBuildConfig(\n config,\n { entry, exclude, template, placeholder, buildStrategies, pageConfigs },\n log,\n tempFiles,\n pageMapping\n );\n } else {\n createDevConfig({ entry, exclude }, log);\n\n if (buildStrategies || pageConfigs) {\n const allFiles = glob.sync(entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, entry, exclude, log);\n\n const strategiesToApply = new Set<string>();\n\n entryFiles.forEach(({ name, file }) => {\n if (typeof pageConfigs === 'function') {\n const pageConfig = pageConfigs({\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n });\n if (pageConfig?.strategy) {\n strategiesToApply.add(pageConfig.strategy);\n }\n } else if (pageConfigs) {\n const pageConfig = pageConfigs[name];\n if (pageConfig?.strategy) {\n strategiesToApply.add(pageConfig.strategy);\n }\n }\n });\n\n strategiesToApply.forEach(strategyName => {\n const strategy = buildStrategies?.[strategyName];\n if (strategy) {\n log(`开发模式应用策略 ${strategyName}:`, strategy);\n\n if (strategy.viteConfig) {\n // 解构时跳过 build 属性,因为开发模式不需要构建配置\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { build, ...otherViteConfig } = strategy.viteConfig;\n Object.keys(otherViteConfig).forEach(key => {\n if (key !== 'plugins') {\n const configKey = key as keyof typeof config;\n const viteConfigValue = otherViteConfig[key as keyof typeof otherViteConfig];\n if (viteConfigValue && typeof viteConfigValue === 'object') {\n config[configKey] = {\n ...(config[configKey] || {}),\n ...viteConfigValue,\n };\n } else {\n config[configKey] = viteConfigValue;\n }\n }\n });\n }\n\n if (strategy.define) {\n config.define = { ...config.define, ...strategy.define };\n }\n if (strategy.alias) {\n config.resolve = config.resolve || {};\n config.resolve.alias = { ...config.resolve.alias, ...strategy.alias };\n }\n if (strategy.server) {\n config.server = { ...config.server, ...strategy.server };\n }\n if (strategy.css) {\n config.css = { ...config.css, ...strategy.css };\n }\n if (strategy.optimizeDeps) {\n config.optimizeDeps = { ...config.optimizeDeps, ...strategy.optimizeDeps };\n }\n }\n });\n }\n }\n },\n\n configureServer(server) {\n configureDevServer(\n server,\n { entry, exclude, template, placeholder, buildStrategies, pageConfigs },\n log\n );\n },\n\n generateBundle() {\n // 用于处理JS/CSS资源,HTML在writeBundle中处理\n },\n\n writeBundle(options: any) {\n Array.from(pageMapping.entries()).forEach(([tempName, targetName]) => {\n const tempPath = path.resolve(options.dir || 'dist', tempName);\n const targetPath = path.resolve(options.dir || 'dist', targetName);\n\n if (fs.existsSync(tempPath)) {\n fs.renameSync(tempPath, targetPath);\n log(`重命名HTML文件: ${tempName} -> ${targetName}`);\n }\n });\n },\n\n closeBundle() {\n tempFiles.forEach(filePath => {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n const fileName = path.basename(filePath);\n log(`清理临时文件: ${fileName}`);\n }\n });\n tempFiles = [];\n pageMapping.clear();\n },\n };\n}\n\n// 默认导出\nexport default viteMultiPage;\n\n// 具名导出以支持 CommonJS 和 ESM\nexport { viteMultiPage };\n","export function escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function createLogger(debug: boolean) {\n return (...args: any[]) => {\n if (debug) {\n console.log('[vite-plugin-multi-page]', ...args);\n }\n };\n}\n","import type { ViteDevServer } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\nimport type { PageConfig, PageConfigFunction, PageConfigContext, BuildStrategy } from './types';\n\nfunction simpleMatch(pattern: string, text: string): boolean {\n const regexPattern = pattern\n .replace(/\\*\\*/g, '__DOUBLE_STAR__')\n .replace(/\\*/g, '[^/]*')\n .replace(/__DOUBLE_STAR__/g, '.*');\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(text);\n}\n\nfunction getPageConfig(\n pageConfigs: Record<string, PageConfig> | PageConfigFunction | undefined,\n context: PageConfigContext,\n log: (...args: any[]) => void\n): PageConfig | null {\n if (!pageConfigs) return null;\n\n // 如果是函数,直接调用\n if (typeof pageConfigs === 'function') {\n const result = pageConfigs(context);\n if (result) {\n log(`函数配置匹配页面 ${context.pageName}:`, result);\n }\n return result;\n }\n\n // 对象配置:支持精确匹配和模式匹配\n for (const [key, config] of Object.entries(pageConfigs)) {\n // 精确匹配页面名称\n if (key === context.pageName) {\n log(`精确匹配页面 ${context.pageName}:`, config);\n return config;\n }\n\n // 模式匹配\n if (config.match) {\n const patterns = Array.isArray(config.match) ? config.match : [config.match];\n const isMatched = patterns.some(\n pattern =>\n simpleMatch(pattern, context.pageName) ||\n simpleMatch(pattern, context.relativePath) ||\n simpleMatch(pattern, context.filePath)\n );\n\n if (isMatched) {\n log(`模式匹配页面 ${context.pageName} (模式: ${config.match}):`, config);\n return { ...config, match: undefined };\n }\n }\n\n // glob 模式匹配页面名称\n if (simpleMatch(key, context.pageName)) {\n log(`Glob匹配页面 ${context.pageName} (模式: ${key}):`, config);\n return config;\n }\n }\n\n return null;\n}\n\nfunction applyDevStrategy(\n server: ViteDevServer,\n strategy: BuildStrategy,\n log: (...args: any[]) => void\n) {\n if (!strategy) return;\n\n log('开发模式应用构建策略:', strategy);\n\n // 注意:开发服务器的配置在启动后是只读的\n // 这里主要记录配置信息,实际应用需要在插件的 config 钩子中处理\n\n if (strategy.define) {\n log('开发环境变量配置:', strategy.define);\n }\n\n if (strategy.alias) {\n log('开发别名配置:', strategy.alias);\n }\n\n if (strategy.server) {\n log('服务器配置:', strategy.server);\n }\n\n if (strategy.css) {\n log('CSS配置:', strategy.css);\n }\n\n if (strategy.optimizeDeps) {\n log('依赖优化配置:', strategy.optimizeDeps);\n }\n}\n\nexport function configureDevServer(\n server: ViteDevServer,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n buildStrategies?: Record<string, BuildStrategy>;\n pageConfigs?: Record<string, PageConfig> | PageConfigFunction;\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const pageMap = new Map<string, { file: string; config: PageConfig | null; strategy?: string }>();\n\n entryFiles.forEach(({ name, file }) => {\n // 获取页面配置\n const pageConfig = getPageConfig(\n options.pageConfigs,\n {\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n },\n log\n );\n\n const strategy = pageConfig?.strategy || 'default';\n\n pageMap.set(name, {\n file,\n config: pageConfig,\n strategy,\n });\n\n // 如果指定了构建策略,记录配置信息\n if (options.buildStrategies && pageConfig?.strategy) {\n const buildStrategy = options.buildStrategies[pageConfig.strategy];\n if (buildStrategy) {\n applyDevStrategy(server, buildStrategy, log);\n }\n }\n });\n\n const pageNames = Array.from(pageMap.keys());\n log('Available pages:', pageNames);\n log('Page mapping with configs:', Object.fromEntries(pageMap));\n\n server.middlewares.use((req: any, res: any, next: any) => {\n const originalUrl = req.url;\n const url = originalUrl?.split('?')[0];\n\n if (!url) {\n return next();\n }\n\n log(`处理请求: ${url}`);\n\n if (url === '/' && pageNames.length > 0) {\n const defaultPage = pageNames.includes('index') ? 'index' : pageNames[0];\n log(`根路径重定向到: ${defaultPage}`);\n req.url = `/${defaultPage}.html`;\n }\n\n const finalUrl = req.url?.split('?')[0];\n // eslint-disable-next-line no-useless-escape\n const pageMatch = finalUrl?.match(/^\\/([^\\/\\.]+)(\\.html)?$/);\n\n if (pageMatch) {\n const pageName = pageMatch[1];\n\n log(`匹配到页面: ${pageName}`);\n log(`可用页面列表: ${pageNames.join(', ')}`);\n\n if (pageMap.has(pageName)) {\n const pageInfo = pageMap.get(pageName);\n if (!pageInfo) {\n log(`页面信息获取失败: ${pageName}`);\n return next();\n }\n\n const relativeEntryPath = pageInfo.file;\n const pageConfig = pageInfo.config;\n const entryPath = path.resolve(process.cwd(), relativeEntryPath);\n\n log(`页面 ${pageName} 对应文件: ${relativeEntryPath}`);\n log(`页面配置:`, pageConfig);\n\n if (fs.existsSync(entryPath)) {\n log(`找到入口文件: ${entryPath}`);\n\n // 根据页面配置选择模板\n const templateFile = pageConfig?.template || options.template;\n const templatePath = path.resolve(process.cwd(), templateFile);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n\n log(`读取模板文件: ${templatePath}`);\n log(`模板内容包含占位符: ${html.includes(options.placeholder)}`);\n\n if (!html.includes(options.placeholder)) {\n console.warn(\n `[vite-plugin-multi-page] 模板文件中没有找到占位符: ${options.placeholder}`\n );\n return next();\n }\n\n const entryFile = `/${relativeEntryPath}`;\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), entryFile);\n\n // 应用页面级环境变量注入\n if (pageConfig?.define) {\n // 在HTML中注入环境变量\n const defineScript = Object.entries(pageConfig.define)\n .map(([key, value]) => `window.${key} = ${JSON.stringify(value)};`)\n .join('\\n');\n\n if (defineScript) {\n const scriptTag = `<script>\n // 页面级环境变量\n ${defineScript}\n </script>`;\n html = html.replace('</head>', `${scriptTag}\\n</head>`);\n log(`注入页面环境变量:`, pageConfig.define);\n }\n }\n\n log(`占位符 ${options.placeholder} 替换为: ${entryFile}`);\n log(`使用模板: ${templateFile}`);\n\n res.setHeader('Content-Type', 'text/html');\n res.end(html);\n return;\n } else {\n log(`模板文件不存在: ${templatePath}`);\n }\n } else {\n log(`入口文件不存在: ${entryPath}`);\n }\n } else {\n log(`页面 ${pageName} 不在可用列表中`);\n }\n }\n\n next();\n });\n}\n","import * as path from 'node:path';\nimport type { EntryFile, CandidateFile } from './types';\n\nexport function filterEntryFiles(\n files: string[],\n entry: string,\n exclude: string[],\n log: (...args: any[]) => void\n): EntryFile[] {\n const result: EntryFile[] = [];\n const nameToFile = new Map<string, string>();\n\n const basePattern = entry.replace(/\\/\\*\\*.*$/, '');\n log('基础目录模式:', basePattern);\n\n const candidateFiles: CandidateFile[] = [];\n\n for (const file of files) {\n if (exclude.includes(file)) {\n log(`跳过排除文件: ${file}`);\n continue;\n }\n\n const relativePath = path.relative(basePattern, file);\n const pathParts = relativePath.split(path.sep);\n\n log(`处理文件: ${file}`);\n log(`相对路径: ${relativePath}`);\n log(`路径部分: ${pathParts}`);\n\n if (pathParts.length === 1) {\n const fileName = pathParts[0];\n const name = path.basename(fileName, path.extname(fileName));\n candidateFiles.push({ name, file, priority: 1 });\n log(`📄 第一级文件: ${file} -> ${name}.html (优先级: 1)`);\n } else if (pathParts.length >= 2) {\n const fileName = path.basename(file, path.extname(file));\n const dirName = pathParts[0];\n\n if (fileName === 'main') {\n candidateFiles.push({ name: dirName, file, priority: 2 });\n log(`📁 目录main文件: ${file} -> ${dirName}.html (优先级: 2)`);\n } else {\n log(`❌ 跳过文件: ${file} (不是main文件)`);\n }\n } else {\n log(`❌ 跳过文件: ${file} (路径层级不符合)`);\n }\n }\n\n for (const candidate of candidateFiles) {\n const existing = nameToFile.get(candidate.name);\n\n if (!existing) {\n nameToFile.set(candidate.name, candidate.file);\n log(`✅ 添加页面: ${candidate.name} -> ${candidate.file}`);\n } else {\n const existingCandidate = candidateFiles.find(c => c.file === existing);\n if (existingCandidate && candidate.priority > existingCandidate.priority) {\n nameToFile.set(candidate.name, candidate.file);\n log(`🔄 替换页面: ${candidate.name} -> ${candidate.file} (替换 ${existing})`);\n } else {\n log(`⚠️ 冲突跳过: ${candidate.name} -> ${candidate.file} (保留 ${existing})`);\n }\n }\n }\n\n for (const [name, file] of nameToFile.entries()) {\n result.push({ name, file });\n }\n\n return result;\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\nimport type { BuildStrategy, PageConfig, PageConfigFunction, PageConfigContext } from './types';\n\n// 简单的 glob 模式匹配函数\nfunction simpleMatch(pattern: string, str: string): boolean {\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // 转义特殊字符\n .replace(/\\*/g, '.*') // * 匹配任意字符\n .replace(/\\?/g, '.'); // ? 匹配单个字符\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(str);\n}\n\nexport function createBuildConfig(\n config: any,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n buildStrategies?: Record<string, BuildStrategy>;\n pageConfigs?: Record<string, PageConfig> | PageConfigFunction;\n },\n log: (...args: any[]) => void,\n tempFiles: string[],\n pageMapping: Map<string, string>\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n if (entryFiles.length === 0) {\n console.warn('[vite-plugin-multi-page] No entry files found matching pattern:', options.entry);\n return;\n }\n\n log('扫描到的所有文件:', allFiles);\n log('过滤后的入口文件:', entryFiles);\n\n // 清理旧的临时文件\n const existingTempFiles = glob.sync('temp-*.html', { cwd: process.cwd() });\n existingTempFiles.forEach(file => {\n const fullPath = path.resolve(process.cwd(), file);\n if (fs.existsSync(fullPath)) {\n fs.unlinkSync(fullPath);\n log(`清理旧的临时文件: ${file}`);\n }\n });\n\n const input: Record<string, string> = {};\n tempFiles.length = 0; // 清空数组\n pageMapping.clear();\n\n // 分组页面按构建策略\n const strategyGroups: Record<string, typeof entryFiles> = {};\n const defaultStrategy = 'default';\n\n entryFiles.forEach(entryFile => {\n const { name, file } = entryFile;\n\n // 获取页面配置\n const pageConfig = getPageConfig(\n options.pageConfigs,\n {\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n },\n log\n );\n\n const strategy = pageConfig?.strategy || defaultStrategy;\n\n if (!strategyGroups[strategy]) {\n strategyGroups[strategy] = [];\n }\n strategyGroups[strategy].push(entryFile);\n\n // 创建HTML文件\n const templatePath = pageConfig?.template\n ? path.resolve(process.cwd(), pageConfig.template)\n : path.resolve(process.cwd(), options.template);\n\n const tempHtmlPath = path.resolve(process.cwd(), `temp-${name}.html`);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), `/${file}`);\n\n fs.writeFileSync(tempHtmlPath, html);\n tempFiles.push(tempHtmlPath);\n\n input[name] = tempHtmlPath;\n pageMapping.set(`temp-${name}.html`, `${name}.html`);\n\n log(`创建临时文件: temp-${name}.html -> ${name}.html (策略: ${strategy})`);\n }\n });\n\n log('Build input configuration:', input);\n log('Strategy groups:', Object.keys(strategyGroups));\n\n // 应用构建策略\n config.build = config.build || {};\n config.build.rollupOptions = config.build.rollupOptions || {};\n config.build.rollupOptions.input = input;\n\n // 应用默认或指定的构建策略\n const defaultStrategyConfig = options.buildStrategies?.[defaultStrategy];\n if (defaultStrategyConfig) {\n applyBuildStrategy(config, defaultStrategyConfig, log);\n }\n\n // 如果只有一个策略组且不是默认策略,应用该策略\n const strategyKeys = Object.keys(strategyGroups);\n if (strategyKeys.length === 1 && strategyKeys[0] !== defaultStrategy) {\n const singleStrategy = options.buildStrategies?.[strategyKeys[0]];\n if (singleStrategy) {\n applyBuildStrategy(config, singleStrategy, log);\n }\n }\n\n // 处理多策略情况(需要多次构建)\n if (\n strategyKeys.length > 1 ||\n (strategyKeys.length === 1 &&\n strategyKeys[0] !== defaultStrategy &&\n options.buildStrategies?.[strategyKeys[0]])\n ) {\n log('检测到多构建策略,将创建策略映射');\n // 在插件实例上存储策略信息,供后续处理\n (config as any).__multiPageStrategies = {\n groups: strategyGroups,\n strategies: options.buildStrategies,\n pageConfigs: options.pageConfigs,\n };\n }\n}\n\nfunction getPageConfig(\n pageConfigs: Record<string, PageConfig> | PageConfigFunction | undefined,\n context: PageConfigContext,\n log: (...args: any[]) => void\n): PageConfig | null {\n if (!pageConfigs) return null;\n\n // 如果是函数,直接调用\n if (typeof pageConfigs === 'function') {\n const result = pageConfigs(context);\n if (result) {\n log(`函数配置匹配页面 ${context.pageName}:`, result);\n }\n return result;\n }\n\n // 对象配置:支持精确匹配和模式匹配\n for (const [key, config] of Object.entries(pageConfigs)) {\n // 精确匹配页面名称\n if (key === context.pageName) {\n log(`精确匹配页面 ${context.pageName}:`, config);\n return config;\n }\n\n // 模式匹配\n if (config.match) {\n const patterns = Array.isArray(config.match) ? config.match : [config.match];\n const isMatched = patterns.some(\n pattern =>\n simpleMatch(pattern, context.pageName) ||\n simpleMatch(pattern, context.relativePath) ||\n simpleMatch(pattern, context.filePath)\n );\n\n if (isMatched) {\n log(`模式匹配页面 ${context.pageName} (模式: ${config.match}):`, config);\n return { ...config, match: undefined }; // 移除 match 属性避免传递给构建配置\n }\n }\n\n // glob 模式匹配页面名称\n if (simpleMatch(key, context.pageName)) {\n log(`Glob匹配页面 ${context.pageName} (模式: ${key}):`, config);\n return config;\n }\n }\n\n return null;\n}\n\nfunction applyBuildStrategy(config: any, strategy: BuildStrategy, log: (...args: any[]) => void) {\n log('应用构建策略:', strategy);\n\n // 应用完整的 Vite 配置\n if (strategy.viteConfig) {\n const { build: viteBuild, ...otherViteConfig } = strategy.viteConfig;\n\n // 合并非构建配置\n Object.keys(otherViteConfig).forEach(key => {\n if (key !== 'plugins') {\n // 跳过 plugins,避免冲突\n const configKey = key as keyof typeof config;\n const viteConfigValue = otherViteConfig[key as keyof typeof otherViteConfig];\n if (viteConfigValue && typeof viteConfigValue === 'object') {\n config[configKey] = {\n ...(config[configKey] || {}),\n ...viteConfigValue,\n };\n } else {\n config[configKey] = viteConfigValue;\n }\n }\n });\n\n // 合并构建配置\n if (viteBuild) {\n config.build = {\n ...config.build,\n ...viteBuild,\n };\n }\n }\n\n // 应用输出配置\n if (strategy.output) {\n config.build.rollupOptions.output = {\n ...config.build.rollupOptions.output,\n ...strategy.output,\n };\n }\n\n // 应用构建配置\n if (strategy.build) {\n config.build = {\n ...config.build,\n ...strategy.build,\n };\n }\n\n // 应用环境变量\n if (strategy.define) {\n config.define = {\n ...config.define,\n ...strategy.define,\n };\n }\n\n // 应用别名配置\n if (strategy.alias) {\n config.resolve = config.resolve || {};\n config.resolve.alias = {\n ...config.resolve.alias,\n ...strategy.alias,\n };\n }\n\n // 应用服务器配置\n if (strategy.server) {\n config.server = {\n ...config.server,\n ...strategy.server,\n };\n }\n\n // 应用 CSS 配置\n if (strategy.css) {\n config.css = {\n ...config.css,\n ...strategy.css,\n };\n }\n\n // 应用优化依赖配置\n if (strategy.optimizeDeps) {\n config.optimizeDeps = {\n ...config.optimizeDeps,\n ...strategy.optimizeDeps,\n };\n }\n}\n\nexport function createDevConfig(\n options: {\n entry: string;\n exclude: string[];\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const input: Record<string, string> = {};\n entryFiles.forEach(({ name, file }) => {\n input[name] = path.resolve(process.cwd(), file);\n });\n log('Dev input configuration:', input);\n}\n"],"mappings":"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","names":["path","fs","import_glob","path","path","fs","import_glob","simpleMatch","getPageConfig","options"]}
package/dist/index.mjs CHANGED
@@ -1,6 +1,9 @@
1
+ // @ts-nocheck
2
+
1
3
  // src/index.ts
2
4
  import * as path4 from "node:path";
3
5
  import * as fs3 from "node:fs";
6
+ import { glob as glob3 } from "glob";
4
7
 
5
8
  // src/utils.ts
6
9
  function escapeRegExp(string) {
@@ -77,16 +80,95 @@ function filterEntryFiles(files, entry, exclude, log) {
77
80
  }
78
81
 
79
82
  // src/dev-server.ts
83
+ function simpleMatch(pattern, text) {
84
+ const regexPattern = pattern.replace(/\*\*/g, "__DOUBLE_STAR__").replace(/\*/g, "[^/]*").replace(/__DOUBLE_STAR__/g, ".*");
85
+ const regex = new RegExp(`^${regexPattern}$`);
86
+ return regex.test(text);
87
+ }
88
+ function getPageConfig(pageConfigs, context, log) {
89
+ if (!pageConfigs)
90
+ return null;
91
+ if (typeof pageConfigs === "function") {
92
+ const result = pageConfigs(context);
93
+ if (result) {
94
+ log(`\u51FD\u6570\u914D\u7F6E\u5339\u914D\u9875\u9762 ${context.pageName}:`, result);
95
+ }
96
+ return result;
97
+ }
98
+ for (const [key, config] of Object.entries(pageConfigs)) {
99
+ if (key === context.pageName) {
100
+ log(`\u7CBE\u786E\u5339\u914D\u9875\u9762 ${context.pageName}:`, config);
101
+ return config;
102
+ }
103
+ if (config.match) {
104
+ const patterns = Array.isArray(config.match) ? config.match : [config.match];
105
+ const isMatched = patterns.some(
106
+ (pattern) => simpleMatch(pattern, context.pageName) || simpleMatch(pattern, context.relativePath) || simpleMatch(pattern, context.filePath)
107
+ );
108
+ if (isMatched) {
109
+ log(`\u6A21\u5F0F\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${config.match}):`, config);
110
+ return { ...config, match: void 0 };
111
+ }
112
+ }
113
+ if (simpleMatch(key, context.pageName)) {
114
+ log(`Glob\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${key}):`, config);
115
+ return config;
116
+ }
117
+ }
118
+ return null;
119
+ }
120
+ function applyDevStrategy(server, strategy, log) {
121
+ if (!strategy)
122
+ return;
123
+ log("\u5F00\u53D1\u6A21\u5F0F\u5E94\u7528\u6784\u5EFA\u7B56\u7565:", strategy);
124
+ if (strategy.define) {
125
+ log("\u5F00\u53D1\u73AF\u5883\u53D8\u91CF\u914D\u7F6E:", strategy.define);
126
+ }
127
+ if (strategy.alias) {
128
+ log("\u5F00\u53D1\u522B\u540D\u914D\u7F6E:", strategy.alias);
129
+ }
130
+ if (strategy.server) {
131
+ log("\u670D\u52A1\u5668\u914D\u7F6E:", strategy.server);
132
+ }
133
+ if (strategy.css) {
134
+ log("CSS\u914D\u7F6E:", strategy.css);
135
+ }
136
+ if (strategy.optimizeDeps) {
137
+ log("\u4F9D\u8D56\u4F18\u5316\u914D\u7F6E:", strategy.optimizeDeps);
138
+ }
139
+ }
80
140
  function configureDevServer(server, options, log) {
81
141
  const allFiles = glob.sync(options.entry, { cwd: process.cwd() });
82
142
  const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);
83
143
  const pageMap = /* @__PURE__ */ new Map();
84
144
  entryFiles.forEach(({ name, file }) => {
85
- pageMap.set(name, file);
145
+ const pageConfig = getPageConfig(
146
+ options.pageConfigs,
147
+ {
148
+ pageName: name,
149
+ filePath: file,
150
+ relativePath: path2.relative(process.cwd(), file),
151
+ strategy: void 0,
152
+ isMatched: false
153
+ },
154
+ log
155
+ );
156
+ const strategy = (pageConfig == null ? void 0 : pageConfig.strategy) || "default";
157
+ pageMap.set(name, {
158
+ file,
159
+ config: pageConfig,
160
+ strategy
161
+ });
162
+ if (options.buildStrategies && (pageConfig == null ? void 0 : pageConfig.strategy)) {
163
+ const buildStrategy = options.buildStrategies[pageConfig.strategy];
164
+ if (buildStrategy) {
165
+ applyDevStrategy(server, buildStrategy, log);
166
+ }
167
+ }
86
168
  });
87
169
  const pageNames = Array.from(pageMap.keys());
88
170
  log("Available pages:", pageNames);
89
- log("Page mapping:", Object.fromEntries(pageMap));
171
+ log("Page mapping with configs:", Object.fromEntries(pageMap));
90
172
  server.middlewares.use((req, res, next) => {
91
173
  var _a;
92
174
  const originalUrl = req.url;
@@ -107,12 +189,20 @@ function configureDevServer(server, options, log) {
107
189
  log(`\u5339\u914D\u5230\u9875\u9762: ${pageName}`);
108
190
  log(`\u53EF\u7528\u9875\u9762\u5217\u8868: ${pageNames.join(", ")}`);
109
191
  if (pageMap.has(pageName)) {
110
- const relativeEntryPath = pageMap.get(pageName);
192
+ const pageInfo = pageMap.get(pageName);
193
+ if (!pageInfo) {
194
+ log(`\u9875\u9762\u4FE1\u606F\u83B7\u53D6\u5931\u8D25: ${pageName}`);
195
+ return next();
196
+ }
197
+ const relativeEntryPath = pageInfo.file;
198
+ const pageConfig = pageInfo.config;
111
199
  const entryPath = path2.resolve(process.cwd(), relativeEntryPath);
112
200
  log(`\u9875\u9762 ${pageName} \u5BF9\u5E94\u6587\u4EF6: ${relativeEntryPath}`);
201
+ log(`\u9875\u9762\u914D\u7F6E:`, pageConfig);
113
202
  if (fs.existsSync(entryPath)) {
114
203
  log(`\u627E\u5230\u5165\u53E3\u6587\u4EF6: ${entryPath}`);
115
- const templatePath = path2.resolve(process.cwd(), options.template);
204
+ const templateFile = (pageConfig == null ? void 0 : pageConfig.template) || options.template;
205
+ const templatePath = path2.resolve(process.cwd(), templateFile);
116
206
  if (fs.existsSync(templatePath)) {
117
207
  let html = fs.readFileSync(templatePath, "utf-8");
118
208
  log(`\u8BFB\u53D6\u6A21\u677F\u6587\u4EF6: ${templatePath}`);
@@ -125,8 +215,20 @@ function configureDevServer(server, options, log) {
125
215
  }
126
216
  const entryFile = `/${relativeEntryPath}`;
127
217
  html = html.replace(new RegExp(escapeRegExp(options.placeholder), "g"), entryFile);
218
+ if (pageConfig == null ? void 0 : pageConfig.define) {
219
+ const defineScript = Object.entries(pageConfig.define).map(([key, value]) => `window.${key} = ${JSON.stringify(value)};`).join("\n");
220
+ if (defineScript) {
221
+ const scriptTag = `<script>
222
+ // \u9875\u9762\u7EA7\u73AF\u5883\u53D8\u91CF
223
+ ${defineScript}
224
+ </script>`;
225
+ html = html.replace("</head>", `${scriptTag}
226
+ </head>`);
227
+ log(`\u6CE8\u5165\u9875\u9762\u73AF\u5883\u53D8\u91CF:`, pageConfig.define);
228
+ }
229
+ }
128
230
  log(`\u5360\u4F4D\u7B26 ${options.placeholder} \u66FF\u6362\u4E3A: ${entryFile}`);
129
- log(`\u66FF\u6362\u540E\u5305\u542B\u5360\u4F4D\u7B26: ${html.includes(options.placeholder)}`);
231
+ log(`\u4F7F\u7528\u6A21\u677F: ${templateFile}`);
130
232
  res.setHeader("Content-Type", "text/html");
131
233
  res.end(html);
132
234
  return;
@@ -148,7 +250,7 @@ function configureDevServer(server, options, log) {
148
250
  import * as path3 from "node:path";
149
251
  import * as fs2 from "node:fs";
150
252
  import { glob as glob2 } from "glob";
151
- function simpleMatch(pattern, str) {
253
+ function simpleMatch2(pattern, str) {
152
254
  const regexPattern = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*").replace(/\?/g, ".");
153
255
  const regex = new RegExp(`^${regexPattern}$`);
154
256
  return regex.test(str);
@@ -178,7 +280,7 @@ function createBuildConfig(config, options, log, tempFiles, pageMapping) {
178
280
  const defaultStrategy = "default";
179
281
  entryFiles.forEach((entryFile) => {
180
282
  const { name, file } = entryFile;
181
- const pageConfig = getPageConfig(
283
+ const pageConfig = getPageConfig2(
182
284
  options.pageConfigs,
183
285
  {
184
286
  pageName: name,
@@ -231,7 +333,7 @@ function createBuildConfig(config, options, log, tempFiles, pageMapping) {
231
333
  };
232
334
  }
233
335
  }
234
- function getPageConfig(pageConfigs, context, log) {
336
+ function getPageConfig2(pageConfigs, context, log) {
235
337
  if (!pageConfigs)
236
338
  return null;
237
339
  if (typeof pageConfigs === "function") {
@@ -249,14 +351,14 @@ function getPageConfig(pageConfigs, context, log) {
249
351
  if (config.match) {
250
352
  const patterns = Array.isArray(config.match) ? config.match : [config.match];
251
353
  const isMatched = patterns.some(
252
- (pattern) => simpleMatch(pattern, context.pageName) || simpleMatch(pattern, context.relativePath) || simpleMatch(pattern, context.filePath)
354
+ (pattern) => simpleMatch2(pattern, context.pageName) || simpleMatch2(pattern, context.relativePath) || simpleMatch2(pattern, context.filePath)
253
355
  );
254
356
  if (isMatched) {
255
357
  log(`\u6A21\u5F0F\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${config.match}):`, config);
256
358
  return { ...config, match: void 0 };
257
359
  }
258
360
  }
259
- if (simpleMatch(key, context.pageName)) {
361
+ if (simpleMatch2(key, context.pageName)) {
260
362
  log(`Glob\u5339\u914D\u9875\u9762 ${context.pageName} (\u6A21\u5F0F: ${key}):`, config);
261
363
  return config;
262
364
  }
@@ -369,10 +471,77 @@ function viteMultiPage(options = {}) {
369
471
  );
370
472
  } else {
371
473
  createDevConfig({ entry, exclude }, log);
474
+ if (buildStrategies || pageConfigs) {
475
+ const allFiles = glob3.sync(entry, { cwd: process.cwd() });
476
+ const entryFiles = filterEntryFiles(allFiles, entry, exclude, log);
477
+ const strategiesToApply = /* @__PURE__ */ new Set();
478
+ entryFiles.forEach(({ name, file }) => {
479
+ if (typeof pageConfigs === "function") {
480
+ const pageConfig = pageConfigs({
481
+ pageName: name,
482
+ filePath: file,
483
+ relativePath: path4.relative(process.cwd(), file),
484
+ strategy: void 0,
485
+ isMatched: false
486
+ });
487
+ if (pageConfig == null ? void 0 : pageConfig.strategy) {
488
+ strategiesToApply.add(pageConfig.strategy);
489
+ }
490
+ } else if (pageConfigs) {
491
+ const pageConfig = pageConfigs[name];
492
+ if (pageConfig == null ? void 0 : pageConfig.strategy) {
493
+ strategiesToApply.add(pageConfig.strategy);
494
+ }
495
+ }
496
+ });
497
+ strategiesToApply.forEach((strategyName) => {
498
+ const strategy = buildStrategies == null ? void 0 : buildStrategies[strategyName];
499
+ if (strategy) {
500
+ log(`\u5F00\u53D1\u6A21\u5F0F\u5E94\u7528\u7B56\u7565 ${strategyName}:`, strategy);
501
+ if (strategy.viteConfig) {
502
+ const { build, ...otherViteConfig } = strategy.viteConfig;
503
+ Object.keys(otherViteConfig).forEach((key) => {
504
+ if (key !== "plugins") {
505
+ const configKey = key;
506
+ const viteConfigValue = otherViteConfig[key];
507
+ if (viteConfigValue && typeof viteConfigValue === "object") {
508
+ config[configKey] = {
509
+ ...config[configKey] || {},
510
+ ...viteConfigValue
511
+ };
512
+ } else {
513
+ config[configKey] = viteConfigValue;
514
+ }
515
+ }
516
+ });
517
+ }
518
+ if (strategy.define) {
519
+ config.define = { ...config.define, ...strategy.define };
520
+ }
521
+ if (strategy.alias) {
522
+ config.resolve = config.resolve || {};
523
+ config.resolve.alias = { ...config.resolve.alias, ...strategy.alias };
524
+ }
525
+ if (strategy.server) {
526
+ config.server = { ...config.server, ...strategy.server };
527
+ }
528
+ if (strategy.css) {
529
+ config.css = { ...config.css, ...strategy.css };
530
+ }
531
+ if (strategy.optimizeDeps) {
532
+ config.optimizeDeps = { ...config.optimizeDeps, ...strategy.optimizeDeps };
533
+ }
534
+ }
535
+ });
536
+ }
372
537
  }
373
538
  },
374
539
  configureServer(server) {
375
- configureDevServer(server, { entry, exclude, template, placeholder }, log);
540
+ configureDevServer(
541
+ server,
542
+ { entry, exclude, template, placeholder, buildStrategies, pageConfigs },
543
+ log
544
+ );
376
545
  },
377
546
  generateBundle() {
378
547
  },
@@ -399,8 +568,9 @@ function viteMultiPage(options = {}) {
399
568
  }
400
569
  };
401
570
  }
571
+ var src_default = viteMultiPage;
402
572
  export {
403
- viteMultiPage as default,
573
+ src_default as default,
404
574
  viteMultiPage
405
575
  };
406
576
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/dev-server.ts","../src/file-filter.ts","../src/build-config.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport type { MultiPageOptions } from './types';\nimport { createLogger } from './utils';\nimport { configureDevServer } from './dev-server';\nimport { createBuildConfig, createDevConfig } from './build-config';\n\nexport type { MultiPageOptions };\n\nexport default function viteMultiPage(options: MultiPageOptions = {}): Plugin {\n const {\n entry = 'src/**/*.{ts,js}',\n template = 'index.html',\n exclude = ['src/main.ts', 'src/vite-env.d.ts'],\n placeholder = '{{ENTRY_FILE}}',\n debug = false,\n buildStrategies,\n pageConfigs,\n } = options;\n\n const log = createLogger(debug);\n let tempFiles: string[] = [];\n const pageMapping: Map<string, string> = new Map();\n\n return {\n name: 'vite-plugin-multi-page',\n\n config(config: any, { command }: { command: string }) {\n if (command === 'build') {\n createBuildConfig(\n config,\n { entry, exclude, template, placeholder, buildStrategies, pageConfigs },\n log,\n tempFiles,\n pageMapping\n );\n } else {\n createDevConfig({ entry, exclude }, log);\n }\n },\n\n configureServer(server) {\n configureDevServer(server, { entry, exclude, template, placeholder }, log);\n },\n\n generateBundle() {\n // 用于处理JS/CSS资源,HTML在writeBundle中处理\n },\n\n writeBundle(options: any) {\n Array.from(pageMapping.entries()).forEach(([tempName, targetName]) => {\n const tempPath = path.resolve(options.dir || 'dist', tempName);\n const targetPath = path.resolve(options.dir || 'dist', targetName);\n\n if (fs.existsSync(tempPath)) {\n fs.renameSync(tempPath, targetPath);\n log(`重命名HTML文件: ${tempName} -> ${targetName}`);\n }\n });\n },\n\n closeBundle() {\n tempFiles.forEach(filePath => {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n const fileName = path.basename(filePath);\n log(`清理临时文件: ${fileName}`);\n }\n });\n tempFiles = [];\n pageMapping.clear();\n },\n };\n}\n\nexport { viteMultiPage };\n","export function escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function createLogger(debug: boolean) {\n return (...args: any[]) => {\n if (debug) {\n console.log('[vite-plugin-multi-page]', ...args);\n }\n };\n}\n","import type { ViteDevServer } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\n\nexport function configureDevServer(\n server: ViteDevServer,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const pageMap = new Map<string, string>();\n entryFiles.forEach(({ name, file }) => {\n pageMap.set(name, file);\n });\n\n const pageNames = Array.from(pageMap.keys());\n log('Available pages:', pageNames);\n log('Page mapping:', Object.fromEntries(pageMap));\n\n server.middlewares.use((req: any, res: any, next: any) => {\n const originalUrl = req.url;\n const url = originalUrl?.split('?')[0];\n\n if (!url) {\n return next();\n }\n\n log(`处理请求: ${url}`);\n\n if (url === '/' && pageNames.length > 0) {\n const defaultPage = pageNames.includes('index') ? 'index' : pageNames[0];\n log(`根路径重定向到: ${defaultPage}`);\n req.url = `/${defaultPage}.html`;\n }\n\n const finalUrl = req.url?.split('?')[0];\n // eslint-disable-next-line no-useless-escape\n const pageMatch = finalUrl?.match(/^\\/([^\\/\\.]+)(\\.html)?$/);\n\n if (pageMatch) {\n const pageName = pageMatch[1];\n\n log(`匹配到页面: ${pageName}`);\n log(`可用页面列表: ${pageNames.join(', ')}`);\n\n if (pageMap.has(pageName)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const relativeEntryPath = pageMap.get(pageName)!;\n const entryPath = path.resolve(process.cwd(), relativeEntryPath);\n\n log(`页面 ${pageName} 对应文件: ${relativeEntryPath}`);\n\n if (fs.existsSync(entryPath)) {\n log(`找到入口文件: ${entryPath}`);\n\n const templatePath = path.resolve(process.cwd(), options.template);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n\n log(`读取模板文件: ${templatePath}`);\n log(`模板内容包含占位符: ${html.includes(options.placeholder)}`);\n\n if (!html.includes(options.placeholder)) {\n console.warn(\n `[vite-plugin-multi-page] 模板文件中没有找到占位符: ${options.placeholder}`\n );\n return next();\n }\n\n const entryFile = `/${relativeEntryPath}`;\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), entryFile);\n\n log(`占位符 ${options.placeholder} 替换为: ${entryFile}`);\n log(`替换后包含占位符: ${html.includes(options.placeholder)}`);\n\n res.setHeader('Content-Type', 'text/html');\n res.end(html);\n return;\n } else {\n log(`模板文件不存在: ${templatePath}`);\n }\n } else {\n log(`入口文件不存在: ${entryPath}`);\n }\n } else {\n log(`页面 ${pageName} 不在可用列表中`);\n }\n }\n\n next();\n });\n}\n","import * as path from 'node:path';\nimport type { EntryFile, CandidateFile } from './types';\n\nexport function filterEntryFiles(\n files: string[],\n entry: string,\n exclude: string[],\n log: (...args: any[]) => void\n): EntryFile[] {\n const result: EntryFile[] = [];\n const nameToFile = new Map<string, string>();\n\n const basePattern = entry.replace(/\\/\\*\\*.*$/, '');\n log('基础目录模式:', basePattern);\n\n const candidateFiles: CandidateFile[] = [];\n\n for (const file of files) {\n if (exclude.includes(file)) {\n log(`跳过排除文件: ${file}`);\n continue;\n }\n\n const relativePath = path.relative(basePattern, file);\n const pathParts = relativePath.split(path.sep);\n\n log(`处理文件: ${file}`);\n log(`相对路径: ${relativePath}`);\n log(`路径部分: ${pathParts}`);\n\n if (pathParts.length === 1) {\n const fileName = pathParts[0];\n const name = path.basename(fileName, path.extname(fileName));\n candidateFiles.push({ name, file, priority: 1 });\n log(`📄 第一级文件: ${file} -> ${name}.html (优先级: 1)`);\n } else if (pathParts.length >= 2) {\n const fileName = path.basename(file, path.extname(file));\n const dirName = pathParts[0];\n\n if (fileName === 'main') {\n candidateFiles.push({ name: dirName, file, priority: 2 });\n log(`📁 目录main文件: ${file} -> ${dirName}.html (优先级: 2)`);\n } else {\n log(`❌ 跳过文件: ${file} (不是main文件)`);\n }\n } else {\n log(`❌ 跳过文件: ${file} (路径层级不符合)`);\n }\n }\n\n for (const candidate of candidateFiles) {\n const existing = nameToFile.get(candidate.name);\n\n if (!existing) {\n nameToFile.set(candidate.name, candidate.file);\n log(`✅ 添加页面: ${candidate.name} -> ${candidate.file}`);\n } else {\n const existingCandidate = candidateFiles.find(c => c.file === existing);\n if (existingCandidate && candidate.priority > existingCandidate.priority) {\n nameToFile.set(candidate.name, candidate.file);\n log(`🔄 替换页面: ${candidate.name} -> ${candidate.file} (替换 ${existing})`);\n } else {\n log(`⚠️ 冲突跳过: ${candidate.name} -> ${candidate.file} (保留 ${existing})`);\n }\n }\n }\n\n for (const [name, file] of nameToFile.entries()) {\n result.push({ name, file });\n }\n\n return result;\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\nimport type { BuildStrategy, PageConfig, PageConfigFunction, PageConfigContext } from './types';\n\n// 简单的 glob 模式匹配函数\nfunction simpleMatch(pattern: string, str: string): boolean {\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // 转义特殊字符\n .replace(/\\*/g, '.*') // * 匹配任意字符\n .replace(/\\?/g, '.'); // ? 匹配单个字符\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(str);\n}\n\nexport function createBuildConfig(\n config: any,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n buildStrategies?: Record<string, BuildStrategy>;\n pageConfigs?: Record<string, PageConfig> | PageConfigFunction;\n },\n log: (...args: any[]) => void,\n tempFiles: string[],\n pageMapping: Map<string, string>\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n if (entryFiles.length === 0) {\n console.warn('[vite-plugin-multi-page] No entry files found matching pattern:', options.entry);\n return;\n }\n\n log('扫描到的所有文件:', allFiles);\n log('过滤后的入口文件:', entryFiles);\n\n // 清理旧的临时文件\n const existingTempFiles = glob.sync('temp-*.html', { cwd: process.cwd() });\n existingTempFiles.forEach(file => {\n const fullPath = path.resolve(process.cwd(), file);\n if (fs.existsSync(fullPath)) {\n fs.unlinkSync(fullPath);\n log(`清理旧的临时文件: ${file}`);\n }\n });\n\n const input: Record<string, string> = {};\n tempFiles.length = 0; // 清空数组\n pageMapping.clear();\n\n // 分组页面按构建策略\n const strategyGroups: Record<string, typeof entryFiles> = {};\n const defaultStrategy = 'default';\n\n entryFiles.forEach(entryFile => {\n const { name, file } = entryFile;\n\n // 获取页面配置\n const pageConfig = getPageConfig(\n options.pageConfigs,\n {\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n },\n log\n );\n\n const strategy = pageConfig?.strategy || defaultStrategy;\n\n if (!strategyGroups[strategy]) {\n strategyGroups[strategy] = [];\n }\n strategyGroups[strategy].push(entryFile);\n\n // 创建HTML文件\n const templatePath = pageConfig?.template\n ? path.resolve(process.cwd(), pageConfig.template)\n : path.resolve(process.cwd(), options.template);\n\n const tempHtmlPath = path.resolve(process.cwd(), `temp-${name}.html`);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), `/${file}`);\n\n fs.writeFileSync(tempHtmlPath, html);\n tempFiles.push(tempHtmlPath);\n\n input[name] = tempHtmlPath;\n pageMapping.set(`temp-${name}.html`, `${name}.html`);\n\n log(`创建临时文件: temp-${name}.html -> ${name}.html (策略: ${strategy})`);\n }\n });\n\n log('Build input configuration:', input);\n log('Strategy groups:', Object.keys(strategyGroups));\n\n // 应用构建策略\n config.build = config.build || {};\n config.build.rollupOptions = config.build.rollupOptions || {};\n config.build.rollupOptions.input = input;\n\n // 应用默认或指定的构建策略\n const defaultStrategyConfig = options.buildStrategies?.[defaultStrategy];\n if (defaultStrategyConfig) {\n applyBuildStrategy(config, defaultStrategyConfig, log);\n }\n\n // 如果只有一个策略组且不是默认策略,应用该策略\n const strategyKeys = Object.keys(strategyGroups);\n if (strategyKeys.length === 1 && strategyKeys[0] !== defaultStrategy) {\n const singleStrategy = options.buildStrategies?.[strategyKeys[0]];\n if (singleStrategy) {\n applyBuildStrategy(config, singleStrategy, log);\n }\n }\n\n // 处理多策略情况(需要多次构建)\n if (\n strategyKeys.length > 1 ||\n (strategyKeys.length === 1 &&\n strategyKeys[0] !== defaultStrategy &&\n options.buildStrategies?.[strategyKeys[0]])\n ) {\n log('检测到多构建策略,将创建策略映射');\n // 在插件实例上存储策略信息,供后续处理\n (config as any).__multiPageStrategies = {\n groups: strategyGroups,\n strategies: options.buildStrategies,\n pageConfigs: options.pageConfigs,\n };\n }\n}\n\nfunction getPageConfig(\n pageConfigs: Record<string, PageConfig> | PageConfigFunction | undefined,\n context: PageConfigContext,\n log: (...args: any[]) => void\n): PageConfig | null {\n if (!pageConfigs) return null;\n\n // 如果是函数,直接调用\n if (typeof pageConfigs === 'function') {\n const result = pageConfigs(context);\n if (result) {\n log(`函数配置匹配页面 ${context.pageName}:`, result);\n }\n return result;\n }\n\n // 对象配置:支持精确匹配和模式匹配\n for (const [key, config] of Object.entries(pageConfigs)) {\n // 精确匹配页面名称\n if (key === context.pageName) {\n log(`精确匹配页面 ${context.pageName}:`, config);\n return config;\n }\n\n // 模式匹配\n if (config.match) {\n const patterns = Array.isArray(config.match) ? config.match : [config.match];\n const isMatched = patterns.some(\n pattern =>\n simpleMatch(pattern, context.pageName) ||\n simpleMatch(pattern, context.relativePath) ||\n simpleMatch(pattern, context.filePath)\n );\n\n if (isMatched) {\n log(`模式匹配页面 ${context.pageName} (模式: ${config.match}):`, config);\n return { ...config, match: undefined }; // 移除 match 属性避免传递给构建配置\n }\n }\n\n // glob 模式匹配页面名称\n if (simpleMatch(key, context.pageName)) {\n log(`Glob匹配页面 ${context.pageName} (模式: ${key}):`, config);\n return config;\n }\n }\n\n return null;\n}\n\nfunction applyBuildStrategy(config: any, strategy: BuildStrategy, log: (...args: any[]) => void) {\n log('应用构建策略:', strategy);\n\n // 应用完整的 Vite 配置\n if (strategy.viteConfig) {\n const { build: viteBuild, ...otherViteConfig } = strategy.viteConfig;\n\n // 合并非构建配置\n Object.keys(otherViteConfig).forEach(key => {\n if (key !== 'plugins') {\n // 跳过 plugins,避免冲突\n const configKey = key as keyof typeof config;\n const viteConfigValue = otherViteConfig[key as keyof typeof otherViteConfig];\n if (viteConfigValue && typeof viteConfigValue === 'object') {\n config[configKey] = {\n ...(config[configKey] || {}),\n ...viteConfigValue,\n };\n } else {\n config[configKey] = viteConfigValue;\n }\n }\n });\n\n // 合并构建配置\n if (viteBuild) {\n config.build = {\n ...config.build,\n ...viteBuild,\n };\n }\n }\n\n // 应用输出配置\n if (strategy.output) {\n config.build.rollupOptions.output = {\n ...config.build.rollupOptions.output,\n ...strategy.output,\n };\n }\n\n // 应用构建配置\n if (strategy.build) {\n config.build = {\n ...config.build,\n ...strategy.build,\n };\n }\n\n // 应用环境变量\n if (strategy.define) {\n config.define = {\n ...config.define,\n ...strategy.define,\n };\n }\n\n // 应用别名配置\n if (strategy.alias) {\n config.resolve = config.resolve || {};\n config.resolve.alias = {\n ...config.resolve.alias,\n ...strategy.alias,\n };\n }\n\n // 应用服务器配置\n if (strategy.server) {\n config.server = {\n ...config.server,\n ...strategy.server,\n };\n }\n\n // 应用 CSS 配置\n if (strategy.css) {\n config.css = {\n ...config.css,\n ...strategy.css,\n };\n }\n\n // 应用优化依赖配置\n if (strategy.optimizeDeps) {\n config.optimizeDeps = {\n ...config.optimizeDeps,\n ...strategy.optimizeDeps,\n };\n }\n}\n\nexport function createDevConfig(\n options: {\n entry: string;\n exclude: string[];\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const input: Record<string, string> = {};\n entryFiles.forEach(({ name, file }) => {\n input[name] = path.resolve(process.cwd(), file);\n });\n log('Dev input configuration:', input);\n}\n"],"mappings":"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","names":["path","fs","path","path","fs","glob","glob","options"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/dev-server.ts","../src/file-filter.ts","../src/build-config.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport type { MultiPageOptions } from './types';\nimport { createLogger } from './utils';\nimport { configureDevServer } from './dev-server';\nimport { createBuildConfig, createDevConfig } from './build-config';\nimport { filterEntryFiles } from './file-filter';\n\nexport type { MultiPageOptions };\n\nfunction viteMultiPage(options: MultiPageOptions = {}): Plugin {\n const {\n entry = 'src/**/*.{ts,js}',\n template = 'index.html',\n exclude = ['src/main.ts', 'src/vite-env.d.ts'],\n placeholder = '{{ENTRY_FILE}}',\n debug = false,\n buildStrategies,\n pageConfigs,\n } = options;\n\n const log = createLogger(debug);\n let tempFiles: string[] = [];\n const pageMapping: Map<string, string> = new Map();\n\n return {\n name: 'vite-plugin-multi-page',\n\n config(config: any, { command }: { command: string }) {\n if (command === 'build') {\n createBuildConfig(\n config,\n { entry, exclude, template, placeholder, buildStrategies, pageConfigs },\n log,\n tempFiles,\n pageMapping\n );\n } else {\n createDevConfig({ entry, exclude }, log);\n\n if (buildStrategies || pageConfigs) {\n const allFiles = glob.sync(entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, entry, exclude, log);\n\n const strategiesToApply = new Set<string>();\n\n entryFiles.forEach(({ name, file }) => {\n if (typeof pageConfigs === 'function') {\n const pageConfig = pageConfigs({\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n });\n if (pageConfig?.strategy) {\n strategiesToApply.add(pageConfig.strategy);\n }\n } else if (pageConfigs) {\n const pageConfig = pageConfigs[name];\n if (pageConfig?.strategy) {\n strategiesToApply.add(pageConfig.strategy);\n }\n }\n });\n\n strategiesToApply.forEach(strategyName => {\n const strategy = buildStrategies?.[strategyName];\n if (strategy) {\n log(`开发模式应用策略 ${strategyName}:`, strategy);\n\n if (strategy.viteConfig) {\n // 解构时跳过 build 属性,因为开发模式不需要构建配置\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { build, ...otherViteConfig } = strategy.viteConfig;\n Object.keys(otherViteConfig).forEach(key => {\n if (key !== 'plugins') {\n const configKey = key as keyof typeof config;\n const viteConfigValue = otherViteConfig[key as keyof typeof otherViteConfig];\n if (viteConfigValue && typeof viteConfigValue === 'object') {\n config[configKey] = {\n ...(config[configKey] || {}),\n ...viteConfigValue,\n };\n } else {\n config[configKey] = viteConfigValue;\n }\n }\n });\n }\n\n if (strategy.define) {\n config.define = { ...config.define, ...strategy.define };\n }\n if (strategy.alias) {\n config.resolve = config.resolve || {};\n config.resolve.alias = { ...config.resolve.alias, ...strategy.alias };\n }\n if (strategy.server) {\n config.server = { ...config.server, ...strategy.server };\n }\n if (strategy.css) {\n config.css = { ...config.css, ...strategy.css };\n }\n if (strategy.optimizeDeps) {\n config.optimizeDeps = { ...config.optimizeDeps, ...strategy.optimizeDeps };\n }\n }\n });\n }\n }\n },\n\n configureServer(server) {\n configureDevServer(\n server,\n { entry, exclude, template, placeholder, buildStrategies, pageConfigs },\n log\n );\n },\n\n generateBundle() {\n // 用于处理JS/CSS资源,HTML在writeBundle中处理\n },\n\n writeBundle(options: any) {\n Array.from(pageMapping.entries()).forEach(([tempName, targetName]) => {\n const tempPath = path.resolve(options.dir || 'dist', tempName);\n const targetPath = path.resolve(options.dir || 'dist', targetName);\n\n if (fs.existsSync(tempPath)) {\n fs.renameSync(tempPath, targetPath);\n log(`重命名HTML文件: ${tempName} -> ${targetName}`);\n }\n });\n },\n\n closeBundle() {\n tempFiles.forEach(filePath => {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n const fileName = path.basename(filePath);\n log(`清理临时文件: ${fileName}`);\n }\n });\n tempFiles = [];\n pageMapping.clear();\n },\n };\n}\n\n// 默认导出\nexport default viteMultiPage;\n\n// 具名导出以支持 CommonJS 和 ESM\nexport { viteMultiPage };\n","export function escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function createLogger(debug: boolean) {\n return (...args: any[]) => {\n if (debug) {\n console.log('[vite-plugin-multi-page]', ...args);\n }\n };\n}\n","import type { ViteDevServer } from 'vite';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\nimport type { PageConfig, PageConfigFunction, PageConfigContext, BuildStrategy } from './types';\n\nfunction simpleMatch(pattern: string, text: string): boolean {\n const regexPattern = pattern\n .replace(/\\*\\*/g, '__DOUBLE_STAR__')\n .replace(/\\*/g, '[^/]*')\n .replace(/__DOUBLE_STAR__/g, '.*');\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(text);\n}\n\nfunction getPageConfig(\n pageConfigs: Record<string, PageConfig> | PageConfigFunction | undefined,\n context: PageConfigContext,\n log: (...args: any[]) => void\n): PageConfig | null {\n if (!pageConfigs) return null;\n\n // 如果是函数,直接调用\n if (typeof pageConfigs === 'function') {\n const result = pageConfigs(context);\n if (result) {\n log(`函数配置匹配页面 ${context.pageName}:`, result);\n }\n return result;\n }\n\n // 对象配置:支持精确匹配和模式匹配\n for (const [key, config] of Object.entries(pageConfigs)) {\n // 精确匹配页面名称\n if (key === context.pageName) {\n log(`精确匹配页面 ${context.pageName}:`, config);\n return config;\n }\n\n // 模式匹配\n if (config.match) {\n const patterns = Array.isArray(config.match) ? config.match : [config.match];\n const isMatched = patterns.some(\n pattern =>\n simpleMatch(pattern, context.pageName) ||\n simpleMatch(pattern, context.relativePath) ||\n simpleMatch(pattern, context.filePath)\n );\n\n if (isMatched) {\n log(`模式匹配页面 ${context.pageName} (模式: ${config.match}):`, config);\n return { ...config, match: undefined };\n }\n }\n\n // glob 模式匹配页面名称\n if (simpleMatch(key, context.pageName)) {\n log(`Glob匹配页面 ${context.pageName} (模式: ${key}):`, config);\n return config;\n }\n }\n\n return null;\n}\n\nfunction applyDevStrategy(\n server: ViteDevServer,\n strategy: BuildStrategy,\n log: (...args: any[]) => void\n) {\n if (!strategy) return;\n\n log('开发模式应用构建策略:', strategy);\n\n // 注意:开发服务器的配置在启动后是只读的\n // 这里主要记录配置信息,实际应用需要在插件的 config 钩子中处理\n\n if (strategy.define) {\n log('开发环境变量配置:', strategy.define);\n }\n\n if (strategy.alias) {\n log('开发别名配置:', strategy.alias);\n }\n\n if (strategy.server) {\n log('服务器配置:', strategy.server);\n }\n\n if (strategy.css) {\n log('CSS配置:', strategy.css);\n }\n\n if (strategy.optimizeDeps) {\n log('依赖优化配置:', strategy.optimizeDeps);\n }\n}\n\nexport function configureDevServer(\n server: ViteDevServer,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n buildStrategies?: Record<string, BuildStrategy>;\n pageConfigs?: Record<string, PageConfig> | PageConfigFunction;\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const pageMap = new Map<string, { file: string; config: PageConfig | null; strategy?: string }>();\n\n entryFiles.forEach(({ name, file }) => {\n // 获取页面配置\n const pageConfig = getPageConfig(\n options.pageConfigs,\n {\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n },\n log\n );\n\n const strategy = pageConfig?.strategy || 'default';\n\n pageMap.set(name, {\n file,\n config: pageConfig,\n strategy,\n });\n\n // 如果指定了构建策略,记录配置信息\n if (options.buildStrategies && pageConfig?.strategy) {\n const buildStrategy = options.buildStrategies[pageConfig.strategy];\n if (buildStrategy) {\n applyDevStrategy(server, buildStrategy, log);\n }\n }\n });\n\n const pageNames = Array.from(pageMap.keys());\n log('Available pages:', pageNames);\n log('Page mapping with configs:', Object.fromEntries(pageMap));\n\n server.middlewares.use((req: any, res: any, next: any) => {\n const originalUrl = req.url;\n const url = originalUrl?.split('?')[0];\n\n if (!url) {\n return next();\n }\n\n log(`处理请求: ${url}`);\n\n if (url === '/' && pageNames.length > 0) {\n const defaultPage = pageNames.includes('index') ? 'index' : pageNames[0];\n log(`根路径重定向到: ${defaultPage}`);\n req.url = `/${defaultPage}.html`;\n }\n\n const finalUrl = req.url?.split('?')[0];\n // eslint-disable-next-line no-useless-escape\n const pageMatch = finalUrl?.match(/^\\/([^\\/\\.]+)(\\.html)?$/);\n\n if (pageMatch) {\n const pageName = pageMatch[1];\n\n log(`匹配到页面: ${pageName}`);\n log(`可用页面列表: ${pageNames.join(', ')}`);\n\n if (pageMap.has(pageName)) {\n const pageInfo = pageMap.get(pageName);\n if (!pageInfo) {\n log(`页面信息获取失败: ${pageName}`);\n return next();\n }\n\n const relativeEntryPath = pageInfo.file;\n const pageConfig = pageInfo.config;\n const entryPath = path.resolve(process.cwd(), relativeEntryPath);\n\n log(`页面 ${pageName} 对应文件: ${relativeEntryPath}`);\n log(`页面配置:`, pageConfig);\n\n if (fs.existsSync(entryPath)) {\n log(`找到入口文件: ${entryPath}`);\n\n // 根据页面配置选择模板\n const templateFile = pageConfig?.template || options.template;\n const templatePath = path.resolve(process.cwd(), templateFile);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n\n log(`读取模板文件: ${templatePath}`);\n log(`模板内容包含占位符: ${html.includes(options.placeholder)}`);\n\n if (!html.includes(options.placeholder)) {\n console.warn(\n `[vite-plugin-multi-page] 模板文件中没有找到占位符: ${options.placeholder}`\n );\n return next();\n }\n\n const entryFile = `/${relativeEntryPath}`;\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), entryFile);\n\n // 应用页面级环境变量注入\n if (pageConfig?.define) {\n // 在HTML中注入环境变量\n const defineScript = Object.entries(pageConfig.define)\n .map(([key, value]) => `window.${key} = ${JSON.stringify(value)};`)\n .join('\\n');\n\n if (defineScript) {\n const scriptTag = `<script>\n // 页面级环境变量\n ${defineScript}\n </script>`;\n html = html.replace('</head>', `${scriptTag}\\n</head>`);\n log(`注入页面环境变量:`, pageConfig.define);\n }\n }\n\n log(`占位符 ${options.placeholder} 替换为: ${entryFile}`);\n log(`使用模板: ${templateFile}`);\n\n res.setHeader('Content-Type', 'text/html');\n res.end(html);\n return;\n } else {\n log(`模板文件不存在: ${templatePath}`);\n }\n } else {\n log(`入口文件不存在: ${entryPath}`);\n }\n } else {\n log(`页面 ${pageName} 不在可用列表中`);\n }\n }\n\n next();\n });\n}\n","import * as path from 'node:path';\nimport type { EntryFile, CandidateFile } from './types';\n\nexport function filterEntryFiles(\n files: string[],\n entry: string,\n exclude: string[],\n log: (...args: any[]) => void\n): EntryFile[] {\n const result: EntryFile[] = [];\n const nameToFile = new Map<string, string>();\n\n const basePattern = entry.replace(/\\/\\*\\*.*$/, '');\n log('基础目录模式:', basePattern);\n\n const candidateFiles: CandidateFile[] = [];\n\n for (const file of files) {\n if (exclude.includes(file)) {\n log(`跳过排除文件: ${file}`);\n continue;\n }\n\n const relativePath = path.relative(basePattern, file);\n const pathParts = relativePath.split(path.sep);\n\n log(`处理文件: ${file}`);\n log(`相对路径: ${relativePath}`);\n log(`路径部分: ${pathParts}`);\n\n if (pathParts.length === 1) {\n const fileName = pathParts[0];\n const name = path.basename(fileName, path.extname(fileName));\n candidateFiles.push({ name, file, priority: 1 });\n log(`📄 第一级文件: ${file} -> ${name}.html (优先级: 1)`);\n } else if (pathParts.length >= 2) {\n const fileName = path.basename(file, path.extname(file));\n const dirName = pathParts[0];\n\n if (fileName === 'main') {\n candidateFiles.push({ name: dirName, file, priority: 2 });\n log(`📁 目录main文件: ${file} -> ${dirName}.html (优先级: 2)`);\n } else {\n log(`❌ 跳过文件: ${file} (不是main文件)`);\n }\n } else {\n log(`❌ 跳过文件: ${file} (路径层级不符合)`);\n }\n }\n\n for (const candidate of candidateFiles) {\n const existing = nameToFile.get(candidate.name);\n\n if (!existing) {\n nameToFile.set(candidate.name, candidate.file);\n log(`✅ 添加页面: ${candidate.name} -> ${candidate.file}`);\n } else {\n const existingCandidate = candidateFiles.find(c => c.file === existing);\n if (existingCandidate && candidate.priority > existingCandidate.priority) {\n nameToFile.set(candidate.name, candidate.file);\n log(`🔄 替换页面: ${candidate.name} -> ${candidate.file} (替换 ${existing})`);\n } else {\n log(`⚠️ 冲突跳过: ${candidate.name} -> ${candidate.file} (保留 ${existing})`);\n }\n }\n }\n\n for (const [name, file] of nameToFile.entries()) {\n result.push({ name, file });\n }\n\n return result;\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport { filterEntryFiles } from './file-filter';\nimport { escapeRegExp } from './utils';\nimport type { BuildStrategy, PageConfig, PageConfigFunction, PageConfigContext } from './types';\n\n// 简单的 glob 模式匹配函数\nfunction simpleMatch(pattern: string, str: string): boolean {\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // 转义特殊字符\n .replace(/\\*/g, '.*') // * 匹配任意字符\n .replace(/\\?/g, '.'); // ? 匹配单个字符\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(str);\n}\n\nexport function createBuildConfig(\n config: any,\n options: {\n entry: string;\n exclude: string[];\n template: string;\n placeholder: string;\n buildStrategies?: Record<string, BuildStrategy>;\n pageConfigs?: Record<string, PageConfig> | PageConfigFunction;\n },\n log: (...args: any[]) => void,\n tempFiles: string[],\n pageMapping: Map<string, string>\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n if (entryFiles.length === 0) {\n console.warn('[vite-plugin-multi-page] No entry files found matching pattern:', options.entry);\n return;\n }\n\n log('扫描到的所有文件:', allFiles);\n log('过滤后的入口文件:', entryFiles);\n\n // 清理旧的临时文件\n const existingTempFiles = glob.sync('temp-*.html', { cwd: process.cwd() });\n existingTempFiles.forEach(file => {\n const fullPath = path.resolve(process.cwd(), file);\n if (fs.existsSync(fullPath)) {\n fs.unlinkSync(fullPath);\n log(`清理旧的临时文件: ${file}`);\n }\n });\n\n const input: Record<string, string> = {};\n tempFiles.length = 0; // 清空数组\n pageMapping.clear();\n\n // 分组页面按构建策略\n const strategyGroups: Record<string, typeof entryFiles> = {};\n const defaultStrategy = 'default';\n\n entryFiles.forEach(entryFile => {\n const { name, file } = entryFile;\n\n // 获取页面配置\n const pageConfig = getPageConfig(\n options.pageConfigs,\n {\n pageName: name,\n filePath: file,\n relativePath: path.relative(process.cwd(), file),\n strategy: undefined,\n isMatched: false,\n },\n log\n );\n\n const strategy = pageConfig?.strategy || defaultStrategy;\n\n if (!strategyGroups[strategy]) {\n strategyGroups[strategy] = [];\n }\n strategyGroups[strategy].push(entryFile);\n\n // 创建HTML文件\n const templatePath = pageConfig?.template\n ? path.resolve(process.cwd(), pageConfig.template)\n : path.resolve(process.cwd(), options.template);\n\n const tempHtmlPath = path.resolve(process.cwd(), `temp-${name}.html`);\n\n if (fs.existsSync(templatePath)) {\n let html = fs.readFileSync(templatePath, 'utf-8');\n html = html.replace(new RegExp(escapeRegExp(options.placeholder), 'g'), `/${file}`);\n\n fs.writeFileSync(tempHtmlPath, html);\n tempFiles.push(tempHtmlPath);\n\n input[name] = tempHtmlPath;\n pageMapping.set(`temp-${name}.html`, `${name}.html`);\n\n log(`创建临时文件: temp-${name}.html -> ${name}.html (策略: ${strategy})`);\n }\n });\n\n log('Build input configuration:', input);\n log('Strategy groups:', Object.keys(strategyGroups));\n\n // 应用构建策略\n config.build = config.build || {};\n config.build.rollupOptions = config.build.rollupOptions || {};\n config.build.rollupOptions.input = input;\n\n // 应用默认或指定的构建策略\n const defaultStrategyConfig = options.buildStrategies?.[defaultStrategy];\n if (defaultStrategyConfig) {\n applyBuildStrategy(config, defaultStrategyConfig, log);\n }\n\n // 如果只有一个策略组且不是默认策略,应用该策略\n const strategyKeys = Object.keys(strategyGroups);\n if (strategyKeys.length === 1 && strategyKeys[0] !== defaultStrategy) {\n const singleStrategy = options.buildStrategies?.[strategyKeys[0]];\n if (singleStrategy) {\n applyBuildStrategy(config, singleStrategy, log);\n }\n }\n\n // 处理多策略情况(需要多次构建)\n if (\n strategyKeys.length > 1 ||\n (strategyKeys.length === 1 &&\n strategyKeys[0] !== defaultStrategy &&\n options.buildStrategies?.[strategyKeys[0]])\n ) {\n log('检测到多构建策略,将创建策略映射');\n // 在插件实例上存储策略信息,供后续处理\n (config as any).__multiPageStrategies = {\n groups: strategyGroups,\n strategies: options.buildStrategies,\n pageConfigs: options.pageConfigs,\n };\n }\n}\n\nfunction getPageConfig(\n pageConfigs: Record<string, PageConfig> | PageConfigFunction | undefined,\n context: PageConfigContext,\n log: (...args: any[]) => void\n): PageConfig | null {\n if (!pageConfigs) return null;\n\n // 如果是函数,直接调用\n if (typeof pageConfigs === 'function') {\n const result = pageConfigs(context);\n if (result) {\n log(`函数配置匹配页面 ${context.pageName}:`, result);\n }\n return result;\n }\n\n // 对象配置:支持精确匹配和模式匹配\n for (const [key, config] of Object.entries(pageConfigs)) {\n // 精确匹配页面名称\n if (key === context.pageName) {\n log(`精确匹配页面 ${context.pageName}:`, config);\n return config;\n }\n\n // 模式匹配\n if (config.match) {\n const patterns = Array.isArray(config.match) ? config.match : [config.match];\n const isMatched = patterns.some(\n pattern =>\n simpleMatch(pattern, context.pageName) ||\n simpleMatch(pattern, context.relativePath) ||\n simpleMatch(pattern, context.filePath)\n );\n\n if (isMatched) {\n log(`模式匹配页面 ${context.pageName} (模式: ${config.match}):`, config);\n return { ...config, match: undefined }; // 移除 match 属性避免传递给构建配置\n }\n }\n\n // glob 模式匹配页面名称\n if (simpleMatch(key, context.pageName)) {\n log(`Glob匹配页面 ${context.pageName} (模式: ${key}):`, config);\n return config;\n }\n }\n\n return null;\n}\n\nfunction applyBuildStrategy(config: any, strategy: BuildStrategy, log: (...args: any[]) => void) {\n log('应用构建策略:', strategy);\n\n // 应用完整的 Vite 配置\n if (strategy.viteConfig) {\n const { build: viteBuild, ...otherViteConfig } = strategy.viteConfig;\n\n // 合并非构建配置\n Object.keys(otherViteConfig).forEach(key => {\n if (key !== 'plugins') {\n // 跳过 plugins,避免冲突\n const configKey = key as keyof typeof config;\n const viteConfigValue = otherViteConfig[key as keyof typeof otherViteConfig];\n if (viteConfigValue && typeof viteConfigValue === 'object') {\n config[configKey] = {\n ...(config[configKey] || {}),\n ...viteConfigValue,\n };\n } else {\n config[configKey] = viteConfigValue;\n }\n }\n });\n\n // 合并构建配置\n if (viteBuild) {\n config.build = {\n ...config.build,\n ...viteBuild,\n };\n }\n }\n\n // 应用输出配置\n if (strategy.output) {\n config.build.rollupOptions.output = {\n ...config.build.rollupOptions.output,\n ...strategy.output,\n };\n }\n\n // 应用构建配置\n if (strategy.build) {\n config.build = {\n ...config.build,\n ...strategy.build,\n };\n }\n\n // 应用环境变量\n if (strategy.define) {\n config.define = {\n ...config.define,\n ...strategy.define,\n };\n }\n\n // 应用别名配置\n if (strategy.alias) {\n config.resolve = config.resolve || {};\n config.resolve.alias = {\n ...config.resolve.alias,\n ...strategy.alias,\n };\n }\n\n // 应用服务器配置\n if (strategy.server) {\n config.server = {\n ...config.server,\n ...strategy.server,\n };\n }\n\n // 应用 CSS 配置\n if (strategy.css) {\n config.css = {\n ...config.css,\n ...strategy.css,\n };\n }\n\n // 应用优化依赖配置\n if (strategy.optimizeDeps) {\n config.optimizeDeps = {\n ...config.optimizeDeps,\n ...strategy.optimizeDeps,\n };\n }\n}\n\nexport function createDevConfig(\n options: {\n entry: string;\n exclude: string[];\n },\n log: (...args: any[]) => void\n) {\n const allFiles = glob.sync(options.entry, { cwd: process.cwd() });\n const entryFiles = filterEntryFiles(allFiles, options.entry, options.exclude, log);\n\n const input: Record<string, string> = {};\n entryFiles.forEach(({ name, file }) => {\n input[name] = path.resolve(process.cwd(), file);\n });\n log('Dev input configuration:', input);\n}\n"],"mappings":"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","names":["path","fs","glob","path","path","fs","glob","simpleMatch","glob","getPageConfig","glob","options"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fchc8/vite-plugin-multi-page",
3
- "version": "1.0.5",
3
+ "version": "1.1.0",
4
4
  "description": "A Vite plugin for building multi-page applications with smart file routing",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",