build.ts 2.2 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1
import fs from 'fs'
fxy060608's avatar
fxy060608 已提交
2
import path from 'path'
fxy060608's avatar
fxy060608 已提交
3
import { ConfigEnv, UserConfig } from 'vite'
fxy060608's avatar
fxy060608 已提交
4

fxy060608's avatar
fxy060608 已提交
5 6
import {
  emptyDir,
fxy060608's avatar
fxy060608 已提交
7
  isInHybridNVue,
fxy060608's avatar
fxy060608 已提交
8
  normalizePath,
fxy060608's avatar
fxy060608 已提交
9
  resolveMainPathOnce,
fxy060608's avatar
fxy060608 已提交
10
} from '@dcloudio/uni-cli-shared'
fxy060608's avatar
fxy060608 已提交
11
import { nvueOutDir } from '../utils'
fxy060608's avatar
fxy060608 已提交
12

fxy060608's avatar
fxy060608 已提交
13
export function buildOptions(
fxy060608's avatar
fxy060608 已提交
14 15 16 17
  {
    appService,
    renderer,
  }: { renderer: 'native' | undefined; appService: boolean },
fxy060608's avatar
fxy060608 已提交
18 19 20
  userConfig: UserConfig,
  _: ConfigEnv
): UserConfig['build'] {
fxy060608's avatar
fxy060608 已提交
21 22
  const inputDir = process.env.UNI_INPUT_DIR
  const outputDir = process.env.UNI_OUTPUT_DIR
fxy060608's avatar
fxy060608 已提交
23
  // 开始编译时,清空输出目录
fxy060608's avatar
fxy060608 已提交
24
  function emptyNVueDir() {
fxy060608's avatar
fxy060608 已提交
25
    const nvueOutputDir = nvueOutDir()
fxy060608's avatar
fxy060608 已提交
26 27 28
    if (fs.existsSync(nvueOutputDir)) {
      emptyDir(nvueOutputDir)
    }
fxy060608's avatar
fxy060608 已提交
29 30
  }
  function emptyOutDir() {
fxy060608's avatar
fxy060608 已提交
31 32 33
    if (fs.existsSync(outputDir)) {
      emptyDir(outputDir)
    }
fxy060608's avatar
fxy060608 已提交
34
  }
fxy060608's avatar
fxy060608 已提交
35
  if (renderer === 'native') {
fxy060608's avatar
fxy060608 已提交
36 37 38 39 40
    if (appService) {
      // 仅编译 main.js+App.vue 的时候才清空
      emptyNVueDir()
      emptyOutDir()
    }
fxy060608's avatar
fxy060608 已提交
41 42 43 44 45 46 47
  } else {
    if (isInHybridNVue(userConfig)) {
      emptyNVueDir()
    } else {
      emptyOutDir()
    }
  }
48
  return {
fxy060608's avatar
fxy060608 已提交
49 50
    // App 端目前仅提供 inline
    sourcemap: userConfig.build?.sourcemap ? 'inline' : false,
fxy060608's avatar
fxy060608 已提交
51
    emptyOutDir: false, // 不清空输出目录,否则会影响 webpack 的输出
fxy060608's avatar
fxy060608 已提交
52
    assetsInlineLimit: 0,
53
    rollupOptions: {
fxy060608's avatar
fxy060608 已提交
54
      input: resolveMainPathOnce(inputDir),
55
      output: {
fxy060608's avatar
fxy060608 已提交
56 57 58 59 60 61 62 63 64 65 66 67
        sourcemapPathTransform(relativeSourcePath, sourcemapPath) {
          const sourcePath = normalizePath(
            path.relative(
              inputDir,
              path.resolve(path.dirname(sourcemapPath), relativeSourcePath)
            )
          )
          if (sourcePath.startsWith('..')) {
            return ''
          }
          return 'uni-app:///' + sourcePath
        },
fxy060608's avatar
fxy060608 已提交
68
        manualChunks: {},
69 70
        chunkFileNames(chunk) {
          if (chunk.isDynamicEntry && chunk.facadeModuleId) {
fxy060608's avatar
fxy060608 已提交
71
            const filepath = path.relative(inputDir, chunk.facadeModuleId)
72 73 74
            return normalizePath(
              filepath.replace(path.extname(filepath), '.js')
            )
75 76 77 78
          }
          return '[name].js'
        },
        assetFileNames: '[name][extname]',
fxy060608's avatar
fxy060608 已提交
79 80
      },
    },
81
  }
fxy060608's avatar
fxy060608 已提交
82
}