import path from 'path'
|
import vue from '@vitejs/plugin-vue'
|
import { defineConfig, loadEnv } from 'vite'
|
import { buildPlugin } from 'vite-plugin-build'
|
import { globSync } from 'glob'
|
import { readFileSync, existsSync } from 'fs'
|
import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'
|
import Components from 'unplugin-vue-components/vite'
|
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
|
import VitePluginWidgetProvider from './script/plugins/vite-plugin-widget-provider'
|
import VitePluginDevelopmentFilter from './script/plugins/vite-plugin-development-filter'
|
import vitePluginImageFilter from './script/plugins/vite-plugin-image-filter'
|
import vueJsx from '@vitejs/plugin-vue-jsx'
|
import { optimizeLodashImports } from '@optimize-lodash/rollup-plugin'
|
import dayjs from 'dayjs'
|
import VueTypeImports from 'vite-plugin-vue-type-imports'
|
import svgIcon from 'vite-plugin-svgicon'
|
import { vitePluginForArco } from '@arco-plugins/vite-vue'
|
import slash from 'slash'
|
const isWin = process.platform === 'win32'
|
const isCustom = process.env.NODE_TYPE === 'custom'
|
const argvPath: string = './script/.argv'
|
const isSingleBuild = existsSync(argvPath)
|
const tag = 'information-debugger'
|
const nodeIndex = process.env.NODE_INDEX
|
const baseBuildFile = './node_modules/.cache/widgets.json'
|
|
let getWidgetNames: Array<string> = []
|
|
const vueBaseConfig = {
|
template: {
|
compilerOptions: {
|
isCustomElement: (id) => [tag].includes(id),
|
},
|
},
|
}
|
let buildWidgets: null | Record<string, any> = null
|
if (isCustom) {
|
try {
|
const isHasBuild = existsSync('.build.local')
|
if (isHasBuild) {
|
const fileContent = readFileSync('.build.local').toString('utf8')
|
if (fileContent) {
|
buildWidgets = fileContent.split('\n').filter((v) => v)
|
}
|
} else {
|
throw new Error('请先创建 .build.local文件')
|
}
|
} catch (error) {
|
console.log(error)
|
}
|
}
|
|
if (isSingleBuild) {
|
const widgetName = readFileSync(argvPath, { encoding: 'utf8' })
|
getWidgetNames.push(widgetName)
|
} else {
|
// 执行多核命令打包
|
if (nodeIndex) {
|
const widgetNameMap = require(path.resolve(process.cwd(), baseBuildFile))
|
getWidgetNames = widgetNameMap[nodeIndex]
|
if (buildWidgets) {
|
getWidgetNames = getWidgetNames.filter((widgetName) => {
|
return buildWidgets.includes(widgetName)
|
})
|
}
|
}
|
}
|
|
const library: any = getWidgetNames.map((name) => {
|
return {
|
//outDir: 'dist',
|
outDir: 'D:/Program Files/CMS Editor/host/wwwroot/widgets',//发布到指定目录中
|
target: 'ES2022',
|
mode: 'development',
|
rollupOptions: {
|
external: ['vue', 'sdk', 'vxe-table'],
|
output: {
|
globals: {
|
vue: 'Vue',
|
sdk: 'sdk',
|
},
|
},
|
},
|
lib: {
|
entry: path.join(__dirname, `./src/widgets/${name}/index.ts`),
|
name: '__importWidgets',
|
formats: ['umd'],
|
fileName: () => {
|
return isWin ? `${name}\\index.js` : `${name}/index.js`
|
},
|
},
|
}
|
})
|
//@ts-ignore
|
export default defineConfig(async ({ mode }) => {
|
const env: any = loadEnv(mode, __dirname)
|
|
return {
|
define: {
|
'process.env.VITE_STATIC_URL': `"${env?.VITE_STATIC_URL || ''}"`,
|
'process.env': process.env,
|
'window.__BUILD_TIME__': `"${dayjs().format('YYYY-MM-DD HH:mm:ss')}"`,
|
},
|
resolve: {
|
alias: {
|
'@': path.resolve(__dirname, 'src'),
|
components: path.resolve(__dirname, './src/components'),
|
sdk: path.resolve(__dirname, 'src/cms/sdk.es.js'),
|
},
|
},
|
publicDir: false,
|
plugins: [
|
svgIcon({
|
include: [slash(path.resolve('./src/assets/svg-icon/*.svg'))],
|
}),
|
VitePluginDevelopmentFilter({ tag, prodTag: 'information-prod' }),
|
|
vueJsx(vueBaseConfig.template.compilerOptions),
|
vue({
|
...vueBaseConfig,
|
// @ts-ignore
|
reactivityTransform: path.resolve(__dirname, 'src'),
|
}),
|
VueTypeImports(),
|
VitePluginWidgetProvider(),
|
cssInjectedByJsPlugin(),
|
buildPlugin({
|
fileBuild: false,
|
libBuild: {
|
buildOptions: library,
|
},
|
}),
|
Components({
|
include: [/\.vue$/, /\.vue\?vue/, /\.md$/, /\.tsx/, /\.jsx/],
|
resolvers: [
|
ElementPlusResolver({
|
importStyle: 'sass',
|
}),
|
],
|
}),
|
|
optimizeLodashImports(),
|
vitePluginForArco({
|
style: 'css',
|
}),
|
],
|
esbuild: {
|
drop: mode !== 'development' ? ['debugger' ] : [],
|
},
|
css: {
|
preprocessorOptions: {
|
scss: {
|
additionalData: `@use "@/assets/styles/element.scss" as *;`,
|
},
|
less: {
|
modifyVars: {
|
'arcoblue-6': '#f85959',
|
'--primary-6': '#5a84ff',
|
},
|
javascriptEnabled: true,
|
},
|
},
|
},
|
}
|
})
|