vite.config.build.taro.vue.disperse.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { defineConfig } from 'vite';
  2. import dts from 'vite-plugin-dts';
  3. import vue from '@vitejs/plugin-vue';
  4. import path from 'path';
  5. const fs = require('fs-extra');
  6. import config from './package.json';
  7. import configPkg from './src/config.json';
  8. import { terser } from 'rollup-plugin-terser';
  9. const banner = `/*!
  10. * ${config.name} v${config.version} ${new Date()}
  11. * (c) 2022 @jdf2e.
  12. * Released under the MIT License.
  13. */`;
  14. let input = {};
  15. configPkg.nav.map((item) => {
  16. item.packages.forEach((element) => {
  17. let { name } = element;
  18. const filePath = path.join(`./src/packages/__VUE/${name.toLowerCase()}/index.taro.vue`);
  19. input[name] = `./src/packages/__VUE/${name.toLowerCase()}/index${fs.existsSync(filePath) ? '.taro' : ''}.vue`;
  20. });
  21. });
  22. export default defineConfig({
  23. resolve: {
  24. alias: [{ find: '@', replacement: path.resolve(__dirname, './src') }]
  25. },
  26. plugins: [
  27. vue(),
  28. dts({
  29. insertTypesEntry: true,
  30. copyDtsFiles: false,
  31. cleanVueFileName: false,
  32. outputDir: path.resolve(__dirname, './dist/types'),
  33. include: path.resolve(__dirname, './src/packages/__VUE'),
  34. beforeWriteFile: (filePath: string, content: string) => {
  35. const fileContent = `import { App, PropType, CSSProperties } from 'vue';
  36. declare type Install<T> = T & {
  37. install(app: App): void;
  38. };
  39. `;
  40. const start = 'declare const _sfc_main:';
  41. const end = ';\nexport default _sfc_main;\n';
  42. let name = Object.keys(input).find((item: string) => item.toLowerCase() === filePath.split('/').slice(-2)[0]);
  43. name = name ? name.toLowerCase() : ' ';
  44. const remain = `
  45. declare module 'vue' {
  46. interface GlobalComponents {
  47. Nut${name[0].toUpperCase() + name.substr(1)}: typeof _sfc_main;
  48. }
  49. }
  50. `;
  51. const inputs = content.match(RegExp(`${start}([\\s\\S]*?)${end}`));
  52. const changeContent = inputs && inputs.length ? `${start} Install<${inputs[1]}>${end}${remain}` : content;
  53. return {
  54. filePath,
  55. content: fileContent + changeContent
  56. };
  57. }
  58. })
  59. ],
  60. build: {
  61. minify: false,
  62. lib: {
  63. entry: '',
  64. name: 'index',
  65. // fileName: (format) => format,
  66. formats: ['es']
  67. },
  68. rollupOptions: {
  69. // 请确保外部化那些你的库中不需要的依赖
  70. external: ['vue', 'vue-router', '@tarojs/taro', '@/packages/locale'],
  71. input,
  72. output: {
  73. banner,
  74. paths: {
  75. '@/packages/locale': '../locale/lang'
  76. },
  77. dir: path.resolve(__dirname, './dist/packages/_es'),
  78. entryFileNames: '[name].js',
  79. plugins: [
  80. terser({
  81. compress: {
  82. drop_console: true,
  83. drop_debugger: true
  84. }
  85. })
  86. ]
  87. }
  88. },
  89. emptyOutDir: false
  90. }
  91. });