renderjs.ts 1.1 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
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 41 42 43
import debug from 'debug'
import { Plugin } from 'vite'
import { rewriteDefault } from '@vue/compiler-sfc'

import { missingModuleName, parseRenderjs } from '@dcloudio/uni-cli-shared'

const debugRenderjs = debug('vite:uni:renderjs')

export function uniRenderjsPlugin(): Plugin {
  return {
    name: 'vite:uni-h5-renderjs',
    transform(code, id) {
      const { type, name } = parseRenderjs(id)
      if (!type) {
        return
      }
      debugRenderjs(id)
      if (!name) {
        this.error(missingModuleName(type, code))
      }
      return `${rewriteDefault(
        code.replace(/module\.exports\s*=/, 'export default '),
        '_sfc_' + type
      )}
${type === 'renderjs' ? genRenderjsCode(name) : genWxsCode(name)}`
    },
  }
}

function genRenderjsCode(name: string) {
  return `export default Comp => {
  if(!Comp.mixins){Comp.mixins = []}
  Comp.mixins.push({beforeCreate(){ this['${name}'] = this }})
  Comp.mixins.push(_sfc_renderjs)
}`
}

function genWxsCode(name: string) {
  return `export default Comp => {
  if(!Comp.mixins){Comp.mixins = []}
  Comp.mixins.push({beforeCreate(){ this['${name}'] = _sfc_wxs }})
}`
}