index.ts 2.4 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1
import path from 'path'
fxy060608's avatar
fxy060608 已提交
2
import {
fxy060608's avatar
fxy060608 已提交
3
  createTransformTag,
fxy060608's avatar
fxy060608 已提交
4 5 6 7 8 9 10
  dynamicImportPolyfill,
  normalizePath,
  parseVueRequest,
  removeExt,
  resolveMainPathOnce,
} from '@dcloudio/uni-cli-shared'
import { PreRenderedChunk } from 'rollup'
fxy060608's avatar
fxy060608 已提交
11
import { Plugin } from 'vite'
fxy060608's avatar
fxy060608 已提交
12
import { nvueOutDir } from '../../utils'
fxy060608's avatar
fxy060608 已提交
13 14 15
import { transformRenderWhole } from './transforms/transformRenderWhole'
import { transformAppendAsTree } from './transforms/transformAppendAsTree'
import { transformVideo } from './transforms/transformVideo'
fxy060608's avatar
fxy060608 已提交
16
import { transformText } from './transforms/transformText'
fxy060608's avatar
fxy060608 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30
const uTags = {
  text: 'u-text',
  image: 'u-image',
  input: 'u-input',
  textarea: 'u-textarea',
  video: 'u-video',
  'web-view': 'u-web-view',
  slider: 'u-slider',
}

export function initNVueNodeTransforms() {
  // 优先级必须确保 renderWhole > appendAsTree
  return [
    createTransformTag(uTags),
fxy060608's avatar
fxy060608 已提交
31
    transformText,
fxy060608's avatar
fxy060608 已提交
32 33 34 35 36 37
    transformVideo,
    transformRenderWhole,
    transformAppendAsTree,
  ]
}

fxy060608's avatar
fxy060608 已提交
38
export function uniAppNVuePlugin(): Plugin {
fxy060608's avatar
fxy060608 已提交
39
  return {
fxy060608's avatar
fxy060608 已提交
40
    name: 'uni:app-nvue',
fxy060608's avatar
fxy060608 已提交
41
    config() {
fxy060608's avatar
fxy060608 已提交
42 43
      const inputDir = process.env.UNI_INPUT_DIR
      const mainPath = resolveMainPathOnce(inputDir)
fxy060608's avatar
fxy060608 已提交
44
      return {
fxy060608's avatar
fxy060608 已提交
45 46 47 48 49 50
        lib: {
          // 必须使用 lib 模式,否则会生成 preload 等代码
          fileName: 'main.js',
          entry: mainPath,
          formats: ['esm'],
        },
fxy060608's avatar
fxy060608 已提交
51
        build: {
fxy060608's avatar
fxy060608 已提交
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
          outDir: nvueOutDir(),
          rollupOptions: {
            input: {
              main: mainPath,
            },
            output: {
              entryFileNames(chunk) {
                if (chunk.name === 'main') {
                  return 'app.js'
                }
                return chunk.name + '.js'
              },
              format: 'esm',
              assetFileNames: '[name][extname]',
              chunkFileNames: createChunkFileNames(inputDir),
              plugins: [dynamicImportPolyfill()],
            },
          },
fxy060608's avatar
fxy060608 已提交
70 71 72 73 74
        },
      }
    },
  }
}
fxy060608's avatar
fxy060608 已提交
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

function createChunkFileNames(
  inputDir: string
): (chunkInfo: PreRenderedChunk) => string {
  return function chunkFileNames(chunk) {
    if (chunk.isDynamicEntry && chunk.facadeModuleId) {
      const { filename } = parseVueRequest(chunk.facadeModuleId)
      if (filename.endsWith('.nvue')) {
        return (
          removeExt(normalizePath(path.relative(inputDir, filename))) + '.js'
        )
      }
    }
    return '[name].js'
  }
}