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

feat(h5): support jsx/tsx

上级 83c79f2c
...@@ -3,11 +3,11 @@ import { Plugin } from 'vite' ...@@ -3,11 +3,11 @@ import { Plugin } from 'vite'
import { createFilter, FilterPattern } from '@rollup/pluginutils' import { createFilter, FilterPattern } from '@rollup/pluginutils'
import { import {
EXTNAME_VUE,
parseVueRequest, parseVueRequest,
matchEasycom, matchEasycom,
addImportDeclaration, addImportDeclaration,
genResolveEasycomCode, genResolveEasycomCode,
EXTNAME_VUE_TEMPLATE,
} from '@dcloudio/uni-cli-shared' } from '@dcloudio/uni-cli-shared'
interface UniEasycomPluginOptions { interface UniEasycomPluginOptions {
...@@ -26,7 +26,7 @@ export function uniEasycomPlugin(options: UniEasycomPluginOptions): Plugin { ...@@ -26,7 +26,7 @@ export function uniEasycomPlugin(options: UniEasycomPluginOptions): Plugin {
const { filename, query } = parseVueRequest(id) const { filename, query } = parseVueRequest(id)
if ( if (
query.type !== 'template' && query.type !== 'template' &&
(query.vue || !EXTNAME_VUE.includes(path.extname(filename))) (query.vue || !EXTNAME_VUE_TEMPLATE.includes(path.extname(filename)))
) { ) {
return return
} }
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
"url": "https://github.com/dcloudio/uni-app/issues" "url": "https://github.com/dcloudio/uni-app/issues"
}, },
"dependencies": { "dependencies": {
"@babel/core": "^7.16.5",
"@babel/parser": "^7.16.4", "@babel/parser": "^7.16.4",
"@babel/types": "^7.16.0", "@babel/types": "^7.16.0",
"@dcloudio/uni-i18n": "3.0.0-alpha-3030420211227001", "@dcloudio/uni-i18n": "3.0.0-alpha-3030420211227001",
......
...@@ -2,6 +2,7 @@ export const PUBLIC_DIR = 'static' ...@@ -2,6 +2,7 @@ export const PUBLIC_DIR = 'static'
export const EXTNAME_JS = ['.js', '.ts', '.jsx', '.tsx'] export const EXTNAME_JS = ['.js', '.ts', '.jsx', '.tsx']
export const EXTNAME_TS = ['.ts', '.tsx'] export const EXTNAME_TS = ['.ts', '.tsx']
export const EXTNAME_VUE = ['.vue', '.nvue'] export const EXTNAME_VUE = ['.vue', '.nvue']
export const EXTNAME_VUE_TEMPLATE = ['.vue', '.nvue', '.jsx', '.tsx']
export const EXTNAME_VUE_RE = /\.(vue|nvue)$/ export const EXTNAME_VUE_RE = /\.(vue|nvue)$/
export const EXTNAME_JS_RE = /\.[jt]sx?$/ export const EXTNAME_JS_RE = /\.[jt]sx?$/
export const EXTNAME_TS_RE = /\.tsx?$/ export const EXTNAME_TS_RE = /\.tsx?$/
......
...@@ -70,7 +70,10 @@ export function initEasycoms( ...@@ -70,7 +70,10 @@ export function initEasycoms(
const res = { const res = {
options, options,
filter: createFilter( filter: createFilter(
['components/*/*.vue', 'uni_modules/*/components/*/*.vue'], [
'components/*/*.(vue|jsx|tsx)',
'uni_modules/*/components/*/*.(vue|jsx|tsx)',
],
[], [],
{ {
resolve: inputDir, resolve: inputDir,
...@@ -110,7 +113,7 @@ function initEasycom({ ...@@ -110,7 +113,7 @@ function initEasycom({
dirs, dirs,
rootDir, rootDir,
custom, custom,
extensions = ['.vue'], extensions = ['.vue', '.jsx', '.tsx'],
}: EasycomOption) { }: EasycomOption) {
clearEasycom() clearEasycom()
const easycomsObj = Object.create(null) const easycomsObj = Object.create(null)
......
...@@ -24,6 +24,9 @@ interface UniVitePluginUniOptions { ...@@ -24,6 +24,9 @@ interface UniVitePluginUniOptions {
directiveTransforms?: CompilerOptions['directiveTransforms'] directiveTransforms?: CompilerOptions['directiveTransforms']
nodeTransforms?: CompilerOptions['nodeTransforms'] nodeTransforms?: CompilerOptions['nodeTransforms']
} }
jsxOptions?: {
babelPlugins?: any[]
}
copyOptions?: CopyOptions | (() => CopyOptions) copyOptions?: CopyOptions | (() => CopyOptions)
} }
export interface UniVitePlugin extends Plugin { export interface UniVitePlugin extends Plugin {
......
import * as BabelCore from '@babel/core'
import type { PluginObj } from '@babel/core'
import { isBuiltInComponent } from '@dcloudio/uni-shared'
export function transformUniH5Jsx({ types }: typeof BabelCore): PluginObj {
return {
name: 'babel-plugin-uni-h5-jsx',
visitor: {
JSXOpeningElement({ node: { name } }) {
if (types.isJSXIdentifier(name) && isBuiltInComponent(name.name)) {
name.name = 'v-uni-' + name.name
}
},
},
}
}
export * from './transforms' export * from './transforms'
export * from './utils' export * from './utils'
export { transformUniH5Jsx } from './babel'
export { isExternalUrl } from './transforms/templateUtils' export { isExternalUrl } from './transforms/templateUtils'
...@@ -3,6 +3,7 @@ import { ...@@ -3,6 +3,7 @@ import {
transformMatchMedia, transformMatchMedia,
transformPageHead, transformPageHead,
transformTapToClick, transformTapToClick,
transformUniH5Jsx,
UniVitePlugin, UniVitePlugin,
} from '@dcloudio/uni-cli-shared' } from '@dcloudio/uni-cli-shared'
import { isH5NativeTag, isH5CustomElement } from '@dcloudio/uni-shared' import { isH5NativeTag, isH5CustomElement } from '@dcloudio/uni-shared'
...@@ -25,5 +26,8 @@ export function createUni(): UniVitePlugin['uni'] { ...@@ -25,5 +26,8 @@ export function createUni(): UniVitePlugin['uni'] {
assets: ['hybrid/html'], assets: ['hybrid/html'],
}, },
compilerOptions, compilerOptions,
jsxOptions: {
babelPlugins: [transformUniH5Jsx],
},
} }
} }
...@@ -5,7 +5,6 @@ import { camelize, capitalize } from '@vue/shared' ...@@ -5,7 +5,6 @@ import { camelize, capitalize } from '@vue/shared'
import { COMPONENT_PREFIX, isBuiltInComponent } from '@dcloudio/uni-shared' import { COMPONENT_PREFIX, isBuiltInComponent } from '@dcloudio/uni-shared'
import { import {
EXTNAME_VUE,
H5_COMPONENTS_STYLE_PATH, H5_COMPONENTS_STYLE_PATH,
BASE_COMPONENTS_STYLE_PATH, BASE_COMPONENTS_STYLE_PATH,
COMPONENT_DEPS_CSS, COMPONENT_DEPS_CSS,
...@@ -15,6 +14,7 @@ import { ...@@ -15,6 +14,7 @@ import {
matchEasycom, matchEasycom,
addImportDeclaration, addImportDeclaration,
genResolveEasycomCode, genResolveEasycomCode,
EXTNAME_VUE_TEMPLATE,
} from '@dcloudio/uni-cli-shared' } from '@dcloudio/uni-cli-shared'
const H5_COMPONENTS_PATH = '@dcloudio/uni-h5' const H5_COMPONENTS_PATH = '@dcloudio/uni-h5'
...@@ -71,7 +71,7 @@ export function uniEasycomPlugin(options: UniEasycomPluginOptions): Plugin { ...@@ -71,7 +71,7 @@ export function uniEasycomPlugin(options: UniEasycomPluginOptions): Plugin {
const { filename, query } = parseVueRequest(id) const { filename, query } = parseVueRequest(id)
if ( if (
query.type !== 'template' && query.type !== 'template' &&
(query.vue || !EXTNAME_VUE.includes(path.extname(filename))) (query.vue || !EXTNAME_VUE_TEMPLATE.includes(path.extname(filename)))
) { ) {
return return
} }
......
...@@ -46,7 +46,7 @@ export interface VitePluginUniOptions { ...@@ -46,7 +46,7 @@ export interface VitePluginUniOptions {
inputDir?: string inputDir?: string
outputDir?: string outputDir?: string
vueOptions?: VueOptions vueOptions?: VueOptions
vueJsxOptions?: VueJSXPluginOptions | boolean vueJsxOptions?: (VueJSXPluginOptions & { babelPlugins?: any[] }) | boolean
viteLegacyOptions?: ViteLegacyOptions | false viteLegacyOptions?: ViteLegacyOptions | false
} }
export interface VitePluginUniResolvedOptions extends VitePluginUniOptions { export interface VitePluginUniResolvedOptions extends VitePluginUniOptions {
...@@ -104,7 +104,11 @@ export default function uniPlugin( ...@@ -104,7 +104,11 @@ export default function uniPlugin(
if (options.vueJsxOptions) { if (options.vueJsxOptions) {
plugins.push( plugins.push(
vueJsxPlugin( vueJsxPlugin(
initPluginVueJsxOptions(options, uniPluginOptions.compilerOptions) initPluginVueJsxOptions(
options,
uniPluginOptions.compilerOptions,
uniPluginOptions.jsxOptions
)
) )
) )
} }
......
...@@ -24,12 +24,14 @@ export function initPluginUniOptions(UniVitePlugins: UniVitePlugin[]) { ...@@ -24,12 +24,14 @@ export function initPluginUniOptions(UniVitePlugins: UniVitePlugin[]) {
const targets: UniViteCopyPluginTarget[] = [] const targets: UniViteCopyPluginTarget[] = []
const transformEvent: Record<string, string> = Object.create(null) const transformEvent: Record<string, string> = Object.create(null)
const compilerOptions: Required<UniVitePlugin>['uni']['compilerOptions'] = {} const compilerOptions: Required<UniVitePlugin>['uni']['compilerOptions'] = {}
const jsxOptions: Required<UniVitePlugin>['uni']['jsxOptions'] = {}
let compiler: TemplateCompiler | undefined let compiler: TemplateCompiler | undefined
UniVitePlugins.forEach((plugin) => { UniVitePlugins.forEach((plugin) => {
const { const {
compiler: pluginTemplateCompiler, compiler: pluginTemplateCompiler,
copyOptions: pluginCopyOptions, copyOptions: pluginCopyOptions,
compilerOptions: pluginCompilerOptions, compilerOptions: pluginCompilerOptions,
jsxOptions: pluginJsxOptions,
} = plugin.uni || {} } = plugin.uni || {}
if (pluginTemplateCompiler) { if (pluginTemplateCompiler) {
compiler = pluginTemplateCompiler compiler = pluginTemplateCompiler
...@@ -37,6 +39,9 @@ export function initPluginUniOptions(UniVitePlugins: UniVitePlugin[]) { ...@@ -37,6 +39,9 @@ export function initPluginUniOptions(UniVitePlugins: UniVitePlugin[]) {
if (pluginCompilerOptions) { if (pluginCompilerOptions) {
extend(compilerOptions, pluginCompilerOptions) extend(compilerOptions, pluginCompilerOptions)
} }
if (pluginJsxOptions) {
extend(jsxOptions, pluginJsxOptions)
}
if (pluginCopyOptions) { if (pluginCopyOptions) {
let copyOptions = pluginCopyOptions as CopyOptions let copyOptions = pluginCopyOptions as CopyOptions
if (isFunction(pluginCopyOptions)) { if (isFunction(pluginCopyOptions)) {
...@@ -58,6 +63,7 @@ export function initPluginUniOptions(UniVitePlugins: UniVitePlugin[]) { ...@@ -58,6 +63,7 @@ export function initPluginUniOptions(UniVitePlugins: UniVitePlugin[]) {
}, },
transformEvent, transformEvent,
compilerOptions, compilerOptions,
jsxOptions,
} }
} }
......
...@@ -106,7 +106,8 @@ export function initPluginVueJsxOptions( ...@@ -106,7 +106,8 @@ export function initPluginVueJsxOptions(
options: VitePluginUniResolvedOptions, options: VitePluginUniResolvedOptions,
{ {
isCustomElement, isCustomElement,
}: Required<Required<UniVitePlugin>['uni']>['compilerOptions'] }: Required<Required<UniVitePlugin>['uni']>['compilerOptions'],
jsxOptions: Required<Required<UniVitePlugin>['uni']>['jsxOptions']
) { ) {
const vueJsxOptions = isPlainObject(options.vueJsxOptions) const vueJsxOptions = isPlainObject(options.vueJsxOptions)
? options.vueJsxOptions ? options.vueJsxOptions
...@@ -115,6 +116,13 @@ export function initPluginVueJsxOptions( ...@@ -115,6 +116,13 @@ export function initPluginVueJsxOptions(
vueJsxOptions.optimize = true vueJsxOptions.optimize = true
} }
vueJsxOptions.isCustomElement = isCustomElement as (tag: string) => boolean vueJsxOptions.isCustomElement = isCustomElement as (tag: string) => boolean
if (!vueJsxOptions.babelPlugins) {
vueJsxOptions.babelPlugins = []
}
if (isArray(jsxOptions.babelPlugins)) {
vueJsxOptions.babelPlugins.push(...jsxOptions.babelPlugins)
}
return vueJsxOptions return vueJsxOptions
} }
......
...@@ -353,6 +353,7 @@ importers: ...@@ -353,6 +353,7 @@ importers:
packages/uni-cli-shared: packages/uni-cli-shared:
specifiers: specifiers:
'@babel/core': ^7.16.5
'@babel/parser': ^7.16.4 '@babel/parser': ^7.16.4
'@babel/types': ^7.16.0 '@babel/types': ^7.16.0
'@dcloudio/uni-i18n': 3.0.0-alpha-3030420211227001 '@dcloudio/uni-i18n': 3.0.0-alpha-3030420211227001
...@@ -395,7 +396,8 @@ importers: ...@@ -395,7 +396,8 @@ importers:
tapable: ^2.2.0 tapable: ^2.2.0
xregexp: 3.1.0 xregexp: 3.1.0
dependencies: dependencies:
'@babel/parser': 7.16.4 '@babel/core': 7.16.5
'@babel/parser': 7.16.6
'@babel/types': 7.16.0 '@babel/types': 7.16.0
'@dcloudio/uni-i18n': link:../uni-i18n '@dcloudio/uni-i18n': link:../uni-i18n
'@dcloudio/uni-shared': link:../uni-shared '@dcloudio/uni-shared': link:../uni-shared
...@@ -3242,7 +3244,7 @@ packages: ...@@ -3242,7 +3244,7 @@ packages:
/@vue/compiler-core/3.2.26: /@vue/compiler-core/3.2.26:
resolution: {integrity: sha512-N5XNBobZbaASdzY9Lga2D9Lul5vdCIOXvUMd6ThcN8zgqQhPKfCV+wfAJNNJKQkSHudnYRO2gEB+lp0iN3g2Tw==} resolution: {integrity: sha512-N5XNBobZbaASdzY9Lga2D9Lul5vdCIOXvUMd6ThcN8zgqQhPKfCV+wfAJNNJKQkSHudnYRO2gEB+lp0iN3g2Tw==}
dependencies: dependencies:
'@babel/parser': 7.16.4 '@babel/parser': 7.16.6
'@vue/shared': 3.2.26 '@vue/shared': 3.2.26
estree-walker: 2.0.2 estree-walker: 2.0.2
source-map: 0.6.1 source-map: 0.6.1
...@@ -3256,7 +3258,7 @@ packages: ...@@ -3256,7 +3258,7 @@ packages:
/@vue/compiler-sfc/3.2.26: /@vue/compiler-sfc/3.2.26:
resolution: {integrity: sha512-ePpnfktV90UcLdsDQUh2JdiTuhV0Skv2iYXxfNMOK/F3Q+2BO0AulcVcfoksOpTJGmhhfosWfMyEaEf0UaWpIw==} resolution: {integrity: sha512-ePpnfktV90UcLdsDQUh2JdiTuhV0Skv2iYXxfNMOK/F3Q+2BO0AulcVcfoksOpTJGmhhfosWfMyEaEf0UaWpIw==}
dependencies: dependencies:
'@babel/parser': 7.16.4 '@babel/parser': 7.16.6
'@vue/compiler-core': 3.2.26 '@vue/compiler-core': 3.2.26
'@vue/compiler-dom': 3.2.26 '@vue/compiler-dom': 3.2.26
'@vue/compiler-ssr': 3.2.26 '@vue/compiler-ssr': 3.2.26
...@@ -3279,7 +3281,7 @@ packages: ...@@ -3279,7 +3281,7 @@ packages:
/@vue/reactivity-transform/3.2.26: /@vue/reactivity-transform/3.2.26:
resolution: {integrity: sha512-XKMyuCmzNA7nvFlYhdKwD78rcnmPb7q46uoR00zkX6yZrUmcCQ5OikiwUEVbvNhL5hBJuvbSO95jB5zkUon+eQ==} resolution: {integrity: sha512-XKMyuCmzNA7nvFlYhdKwD78rcnmPb7q46uoR00zkX6yZrUmcCQ5OikiwUEVbvNhL5hBJuvbSO95jB5zkUon+eQ==}
dependencies: dependencies:
'@babel/parser': 7.16.4 '@babel/parser': 7.16.6
'@vue/compiler-core': 3.2.26 '@vue/compiler-core': 3.2.26
'@vue/shared': 3.2.26 '@vue/shared': 3.2.26
estree-walker: 2.0.2 estree-walker: 2.0.2
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册