url.ts 2.0 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1
import path from 'path'
fxy060608's avatar
fxy060608 已提交
2 3 4 5 6
import {
  EXTNAME_JS_RE,
  EXTNAME_VUE,
  UNI_MODULES_EXPORTS,
} from '../../constants'
fxy060608's avatar
fxy060608 已提交
7 8 9 10 11 12 13 14 15 16 17 18

export interface VueQuery {
  vue?: boolean
  src?: boolean
  type?: 'script' | 'template' | 'style' | 'custom'
  index?: number
  lang?: string
  raw?: boolean
}

export function parseVueRequest(id: string) {
  const [filename, rawQuery] = id.split(`?`, 2)
19
  const query = Object.fromEntries(new URLSearchParams(rawQuery)) as VueQuery
fxy060608's avatar
fxy060608 已提交
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
  if (query.vue != null) {
    query.vue = true
  }
  if (query.src != null) {
    query.src = true
  }
  if (query.index != null) {
    query.index = Number(query.index)
  }
  if (query.raw != null) {
    query.raw = true
  }
  return {
    filename,
    query,
  }
}
fxy060608's avatar
fxy060608 已提交
37

fxy060608's avatar
fxy060608 已提交
38
const importQueryRE = /(\?|&)import=?(?:&|$)/
fxy060608's avatar
fxy060608 已提交
39 40
export const isImportRequest = (url: string) => importQueryRE.test(url)

fxy060608's avatar
fxy060608 已提交
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
/**
 * Prefix for resolved fs paths, since windows paths may not be valid as URLs.
 */
export const FS_PREFIX = `/@fs/`

/**
 * Prefix for resolved Ids that are not valid browser import specifiers
 */
export const VALID_ID_PREFIX = `/@id/`
export const CLIENT_PUBLIC_PATH = `/@vite/client`
export const ENV_PUBLIC_PATH = `/@vite/env`
const internalPrefixes = [
  FS_PREFIX,
  VALID_ID_PREFIX,
  CLIENT_PUBLIC_PATH,
  ENV_PUBLIC_PATH,
]
const InternalPrefixRE = new RegExp(`^(?:${internalPrefixes.join('|')})`)
export const isInternalRequest = (url: string): boolean =>
  InternalPrefixRE.test(url)

fxy060608's avatar
fxy060608 已提交
62 63 64 65 66
export const queryRE = /\?.*$/
export const hashRE = /#.*$/

export const cleanUrl = (url: string) =>
  url.replace(hashRE, '').replace(queryRE, '')
fxy060608's avatar
fxy060608 已提交
67 68

export function isJsFile(id: string) {
fxy060608's avatar
fxy060608 已提交
69 70 71 72
  // inject 使用了isJsFile 判断。uni_modules_exports 中注入使用了 uni,在小程序平台,inject 需要注入 uni 对象
  if (id === UNI_MODULES_EXPORTS) {
    return true
  }
fxy060608's avatar
fxy060608 已提交
73 74 75 76 77 78 79 80 81 82 83
  const isJs = EXTNAME_JS_RE.test(id)
  if (isJs) {
    return true
  }
  const { filename, query } = parseVueRequest(id)
  const isVueJs = EXTNAME_VUE.includes(path.extname(filename)) && !query.vue
  if (isVueJs) {
    return true
  }
  return false
}