/*
* @Description:
* @Version: 1.668
* @Autor: 地虎降天龙
* @Date: 2023-10-16 10:53:09
* @LastEditors: 地虎降天龙
* @LastEditTime: 2025-12-31 11:44:50
*/
// import { resolve } from 'path';
import { join, dirname } from 'path'
import { fileURLToPath } from 'url'
import { defineBuildConfig } from '@fesjs/fes'
import { templateCompilerOptions } from '@tresjs/core'
// eslint-disable-next-line import/no-unresolved
import UnoCSS from 'unocss/vite'
// eslint-disable-next-line import/no-extraneous-dependencies
import glsl from 'vite-plugin-glsl'
import federation from '@originjs/vite-plugin-federation'
import cesiumStatic from './src/common/cesiumStaticPlugin.js'
import localGisStatic from './src/common/localGisStaticPlugin.js'
import { vendoredPluginLibAliases } from './src/common/vendoredPluginLibAliases.js'
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const timeStamp = new Date().getTime()
const combinedIsCustomElement = (tag) => tag.startsWith('iconify-icon') || templateCompilerOptions.template.compilerOptions.isCustomElement(tag)
export default defineBuildConfig({
mountElementId: 'tvt-app',
title: 'TvT.js',
publicPath: './', // './' 若在线部署用于生产环境 且 是使用qiankun微前端时,需要配置base为主应用地址 https://cos.icegl.cn/qiankun/tvt/
access: {
roles: {
admin: ['*'],
manager: ['/'],
},
},
layout: {
navigation: null,
},
enums: {
status: [
['0', '无效的'],
['1', '有效的'],
],
},
qiankun: {
micro: {
useDevMode: true,
},
},
//add by 地虎降天龙
viteVuePlugin: {
template: {
compilerOptions: {
isCustomElement: (tag) => combinedIsCustomElement(tag),
},
},
},
viteOption: {
plugins: [
UnoCSS({
/* options */
}),
glsl({
warnDuplicatedImports: false, // 禁用重复导入警告
}),
federation({
name: 'tvt-host',
remotes: {
home: {
// 必须默认引用一个 不然会报错:ReferenceError: __rf_placeholder__shareScope is not defined
external: `Promise.resolve('https://dcser.icegl.cn/assets/remoteEntry.js')`,
externalType: "promise"
}
},
shared: {
vue: {},
three: { version: '0.180.0' },
// "@tresjs/cientos": { version: '5.2.0' },
// "@tresjs/core": { version: '5.2.0' },
// three: { import: false, generate: false }
}
// 票27:cesium 不进 shared —— 远程不需要它,且体积大、CESIUM_BASE_URL 是进程级单例。
}),
// 票27:把 cesium 预构建静态资源接到 /cesium/(dev 中间件 + build 拷贝)。
cesiumStatic(),
// 票21:把本机/甲方的 GIS 目录(DEM、影像切片)挂成静态路径,目录由 .env.local 的
// COCKPIT_GIS_MOUNTS 给;没配就什么也不挂,别的机器照常跑。
localGisStatic()
],
build: {
target: 'esnext', // 或者 'es2020' 以支持 BigInt
chunkSizeWarningLimit: 1000, // 单位为KB
rollupOptions: {
output: {
minifyInternalExports: false,
manualChunks: {
three: ['three'],
'3d-tiles-renderer': ['3d-tiles-renderer'],
cesium: ['cesium'], // 票27:引擎单独分包
},
// manualChunks (id) {
// // 自定义拆分策略,例如将特定的第三方库拆分为单独的 chunk
// if (id.includes('node_modules')) {
// const texts = id.toString().split('node_modules/')[1].split('/')[0]
// // if (texts) {
// // console.log(id.toString(), texts)
// // }
// return texts
// }
// },
format: 'es',
chunkFileNames: `js/[name].[hash]${timeStamp}.js`,
entryFileNames: `js/[name].[hash]${timeStamp}.js`,
assetFileNames: `[ext]/[name].[hash]${timeStamp}.[ext]`,
name: 'TvT.js',
},
},
sourcemap: false,
minify: 'terser',
},
// 全局 css 注册
css: {
preprocessorOptions: {
scss: {
// javascriptEnabled: true,
// additionalData: `@import "src/plugins/goView/lib/scss/style.scss";`,
additionalData: (content, filename) => {
if (filename.includes('src/plugins/goView') || filename.includes('src/plugins/zone3Deditor')) {
return `@import "src/plugins/goView/lib/scss/style.scss";\n${content}`
}
return content
}
},
},
},
server: {
headers: {
'Access-Control-Allow-Origin': '*',
},
host: '0.0.0.0',
// 票26:面板与 DSH 的原子写临时文件在 Windows 上都会让 chokidar 抛 EBUSY 击穿 dev server。
// `**/.scratch/**` → issue tracker 面板保存单据时的 .tmpdir 原子写
// `**/.dsh-*` → DSH 每次编辑文件时在项目根生成的 .dsh-edit-review.json...tmpdir
// `**/*.tmpdir/**` → 票27 实测:同一类原子写临时目录这次落在**源码目录旁**
// (src/modules/cockpit/components/.MapCanvas.vue...tmpdir),
// 前两条都盖不住,pre.dev.one 首次启动被击穿。按模式排除,别只堵已知的那一个路径。
// Vite 内部默认 ignore(node_modules/.git/cacheDir 等)与此合并而非覆盖,见 vite resolveChokidarOptions。
watch: {
// 目录本身与目录内容要分别盖住:chokidar 对目录条目的匹配和对其内容的匹配是两条判断,
// 只写 `**/*.tmpdir/**` 时那个目录本身仍会被进入,读它时照样 EBUSY。
ignored: ['**/.scratch/**', '**/.dsh-*', '**/*.tmpdir', '**/*.tmpdir/**'],
},
proxy: {
'/resource.cos': {
target: 'https://opensource.cdn.icegl.cn',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/resource.cos/, ''),
},
// 天地图本地代理
'/tianditu.map': {
target: 'https://t0.tianditu.gov.cn/',
changeOrigin: true,
headers: {
Origin: 'opensource.icegl.cn',
Referer: 'http://opensource.icegl.cn',
},
rewrite: (path) => path.replace(/^\/tianditu.map/, ''),
}
},
},
},
alias: {
// 插件自带的依赖副本(src/plugins/<插件>/lib/<包>)指回插件内部:
// useThreeGeospatial 用的 @takram/three-3d-tiles-support 等包没有发布到 npm,
// 不映射的话 yarn build 会直接在这些 import 上失败。
...vendoredPluginLibAliases(join(__dirname, './src/plugins'), join(__dirname, './node_modules')),
PLS: join(__dirname, './src/plugins'),
},
// { find: 'pls', replacement: resolve(__dirname, './src/plugins') },
// { '@': join(__dirname, '/src') }
})