mainJs.ts 1.8 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1 2
import {
  defineUniMainJsPlugin,
3
  PAGES_JSON_JS,
fxy060608's avatar
fxy060608 已提交
4 5 6
  parseProgram,
  transformDynamicImports,
  updateMiniProgramGlobalComponents,
7
  withSourcemap,
fxy060608's avatar
fxy060608 已提交
8
} from '@dcloudio/uni-cli-shared'
fxy060608's avatar
fxy060608 已提交
9
import type { SFCScriptCompileOptions } from '@vue/compiler-sfc'
fxy060608's avatar
fxy060608 已提交
10
import { dynamicImport } from './usingComponents'
fxy060608's avatar
fxy060608 已提交
11

fxy060608's avatar
fxy060608 已提交
12
export function uniMainJsPlugin(
13 14 15 16
  options: {
    normalizeComponentName?: (name: string) => string
    babelParserPlugins?: SFCScriptCompileOptions['babelParserPlugins']
  } = {}
fxy060608's avatar
fxy060608 已提交
17
) {
18 19
  const normalizeComponentName =
    options.normalizeComponentName || ((name: string) => name)
fxy060608's avatar
fxy060608 已提交
20 21
  return defineUniMainJsPlugin((opts) => {
    return {
fxy060608's avatar
fxy060608 已提交
22
      name: 'uni:mp-main-js',
fxy060608's avatar
fxy060608 已提交
23
      enforce: 'pre',
fxy060608's avatar
fxy060608 已提交
24
      async transform(source, id) {
fxy060608's avatar
fxy060608 已提交
25
        if (opts.filter(id)) {
fxy060608's avatar
fxy060608 已提交
26 27 28 29 30
          source = source.includes('createSSRApp')
            ? createApp(source)
            : createLegacyApp(source)

          const inputDir = process.env.UNI_INPUT_DIR
fxy060608's avatar
fxy060608 已提交
31
          const { imports } = await updateMiniProgramGlobalComponents(
fxy060608's avatar
fxy060608 已提交
32
            id,
fxy060608's avatar
fxy060608 已提交
33 34 35
            parseProgram(source, id, {
              babelParserPlugins: options.babelParserPlugins,
            }),
fxy060608's avatar
fxy060608 已提交
36
            {
fxy060608's avatar
fxy060608 已提交
37
              inputDir,
fxy060608's avatar
fxy060608 已提交
38
              resolve: this.resolve,
39
              normalizeComponentName,
fxy060608's avatar
fxy060608 已提交
40 41
            }
          )
fxy060608's avatar
fxy060608 已提交
42 43
          const { code, map } = await transformDynamicImports(source, imports, {
            id,
44
            sourceMap: withSourcemap(opts.resolvedConfig),
fxy060608's avatar
fxy060608 已提交
45 46
            dynamicImport,
          })
fxy060608's avatar
fxy060608 已提交
47
          return {
fxy060608's avatar
fxy060608 已提交
48
            code:
fxy060608's avatar
fxy060608 已提交
49
              `import '\0plugin-vue:export-helper';import 'uni-mp-runtime';import './${PAGES_JSON_JS}';` +
fxy060608's avatar
fxy060608 已提交
50 51
              code,
            map,
fxy060608's avatar
fxy060608 已提交
52 53 54 55 56 57 58 59
          }
        }
      },
    }
  })
}

function createApp(code: string) {
fxy060608's avatar
fxy060608 已提交
60
  return `${code};createApp().app.mount("#app");`
fxy060608's avatar
fxy060608 已提交
61 62 63
}

function createLegacyApp(code: string) {
fxy060608's avatar
fxy060608 已提交
64
  return code
fxy060608's avatar
fxy060608 已提交
65
}