114 lines
3.9 KiB
JavaScript
114 lines
3.9 KiB
JavaScript
import { defineConfig } from 'vite'
|
|
import vue from '@vitejs/plugin-vue'
|
|
import { resolve } from 'path'
|
|
import { batiaoPlugin } from '@batiao/batiao-sdk-vue-vite/onBuild'
|
|
import proxy from './src/proxy.cjs'
|
|
import fs from 'fs'
|
|
import axios from 'axios'
|
|
|
|
const copyPublicPlugin = () => {
|
|
return {
|
|
name: 'copy-src-public',
|
|
closeBundle() {
|
|
const srcDir = resolve(__dirname, 'src/public')
|
|
const destDir = resolve(__dirname, 'dist/src/public')
|
|
try {
|
|
if (fs.existsSync(srcDir)) {
|
|
fs.mkdirSync(destDir, { recursive: true })
|
|
fs.cpSync(srcDir, destDir, { recursive: true })
|
|
console.log('[copy-src-public] 成功将 src/public 复制到 dist/src/public')
|
|
}
|
|
} catch (err) {
|
|
console.error('[copy-src-public] 复制失败:', err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
const seoInjectionPlugin = () => {
|
|
return {
|
|
name: 'seo-injection',
|
|
async transformIndexHtml(html, ctx) {
|
|
if (ctx.originalUrl && ctx.originalUrl.includes('/article-detail')) {
|
|
const urlObj = new URL(ctx.originalUrl, 'http://localhost')
|
|
const id = urlObj.searchParams.get('id')
|
|
if (id) {
|
|
try {
|
|
const res = await axios.get(`http://wechat.wenyitu.com/api/articles/${id}`)
|
|
const article = res.data
|
|
if (article) {
|
|
let newHtml = html
|
|
if (article.title) {
|
|
newHtml = newHtml.replace(/<title>.*?<\/title>/, `<title>${article.title} - 装样大师</title>`)
|
|
}
|
|
if (article.seo_keywords) {
|
|
newHtml = newHtml.replace(/<meta name="keywords" content="[^"]*"/, `<meta name="keywords" content="${article.seo_keywords}"`)
|
|
}
|
|
if (article.seo_description) {
|
|
newHtml = newHtml.replace(/<meta name="description" content="[^"]*"/, `<meta name="description" content="${article.seo_description}"`)
|
|
}
|
|
return newHtml
|
|
}
|
|
} catch (e) {
|
|
console.error('[seo-injection] 获取详情失败:', e.message)
|
|
}
|
|
}
|
|
} else if (ctx.originalUrl && ctx.originalUrl.includes('/article') && ctx.originalUrl.includes('category_id=')) {
|
|
const urlObj = new URL(ctx.originalUrl, 'http://localhost')
|
|
const categoryId = urlObj.searchParams.get('category_id')
|
|
if (categoryId) {
|
|
try {
|
|
const res = await axios.get(`http://wechat.wenyitu.com/api/articles?category_id=${categoryId}&page=1&per_page=10`)
|
|
const data = res.data
|
|
if (data && data.items && data.items.length > 0 && data.items[0].category) {
|
|
let newHtml = html
|
|
const category = data.items[0].category
|
|
if (category.seo_keywords) {
|
|
newHtml = newHtml.replace(/<meta name="keywords" content="[^"]*"/, `<meta name="keywords" content="${category.seo_keywords}"`)
|
|
}
|
|
if (category.seo_description) {
|
|
newHtml = newHtml.replace(/<meta name="description" content="[^"]*"/, `<meta name="description" content="${category.seo_description}"`)
|
|
}
|
|
return newHtml
|
|
}
|
|
} catch (e) {
|
|
console.error('[seo-injection] 获取列表分类失败:', e.message)
|
|
}
|
|
}
|
|
}
|
|
return html
|
|
}
|
|
}
|
|
}
|
|
|
|
export default defineConfig({
|
|
plugins: [vue(), batiaoPlugin(), copyPublicPlugin(), seoInjectionPlugin()],
|
|
css: {
|
|
preprocessorOptions: {
|
|
scss: {
|
|
api: 'modern-compiler'
|
|
}
|
|
}
|
|
},
|
|
resolve: {
|
|
alias: {
|
|
'@': resolve(__dirname, 'src')
|
|
}
|
|
},
|
|
build: {
|
|
chunkSizeWarningLimit: 2000,
|
|
rollupOptions: {
|
|
onwarn(warning, warn) {
|
|
if (warning.code === 'UNRESOLVED_IMPORT' || warning.code === 'UNUSED_EXTERNAL_IMPORT') return;
|
|
warn(warning);
|
|
}
|
|
}
|
|
},
|
|
server: {
|
|
//通过电脑ip访问设置
|
|
host: '0.0.0.0',
|
|
port: 3000,
|
|
proxy
|
|
}
|
|
})
|