提交 2efa2ca2 编写于 作者: fxy060608's avatar fxy060608

feat(h5): add uni.plugin.js

上级 60b42e78
/**
* @type {import('vite').Plugin}
*/
const UniH5Plugin = {
name: 'vite:uni-h5',
uni: {
transformEvent: {
tap: 'click',
},
},
}
module.exports = UniH5Plugin
......@@ -30,5 +30,9 @@
"peerDependencies": {
"@vue/shared": "^3.1.0-beta.3",
"vue-router": "^4.0.8"
},
"uni-app": {
"name": "uni-h5",
"apply": "h5"
}
}
......@@ -25,7 +25,8 @@ function normalizeInputDir(config: UserConfig) {
return process.env.UNI_INPUT_DIR || path.resolve(normalizeRoot(config), 'src')
}
export function createConfig(
options: VitePluginUniResolvedOptions
options: VitePluginUniResolvedOptions,
uniPlugins: Plugin[]
): Plugin['config'] {
return (config, env) => {
options.command = env.command
......@@ -40,7 +41,7 @@ export function createConfig(
base = '/'
}
options.base = base!
options.vueOptions = initPluginVueOptions(options)
options.vueOptions = initPluginVueOptions(options, uniPlugins)
options.vueJsxOptions = initPluginVueJsxOptions(options)
options.viteLegacyOptions = initPluginViteLegacyOptions(options)
......
import debug from 'debug'
import { Plugin, ResolvedConfig, ViteDevServer } from 'vite'
import { Options as VueOptions } from '@vitejs/plugin-vue'
import { Options as ViteLegacyOptions } from '@vitejs/plugin-legacy'
......@@ -10,6 +11,9 @@ import { createConfigResolved } from './configResolved'
import { createConfigureServer } from './configureServer'
import { createHandleHotUpdate } from './handleHotUpdate'
import { initExtraPlugins } from './utils'
const debugUni = debug('vite:uni:plugin')
export interface VitePluginUniOptions {
inputDir?: string
outputDir?: string
......@@ -64,19 +68,19 @@ export default function uniPlugin(
if (createVueJsxPlugin && options.vueJsxOptions !== false) {
plugins.push(createVueJsxPlugin(options.vueJsxOptions))
}
const uniPlugins = initExtraPlugins(
process.env.UNI_CLI_CONTEXT || process.cwd(),
(process.env.UNI_PLATFORM as UniApp.PLATFORM) || 'h5'
)
debugUni(uniPlugins)
plugins.push({
name: 'vite:uni',
config: createConfig(options),
config: createConfig(options, uniPlugins),
configResolved: createConfigResolved(options),
configureServer: createConfigureServer(options),
handleHotUpdate: createHandleHotUpdate(options),
})
plugins.push(
...initExtraPlugins(
process.env.UNI_CLI_CONTEXT || process.cwd(),
(process.env.UNI_PLATFORM as UniApp.PLATFORM) || 'h5'
)
)
plugins.push(...uniPlugins)
return plugins
}
......
......@@ -32,6 +32,7 @@ function initPlugin(plugin: PluginConfig): Plugin | void {
function initPlugins(plugins: PluginConfig[]): Plugin[] {
return plugins
.map((plugin) => initPlugin(plugin))
.flat()
.filter<Plugin>(Boolean as any)
}
......
import { Plugin } from 'vite'
import { extend, hasOwn, isArray } from '@vue/shared'
import { SFCTemplateCompileOptions } from '@vue/compiler-sfc'
import { isCustomElement, isNativeTag } from '@dcloudio/uni-shared'
import { EXTNAME_VUE_RE, parseCompatConfigOnce } from '@dcloudio/uni-cli-shared'
import { transformMatchMedia } from './transforms/transformMatchMedia'
import { VitePluginUniResolvedOptions } from '..'
import { transformMatchMedia } from './transforms/transformMatchMedia'
import { createTransformEvent } from './transforms/transformEvent'
function createUniVueTransformAssetUrls(
......@@ -31,7 +32,16 @@ function createUniVueTransformAssetUrls(
}
}
export function initPluginVueOptions(options: VitePluginUniResolvedOptions) {
interface UniPlugin extends Plugin {
uni?: {
transformEvent?: Record<string, string>
}
}
export function initPluginVueOptions(
options: VitePluginUniResolvedOptions,
uniPlugins: UniPlugin[]
) {
const vueOptions = options.vueOptions || (options.vueOptions = {})
if (!vueOptions.include) {
vueOptions.include = []
......@@ -61,7 +71,14 @@ export function initPluginVueOptions(options: VitePluginUniResolvedOptions) {
compatConfig
)
compilerOptions.nodeTransforms.unshift(createTransformEvent({}))
const eventOpts = uniPlugins.reduce<Record<string, string>>(
(eventOpts, uniPlugin) => {
return extend(eventOpts, uniPlugin.uni?.transformEvent || {})
},
{}
)
compilerOptions.nodeTransforms.unshift(createTransformEvent(eventOpts))
if (options.platform !== 'mp-weixin') {
compilerOptions.nodeTransforms.unshift(transformMatchMedia)
}
......
......@@ -7,8 +7,8 @@ export function createTransformEvent(options: Record<string, string>) {
return
}
node.props.forEach((prop) => {
const { arg } = prop as DirectiveNode
if (arg && isSimpleExpressionNode(arg)) {
const { name, arg } = prop as DirectiveNode
if (name === 'on' && arg && isSimpleExpressionNode(arg)) {
const eventType = options[arg.content]
if (eventType) {
// e.g tap => click
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册