diff --git a/packages/uni-h5/lib/uni.plugin.js b/packages/uni-h5/lib/uni.plugin.js new file mode 100644 index 0000000000000000000000000000000000000000..d99eadf34ec5176ef03e09740b71f9342922fea7 --- /dev/null +++ b/packages/uni-h5/lib/uni.plugin.js @@ -0,0 +1,13 @@ +/** + * @type {import('vite').Plugin} + */ +const UniH5Plugin = { + name: 'vite:uni-h5', + uni: { + transformEvent: { + tap: 'click', + }, + }, +} + +module.exports = UniH5Plugin diff --git a/packages/uni-h5/package.json b/packages/uni-h5/package.json index 53840abb5897117b11e1a0e76d9814fd41b2c26e..b95805d48c1084d135da7c81f077ea923e54f6d2 100644 --- a/packages/uni-h5/package.json +++ b/packages/uni-h5/package.json @@ -30,5 +30,9 @@ "peerDependencies": { "@vue/shared": "^3.1.0-beta.3", "vue-router": "^4.0.8" + }, + "uni-app": { + "name": "uni-h5", + "apply": "h5" } } diff --git a/packages/vite-plugin-uni/src/config/index.ts b/packages/vite-plugin-uni/src/config/index.ts index 9eb0892bd1fc5904f760395363f8b9ef4d1f11c4..53b4697a4589c80e83770c5238bad8059c9acb50 100644 --- a/packages/vite-plugin-uni/src/config/index.ts +++ b/packages/vite-plugin-uni/src/config/index.ts @@ -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) diff --git a/packages/vite-plugin-uni/src/index.ts b/packages/vite-plugin-uni/src/index.ts index 5c7d60fe27281d72023c8875925a08d505552ef8..d277233833ec8010a246d02e8296184c62423d1a 100644 --- a/packages/vite-plugin-uni/src/index.ts +++ b/packages/vite-plugin-uni/src/index.ts @@ -1,3 +1,4 @@ +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 } diff --git a/packages/vite-plugin-uni/src/utils/plugin.ts b/packages/vite-plugin-uni/src/utils/plugin.ts index 08971fbed16a515b838d279f1a8d3ed1371c1045..e1e635b3d0935d6e8f53e0ac06643bfeeceecd73 100644 --- a/packages/vite-plugin-uni/src/utils/plugin.ts +++ b/packages/vite-plugin-uni/src/utils/plugin.ts @@ -32,6 +32,7 @@ function initPlugin(plugin: PluginConfig): Plugin | void { function initPlugins(plugins: PluginConfig[]): Plugin[] { return plugins .map((plugin) => initPlugin(plugin)) + .flat() .filter(Boolean as any) } diff --git a/packages/vite-plugin-uni/src/vue/options.ts b/packages/vite-plugin-uni/src/vue/options.ts index a37101d901696e110fac3b2879e5c07a8c17a68b..18fbc29e407b870ee7492e1c43bd9528bca08d4a 100644 --- a/packages/vite-plugin-uni/src/vue/options.ts +++ b/packages/vite-plugin-uni/src/vue/options.ts @@ -1,11 +1,12 @@ +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 + } +} + +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>( + (eventOpts, uniPlugin) => { + return extend(eventOpts, uniPlugin.uni?.transformEvent || {}) + }, + {} + ) + + compilerOptions.nodeTransforms.unshift(createTransformEvent(eventOpts)) if (options.platform !== 'mp-weixin') { compilerOptions.nodeTransforms.unshift(transformMatchMedia) } diff --git a/packages/vite-plugin-uni/src/vue/transforms/transformEvent.ts b/packages/vite-plugin-uni/src/vue/transforms/transformEvent.ts index e0e23c0bff2a4d45538c2704d7199d32829ba03d..376400f7c3cdd203f0209f26aa0d9acbd9732242 100644 --- a/packages/vite-plugin-uni/src/vue/transforms/transformEvent.ts +++ b/packages/vite-plugin-uni/src/vue/transforms/transformEvent.ts @@ -7,8 +7,8 @@ export function createTransformEvent(options: Record) { 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