vite.config.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { defineConfig } from 'vite';
  2. import vue from '@vitejs/plugin-vue';
  3. import legacy from '@vitejs/plugin-legacy';
  4. import Markdown from 'vite-plugin-md';
  5. import path from 'path';
  6. import config from './package.json';
  7. const hljs = require('highlight.js'); // https://highlightjs.org/
  8. import { compressText } from './src/sites/doc/components/demo-block/basedUtil';
  9. const resolve = path.resolve;
  10. // https://vitejs.dev/config/
  11. export default defineConfig({
  12. base: '/theme/',
  13. // assetsInclude: ['/dist/**/source/*.scss'],
  14. server: {
  15. port: 2021,
  16. host: '0.0.0.0',
  17. proxy: {
  18. '/devServer': {
  19. target: 'https://nutui.jd.com',
  20. changeOrigin: true,
  21. rewrite: (path) => path.replace(/^\/devServer/, '')
  22. }
  23. }
  24. },
  25. resolve: {
  26. alias: [{ find: '@', replacement: resolve(__dirname, './src') }]
  27. },
  28. css: {
  29. preprocessorOptions: {
  30. scss: {
  31. // example : additionalData: `@import "./src/design/styles/variables";`
  32. // dont need include file extend .scss
  33. additionalData: `@import "@/packages/styles/variables.scss";@import "@/sites/assets/styles/variables.scss";`
  34. }
  35. },
  36. postcss: {
  37. plugins: [
  38. require('autoprefixer')({
  39. overrideBrowserslist: ['> 0.5%', 'last 2 versions', 'ie > 11', 'iOS >= 10', 'Android >= 5']
  40. })
  41. ]
  42. }
  43. },
  44. plugins: [
  45. vue({
  46. include: [/\.vue$/, /\.md$/]
  47. }),
  48. Markdown({
  49. // default options passed to markdown-it
  50. // see: https://markdown-it.github.io/markdown-it/
  51. markdownItOptions: {
  52. highlight: function (str, lang) {
  53. if (lang && hljs.getLanguage(lang)) {
  54. try {
  55. return hljs.highlight(lang, str).value;
  56. } catch (__) {}
  57. }
  58. return ''; // 使用额外的默认转义
  59. }
  60. },
  61. markdownItSetup(md) {
  62. md.use(require('markdown-it-container'), 'demo', {
  63. validate: function (params) {
  64. return params.match(/^demo\s*(.*)$/);
  65. },
  66. render: function (tokens, idx) {
  67. const m = tokens[idx].info.trim().match(/^demo\s*(.*)$/);
  68. if (tokens[idx].nesting === 1) {
  69. // opening tag
  70. const contentHtml = compressText(tokens[idx + 1].content);
  71. return `<demo-block data-type="vue" data-value="${contentHtml}">` + md.utils.escapeHtml(m[1]) + '\n';
  72. } else {
  73. // closing tag
  74. return '</demo-block>\n';
  75. }
  76. }
  77. });
  78. }
  79. })
  80. // legacy({
  81. // targets: ['defaults', 'not IE 11']
  82. // })
  83. ],
  84. build: {
  85. target: 'es2015',
  86. outDir: './dist/theme/',
  87. // assetsDir: config.version,
  88. cssCodeSplit: true,
  89. rollupOptions: {
  90. input: {
  91. doc: resolve(__dirname, 'index.html'),
  92. mobile: resolve(__dirname, 'demo.html')
  93. }
  94. }
  95. }
  96. });