import { join } from 'path'; import { get } from 'lodash-es'; import { createRequire } from 'module'; import hljs from 'highlight.js'; import vitePluginMd from 'vite-plugin-md'; import vitePluginVue from '@vitejs/plugin-vue'; import vitePluginJsx from '@vitejs/plugin-vue-jsx'; import { setBuildTarget, getVantConfig, isDev } from '../common/index.js'; import { SITE_DIST_DIR, SITE_MOBILE_SHARED_FILE, SITE_DESKTOP_SHARED_FILE, SITE_SRC_DIR, } from '../common/constant.js'; import { injectHtml } from 'vite-plugin-html'; import type { InlineConfig } from 'vite'; import type MarkdownIt from 'markdown-it'; function markdownHighlight(str: string, lang: string) { if (lang && hljs.getLanguage(lang)) { // https://github.com/highlightjs/highlight.js/issues/2277 return hljs.highlight(str, { language: lang, ignoreIllegals: true }).value; } return ''; } function markdownCardWrapper(htmlCode: string) { const group = htmlCode .replace(/

{ if (fragment.indexOf('${fragment}`; } return fragment; }) .join(''); } // add target="_blank" to all links function markdownLinkOpen(md: MarkdownIt) { const defaultRender = md.renderer.rules.link_open; md.renderer.rules.link_open = (tokens, idx, options, env, self) => { const aIndex = tokens[idx].attrIndex('target'); if (aIndex < 0) { tokens[idx].attrPush(['target', '_blank']); // add new attribute } if (defaultRender) { return defaultRender(tokens, idx, options, env, self); } return self.renderToken(tokens, idx, options); }; } function getSiteConfig(vantConfig: any) { const siteConfig = vantConfig.site; if (siteConfig.locales) { return siteConfig.locales[siteConfig.defaultLang || 'en-US']; } return siteConfig; } function getTitle(config: { title: string; description?: string }) { let { title } = config; if (config.description) { title += ` - ${config.description}`; } return title; } function getHTMLMeta(vantConfig: any) { const meta = get(vantConfig, 'site.htmlMeta'); if (meta) { return Object.keys(meta) .map((key) => ``) .join('\n'); } return ''; } export function getViteConfigForSiteDev(): InlineConfig { setBuildTarget('site'); const vantConfig = getVantConfig(); const siteConfig = getSiteConfig(vantConfig); const title = getTitle(siteConfig); const baiduAnalytics = get(vantConfig, 'site.baiduAnalytics'); const enableVConsole = isDev() && get(vantConfig, 'site.enableVConsole'); return { root: SITE_SRC_DIR, plugins: [ vitePluginVue({ include: [/\.vue$/, /\.md$/], }), vitePluginMd({ wrapperClasses: 'van-doc-markdown-body', transforms: { after: markdownCardWrapper, }, markdownItOptions: { typographer: false, // https://markdown-it.github.io/markdown-it/#MarkdownIt highlight: markdownHighlight, }, markdownItSetup(md: MarkdownIt) { const require = createRequire(import.meta.url); const { slugify } = require('transliteration'); const markdownItAnchor = require('markdown-it-anchor'); markdownLinkOpen(md); md.use(markdownItAnchor, { level: 2, slugify, }); }, }), vitePluginJsx(), injectHtml({ data: { ...siteConfig, title, baiduAnalytics, enableVConsole, meta: getHTMLMeta(vantConfig), }, }), ], resolve: { alias: { 'site-mobile-shared': SITE_MOBILE_SHARED_FILE, 'site-desktop-shared': SITE_DESKTOP_SHARED_FILE, }, }, server: { host: '0.0.0.0', }, }; } export function getViteConfigForSiteProd(): InlineConfig { const devConfig = getViteConfigForSiteDev(); const vantConfig = getVantConfig(); const outDir = get(vantConfig, 'build.site.outputDir', SITE_DIST_DIR); const publicPath = get(vantConfig, 'build.site.publicPath', '/'); return { ...devConfig, base: publicPath, build: { outDir, brotliSize: false, emptyOutDir: true, // https://github.com/youzan/vant/issues/9703 cssTarget: ['chrome53'], rollupOptions: { input: { main: join(SITE_SRC_DIR, 'index.html'), mobile: join(SITE_SRC_DIR, 'mobile.html'), }, output: { manualChunks: { 'vue-libs': ['vue', 'vue-router'], }, }, }, }, }; }