component.ts 1.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
import path from 'path'
import { Plugin } from 'vite'
import {
  EXTNAME_VUE,
  parseVueRequest,
  findVueComponentImports,
} from '@dcloudio/uni-cli-shared'
import MagicString from 'magic-string'
import { virtualComponentPath } from './virtual'

export function uniComponentPlugin(): Plugin {
  return {
    name: 'vite:uni-mp-component',
    async transform(code, id) {
      const { filename, query } = parseVueRequest(id)
      if (query.vue) {
        return null
      }
      if (!EXTNAME_VUE.includes(path.extname(filename))) {
        return null
      }
      const vueComponentImports = await findVueComponentImports(
        code,
        id,
        this.resolve
      )
      if (!vueComponentImports.length) {
        return null
      }
      const s = new MagicString(code)
      const rewriteImports: string[] = []
      vueComponentImports.forEach(({ n, ss, se }) => {
        s.remove(ss, se)
        rewriteImports.push(`import('${virtualComponentPath(n!)}')`)
      })
      s.prepend(`if(!Math){${rewriteImports.join(';')}}`)
      return s.toString()
    },
  }
}