2025-12-03 12:00:46 +08:00
|
|
|
|
import { defineConfig } from 'vite';
|
|
|
|
|
|
import dts from 'vite-plugin-dts';
|
|
|
|
|
|
import { resolve } from 'path';
|
|
|
|
|
|
import cssInjectedByJs from 'vite-plugin-css-injected-by-js';
|
2026-02-28 11:26:59 +08:00
|
|
|
|
import pkg from './package.json';
|
2026-04-21 15:07:36 +08:00
|
|
|
|
import type { Plugin } from 'rollup';
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 修复 webpack 5 / Next.js 兼容性问题
|
|
|
|
|
|
*
|
|
|
|
|
|
* Vite 在 lib 模式下构建 ESM 产物时,会将内联的 data URL 资源包装为
|
|
|
|
|
|
* `new URL("data:...", import.meta.url).href` 格式。
|
|
|
|
|
|
*
|
|
|
|
|
|
* 当 Next.js 14 (webpack 5) 消费这个 ESM 产物时,webpack 5 的 asset module
|
|
|
|
|
|
* 系统会尝试处理 `new URL(..., import.meta.url)`,但 Next.js 内部的默认规则
|
|
|
|
|
|
* 对 `asset/inline` 类型配置了不兼容的 `filename` generator,导致 schema
|
|
|
|
|
|
* validation 报错:
|
|
|
|
|
|
* "generator has an unknown property 'filename'. These properties are valid:
|
|
|
|
|
|
* object { dataUrl? }"
|
|
|
|
|
|
*
|
|
|
|
|
|
* 此插件在输出阶段将 `new URL("data:...", import.meta.url).href` 替换为直接的
|
|
|
|
|
|
* data URL 字符串,避免触发 webpack 的 asset module 处理逻辑。
|
|
|
|
|
|
*
|
|
|
|
|
|
* data URL 本身是绝对的,不需要 import.meta.url 作为 base,因此这种替换是安全的。
|
|
|
|
|
|
*/
|
2026-04-21 15:07:49 +08:00
|
|
|
|
// const fixWebpack5CompatPlugin = (): Plugin => ({
|
|
|
|
|
|
// name: 'fix-webpack5-compat',
|
|
|
|
|
|
// renderChunk(code) {
|
|
|
|
|
|
// // 匹配 new URL("data:...", import.meta.url).href 或 new URL('data:...', import.meta.url).href
|
|
|
|
|
|
// const fixed = code.replace(
|
|
|
|
|
|
// /new URL\(["'](data:[^"']+)["'],\s*import\.meta\.url\)\.href/g,
|
|
|
|
|
|
// '"$1"'
|
|
|
|
|
|
// );
|
|
|
|
|
|
// if (fixed !== code) {
|
|
|
|
|
|
// console.log('[fix-webpack5-compat] Replaced new URL(data:..., import.meta.url) with direct data URL');
|
|
|
|
|
|
// }
|
|
|
|
|
|
// return {
|
|
|
|
|
|
// code: fixed,
|
|
|
|
|
|
// map: null,
|
|
|
|
|
|
// };
|
|
|
|
|
|
// },
|
|
|
|
|
|
// });
|
2025-12-03 12:00:46 +08:00
|
|
|
|
|
2025-12-16 11:57:44 +08:00
|
|
|
|
export default defineConfig(() => {
|
2025-12-03 12:00:46 +08:00
|
|
|
|
return {
|
|
|
|
|
|
plugins: [
|
|
|
|
|
|
// 移除 Vue 插件
|
|
|
|
|
|
dts({
|
|
|
|
|
|
include: ['src'],
|
2025-12-04 18:39:07 +08:00
|
|
|
|
exclude: [
|
2025-12-16 11:57:44 +08:00
|
|
|
|
'src/**/*.es.js',
|
2025-12-04 18:39:07 +08:00
|
|
|
|
'**/*.es.js'
|
2026-01-22 11:29:51 +08:00
|
|
|
|
],
|
2026-01-28 12:00:55 +08:00
|
|
|
|
rollupTypes: false,
|
2025-12-04 18:39:07 +08:00
|
|
|
|
logLevel: 'warn', // 只显示警告和错误
|
2025-12-03 12:00:46 +08:00
|
|
|
|
}),
|
|
|
|
|
|
cssInjectedByJs()
|
|
|
|
|
|
],
|
2025-12-04 18:39:07 +08:00
|
|
|
|
// 开发服务器配置
|
|
|
|
|
|
server: {
|
|
|
|
|
|
port: 3000,
|
2026-02-04 18:20:30 +08:00
|
|
|
|
host: '0.0.0.0',
|
|
|
|
|
|
open: '/demo/index.html',
|
|
|
|
|
|
allowedHosts: true,
|
2025-12-04 18:39:07 +08:00
|
|
|
|
},
|
2026-02-28 11:26:59 +08:00
|
|
|
|
define: {
|
|
|
|
|
|
__APP_VERSION__: JSON.stringify(pkg.version),
|
|
|
|
|
|
},
|
2025-12-03 12:00:46 +08:00
|
|
|
|
build: {
|
|
|
|
|
|
lib: {
|
|
|
|
|
|
entry: resolve(__dirname, 'src/index.ts'),
|
2026-01-22 11:29:51 +08:00
|
|
|
|
name: 'IflowEngine',
|
|
|
|
|
|
fileName: (format) => `iflow-engine.${format}.js`,
|
2025-12-03 12:00:46 +08:00
|
|
|
|
},
|
|
|
|
|
|
rollupOptions: {
|
2026-03-26 09:34:21 +08:00
|
|
|
|
external: ['opentype.js'],
|
2025-12-03 12:00:46 +08:00
|
|
|
|
output: {
|
2026-03-26 09:34:21 +08:00
|
|
|
|
globals: {
|
|
|
|
|
|
'opentype.js': '{}',
|
|
|
|
|
|
},
|
2026-01-15 16:46:53 +08:00
|
|
|
|
// 禁用代码分割,将所有代码打包到一个文件
|
|
|
|
|
|
inlineDynamicImports: true,
|
2025-12-03 12:00:46 +08:00
|
|
|
|
},
|
2026-04-21 15:07:49 +08:00
|
|
|
|
// plugins: [
|
|
|
|
|
|
// fixWebpack5CompatPlugin(),
|
|
|
|
|
|
// ],
|
2025-12-03 12:00:46 +08:00
|
|
|
|
},
|
|
|
|
|
|
sourcemap: true,
|
|
|
|
|
|
emptyOutDir: true,
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
2025-12-16 11:57:44 +08:00
|
|
|
|
});
|