diff --git a/packages/uni-cli-shared/src/index.ts b/packages/uni-cli-shared/src/index.ts index 09f2654dece16914fb0b6defe0756b67add72ff9..8552832818d8005c1f0a6f0c08f21fda0d797f57 100644 --- a/packages/uni-cli-shared/src/index.ts +++ b/packages/uni-cli-shared/src/index.ts @@ -2,8 +2,9 @@ export * from './fs' export * from './mp' export * from './env' export * from './hbx' -export * from './logs' export * from './ssr' +export * from './vue' +export * from './logs' export * from './i18n' export * from './deps' export * from './json' @@ -16,7 +17,6 @@ export * from './postcss' export * from './filter' export * from './esbuild' -export * from './vue/transforms' export { M } from './messages' export * from './exports' diff --git a/packages/uni-cli-shared/src/vue/index.ts b/packages/uni-cli-shared/src/vue/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f1f62a9f8eac708976299e03176badad88665bfe --- /dev/null +++ b/packages/uni-cli-shared/src/vue/index.ts @@ -0,0 +1,2 @@ +export * from './transforms' +export * from './utils' diff --git a/packages/uni-cli-shared/src/vue/transforms/transformComponent.ts b/packages/uni-cli-shared/src/vue/transforms/transformComponent.ts index 8b65d5aec14b1ee86f5c6c8545434ff350cbdd5c..4324ac1d9147ae96d18f8f8a7d44a46aa0775546 100644 --- a/packages/uni-cli-shared/src/vue/transforms/transformComponent.ts +++ b/packages/uni-cli-shared/src/vue/transforms/transformComponent.ts @@ -1,8 +1,5 @@ -import { isComponentTag } from '@dcloudio/uni-shared' import { createSimpleExpression, - ElementTypes, - isCoreComponent, locStub, NodeTypes, RootNode, @@ -10,6 +7,7 @@ import { TransformContext, } from '@vue/compiler-core' import { COMPONENT_BIND_LINK, COMPONENT_ON_LINK } from '../../mp/constants' +import { isUserComponent } from '../utils' export function createTransformComponentLink( name: typeof COMPONENT_BIND_LINK | typeof COMPONENT_ON_LINK @@ -18,26 +16,16 @@ export function createTransformComponentLink( node: RootNode | TemplateChildNode, context: TransformContext ) { - if ( - node.type === NodeTypes.ELEMENT && - node.tagType === ElementTypes.COMPONENT - ) { - const { tag } = node - if ( - isComponentTag(tag) || - isCoreComponent(tag) || - context.isBuiltInComponent(tag) - ) { - return - } - node.props.push({ - type: NodeTypes.DIRECTIVE, - name: 'on', - modifiers: [], - loc: locStub, - arg: createSimpleExpression(name, true), - exp: createSimpleExpression('__l', true), - }) + if (!isUserComponent(node, context)) { + return } + node.props.push({ + type: NodeTypes.DIRECTIVE, + name: 'on', + modifiers: [], + loc: locStub, + arg: createSimpleExpression(name, true), + exp: createSimpleExpression('__l', true), + }) } } diff --git a/packages/uni-cli-shared/src/vue/utils.ts b/packages/uni-cli-shared/src/vue/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..5e8fc1844a494b4864d0f864c3529639f0357844 --- /dev/null +++ b/packages/uni-cli-shared/src/vue/utils.ts @@ -0,0 +1,23 @@ +import { isComponentTag } from '@dcloudio/uni-shared' +import { + ComponentNode, + ElementTypes, + isCoreComponent, + NodeTypes, + RootNode, + TemplateChildNode, + TransformContext, +} from '@vue/compiler-core' + +export function isUserComponent( + node: RootNode | TemplateChildNode, + context: TransformContext +): node is ComponentNode { + return ( + node.type === NodeTypes.ELEMENT && + node.tagType === ElementTypes.COMPONENT && + !isComponentTag(node.tag) && + !isCoreComponent(node.tag) && + !context.isBuiltInComponent(node.tag) + ) +} diff --git a/packages/uni-mp-alipay/build.json b/packages/uni-mp-alipay/build.json index b15ef80001cf2d93cb75884ec4a8497a9a24cee6..57aec615dc5d8bb1011320e105e8772c3d66af1f 100644 --- a/packages/uni-mp-alipay/build.json +++ b/packages/uni-mp-alipay/build.json @@ -1,24 +1,35 @@ -{ - "input": { - "src/runtime/index.ts": "dist/uni.mp.esm.js", - "src/api/index.ts": "dist/uni.api.esm.js" +[ + { + "input": { + "src/compiler/index.ts": "dist/uni.compiler.js" + }, + "output": { + "format": "cjs" + }, + "external": ["@dcloudio/uni-cli-shared", "@dcloudio/uni-mp-vite"] }, - "alias": { - "entries": [ - { - "find": "@dcloudio/uni-platform", - "replacement": "packages/uni-mp-alipay/src/platform/index.ts" - }, - { - "find": "@dcloudio/uni-mp-platform", - "replacement": "packages/uni-mp-core/src/platform/index.ts" - } - ] - }, - "replacements": { - "__GLOBAL__": "my", - "__PLATFORM__": "\"mp-alipay\"", - "__PLATFORM_TITLE__": "支付宝小程序" - }, - "external": ["@dcloudio/uni-i18n", "@vue/shared", "vue"] -} + { + "input": { + "src/runtime/index.ts": "dist/uni.mp.esm.js", + "src/api/index.ts": "dist/uni.api.esm.js" + }, + "alias": { + "entries": [ + { + "find": "@dcloudio/uni-platform", + "replacement": "packages/uni-mp-alipay/src/platform/index.ts" + }, + { + "find": "@dcloudio/uni-mp-platform", + "replacement": "packages/uni-mp-core/src/platform/index.ts" + } + ] + }, + "replacements": { + "__GLOBAL__": "my", + "__PLATFORM__": "\"mp-alipay\"", + "__PLATFORM_TITLE__": "支付宝小程序" + }, + "external": ["@dcloudio/uni-i18n", "@vue/shared", "vue"] + } +] diff --git a/packages/uni-mp-alipay/dist/uni.compiler.js b/packages/uni-mp-alipay/dist/uni.compiler.js new file mode 100644 index 0000000000000000000000000000000000000000..3b1e76658d69729c3d242c2b94e1fd9dd8216322 --- /dev/null +++ b/packages/uni-mp-alipay/dist/uni.compiler.js @@ -0,0 +1,86 @@ +'use strict'; + +var initMiniProgramPlugin = require('@dcloudio/uni-mp-vite'); +var path = require('path'); +var uniCliShared = require('@dcloudio/uni-cli-shared'); + +function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + +var initMiniProgramPlugin__default = /*#__PURE__*/_interopDefaultLegacy(initMiniProgramPlugin); +var path__default = /*#__PURE__*/_interopDefaultLegacy(path); + +var component2 = true; +var enableAppxNg = true; +var source = { + component2: component2, + enableAppxNg: enableAppxNg +}; + +const projectConfigFilename = 'mini.project.json'; +const options = { + vite: { + inject: { + uni: [path__default["default"].resolve(__dirname, 'uni.api.esm.js'), 'default'], + }, + alias: { + 'uni-mp-runtime': path__default["default"].resolve(__dirname, 'uni.mp.esm.js'), + }, + copyOptions: { + assets: ['mycomponents'], + }, + }, + global: 'my', + app: { + darkmode: false, + subpackages: true, + }, + project: { + filename: projectConfigFilename, + source, + }, + template: { + class: { + array: false, + }, + filter: { + extname: '.sjs', + lang: 'sjs', + generate(filter, filename) { + if (filename) { + return ``; + } + return ` +${filter.code} +`; + }, + }, + slot: { + fallback: true, + }, + extname: '.axml', + directive: 'a:', + compilerOptions: { + nodeTransforms: [uniCliShared.createTransformComponentLink(uniCliShared.COMPONENT_ON_LINK)], + }, + }, + style: { + extname: '.acss', + }, +}; + +const uniMiniProgramAlipayPlugin = { + name: 'vite:uni-mp-alipay', + config() { + return { + define: { + __VUE_CREATED_DEFERRED__: false, + }, + build: { + assetsInlineLimit: 0, + }, + }; + }, +}; +var index = [uniMiniProgramAlipayPlugin, ...initMiniProgramPlugin__default["default"](options)]; + +module.exports = index; diff --git a/packages/uni-mp-alipay/src/compiler/index.ts b/packages/uni-mp-alipay/src/compiler/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..0d7e29b0e703dbf6cd593beb5355894dbe2762e2 --- /dev/null +++ b/packages/uni-mp-alipay/src/compiler/index.ts @@ -0,0 +1,20 @@ +import { Plugin } from 'vite' +import initMiniProgramPlugin from '@dcloudio/uni-mp-vite' + +import { options } from './options' + +const uniMiniProgramAlipayPlugin: Plugin = { + name: 'vite:uni-mp-alipay', + config() { + return { + define: { + __VUE_CREATED_DEFERRED__: false, + }, + build: { + assetsInlineLimit: 0, + }, + } + }, +} + +export default [uniMiniProgramAlipayPlugin, ...initMiniProgramPlugin(options)] diff --git a/packages/uni-mp-alipay/src/compiler/mini.project.json b/packages/uni-mp-alipay/src/compiler/mini.project.json new file mode 100644 index 0000000000000000000000000000000000000000..59d9114dda878f1b8aee55069785a78f82f84c43 --- /dev/null +++ b/packages/uni-mp-alipay/src/compiler/mini.project.json @@ -0,0 +1,4 @@ +{ + "component2": true, + "enableAppxNg": true +} diff --git a/packages/uni-mp-alipay/src/compiler/options.ts b/packages/uni-mp-alipay/src/compiler/options.ts new file mode 100644 index 0000000000000000000000000000000000000000..9d32868f730ef1917e5ad34bd897c644aab0b5fc --- /dev/null +++ b/packages/uni-mp-alipay/src/compiler/options.ts @@ -0,0 +1,61 @@ +import path from 'path' +import { + COMPONENT_ON_LINK, + createTransformComponentLink, +} from '@dcloudio/uni-cli-shared' +import { UniMiniProgramPluginOptions } from '@dcloudio/uni-mp-vite' + +import source from './mini.project.json' + +const projectConfigFilename = 'mini.project.json' + +export const options: UniMiniProgramPluginOptions = { + vite: { + inject: { + uni: [path.resolve(__dirname, 'uni.api.esm.js'), 'default'], + }, + alias: { + 'uni-mp-runtime': path.resolve(__dirname, 'uni.mp.esm.js'), + }, + copyOptions: { + assets: ['mycomponents'], + }, + }, + global: 'my', + app: { + darkmode: false, + subpackages: true, + }, + project: { + filename: projectConfigFilename, + source, + }, + template: { + class: { + array: false, + }, + filter: { + extname: '.sjs', + lang: 'sjs', + generate(filter, filename) { + if (filename) { + return `` + } + return ` +${filter.code} +` + }, + }, + slot: { + fallback: true, + }, + extname: '.axml', + directive: 'a:', + compilerOptions: { + nodeTransforms: [createTransformComponentLink(COMPONENT_ON_LINK)], + }, + }, + style: { + extname: '.acss', + }, +} diff --git a/packages/uni-mp-baidu/dist/uni.compiler.js b/packages/uni-mp-baidu/dist/uni.compiler.js index a079bd609392ffc03f827721e60bf8015ee1cba5..b62e95f02f70b310e965c795cbb5dd1d4f417443 100644 --- a/packages/uni-mp-baidu/dist/uni.compiler.js +++ b/packages/uni-mp-baidu/dist/uni.compiler.js @@ -3,6 +3,7 @@ var initMiniProgramPlugin = require('@dcloudio/uni-mp-vite'); var path = require('path'); var uniMpCompiler = require('@dcloudio/uni-mp-compiler'); +var uniCliShared = require('@dcloudio/uni-cli-shared'); var compilerCore = require('@vue/compiler-core'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } @@ -66,7 +67,7 @@ const transformOn = (dir, node, context, augmentor) => { !exp || !compilerCore.isStaticExp(arg) || !isCustomEvent(arg.content) || - !uniMpCompiler.isUserComponent(node, context)) { + !uniCliShared.isUserComponent(node, context)) { return res; } const value = res.props[0].value; @@ -134,7 +135,7 @@ function isCustomEvent(name) { const transformModel = (dir, node, context, augmentor) => { const res = uniMpCompiler.transformModel(dir, node, context, augmentor); const props = res.props; - if (props.length < 2 || !uniMpCompiler.isUserComponent(node, context)) { + if (props.length < 2 || !uniCliShared.isUserComponent(node, context)) { return res; } const { arg, exp } = props[1]; diff --git a/packages/uni-mp-baidu/src/compiler/transforms/vModel.ts b/packages/uni-mp-baidu/src/compiler/transforms/vModel.ts index 89871e2fe4c7e5c8b7523f76ffc7a14cd237f380..2a7b3fc91d22f0809241c64a947c80b0c236ab7a 100644 --- a/packages/uni-mp-baidu/src/compiler/transforms/vModel.ts +++ b/packages/uni-mp-baidu/src/compiler/transforms/vModel.ts @@ -1,7 +1,7 @@ +import { isUserComponent } from '@dcloudio/uni-cli-shared' import { DirectiveNode, DirectiveTransform, - isUserComponent, SimpleExpressionNode, transformModel as baseTransformModel, } from '@dcloudio/uni-mp-compiler' diff --git a/packages/uni-mp-baidu/src/compiler/transforms/vOn.ts b/packages/uni-mp-baidu/src/compiler/transforms/vOn.ts index 30757a8622567cfbb63d636560489944621336e5..821dd514d5958eaf142147ae268c79801f4cd12a 100644 --- a/packages/uni-mp-baidu/src/compiler/transforms/vOn.ts +++ b/packages/uni-mp-baidu/src/compiler/transforms/vOn.ts @@ -1,6 +1,6 @@ +import { isUserComponent } from '@dcloudio/uni-cli-shared' import { DirectiveTransform, - isUserComponent, transformOn as baseTransformOn, } from '@dcloudio/uni-mp-compiler' import { diff --git a/packages/uni-mp-compiler/__tests__/test.spec.ts b/packages/uni-mp-compiler/__tests__/test.spec.ts index 14970300bb5c9e8c38d4756a6ba7b8c6727bd8f1..ab743625113223514740861628a8519a6f39f073 100644 --- a/packages/uni-mp-compiler/__tests__/test.spec.ts +++ b/packages/uni-mp-compiler/__tests__/test.spec.ts @@ -38,10 +38,10 @@ function assert( describe('compiler', () => { test('scope', () => { assert( - `{{error.message}}`, - `{{v0.b}}`, + ``, + ``, `(_ctx, _cache) => { - return { a: _w(({ data, loading, error, options }, s0, i0) => { return _e({ a: error }, error ? { b: _t(error.message) } : {}, { c: s0 }); }, { name: 'default', vueId: '2a9ec0b0-0' }) } + return { a: _ctx.custom } }` ) }) diff --git a/packages/uni-mp-compiler/src/index.ts b/packages/uni-mp-compiler/src/index.ts index 76da48ff6f97edc2ee255fa024ba452c2633e874..7b09d4d5369b06123f7d56b64483f120df91a9a0 100644 --- a/packages/uni-mp-compiler/src/index.ts +++ b/packages/uni-mp-compiler/src/index.ts @@ -22,7 +22,6 @@ export type { export { genExpr } from './codegen' export { isForElementNode } from './transforms/vFor' -export { isUserComponent } from './transforms/utils' export { transformOn } from './transforms/vOn' export { transformModel } from './transforms/vModel' export * from './runtimeHelpers' diff --git a/packages/uni-mp-compiler/src/transforms/transformComponent.ts b/packages/uni-mp-compiler/src/transforms/transformComponent.ts index 2eae4cf87753698e5b359ed2c147b538823e10c4..09d7bccba725fbe5c3063d55d055d0aeb95e76d0 100644 --- a/packages/uni-mp-compiler/src/transforms/transformComponent.ts +++ b/packages/uni-mp-compiler/src/transforms/transformComponent.ts @@ -1,18 +1,19 @@ -import { ComponentNode, findProp } from '@vue/compiler-core' +import { + ComponentNode, + findProp, + NodeTypes, + SimpleExpressionNode, +} from '@vue/compiler-core' +import { isUserComponent } from '@dcloudio/uni-cli-shared' import { isVForScope, NodeTransform, TransformContext } from '../transform' import { createAttributeNode, createBindDirectiveNode } from '../ast' import { addStaticClass } from './transformElement' -import { - ATTR_VUE_ID, - CLASS_VUE_REF, - CLASS_VUE_REF_IN_FOR, - isUserComponent, -} from './utils' +import { ATTR_VUE_ID, CLASS_VUE_REF, CLASS_VUE_REF_IN_FOR } from './utils' import { CodegenScope } from '../options' import { isScopedSlotVFor } from './vSlot' export const transformComponent: NodeTransform = (node, context) => { - if (!isUserComponent(node, context)) { + if (!isUserComponent(node, context as any)) { return } addVueRef(node, context) @@ -62,9 +63,16 @@ function addVueId(node: ComponentNode, context: TransformContext) { function addVueRef(node: ComponentNode, context: TransformContext) { // 仅配置了 ref 属性的,才需要增补 vue-ref - if (!findProp(node, 'ref')) { + const refProp = findProp(node, 'ref') + if (!refProp) { return } + if (refProp.type === NodeTypes.ATTRIBUTE) { + refProp.name = 'data-ref' + } else { + ;(refProp.arg as SimpleExpressionNode).content = 'data-ref' + } + return addStaticClass( node, // vue-ref-in-for diff --git a/packages/uni-mp-compiler/src/transforms/transformElement.ts b/packages/uni-mp-compiler/src/transforms/transformElement.ts index 795499cd489533855e7f68c5dc209b6c7ba302b9..4cb37d000986862eca754c132200ab1d161435eb 100644 --- a/packages/uni-mp-compiler/src/transforms/transformElement.ts +++ b/packages/uni-mp-compiler/src/transforms/transformElement.ts @@ -202,12 +202,7 @@ export function processProps( for (let i = 0; i < props.length; i++) { const prop = props[i] - if (prop.type === NodeTypes.ATTRIBUTE) { - // => - if (prop.name === 'ref') { - prop.name = 'data-ref' - } - } else { + if (prop.type === NodeTypes.DIRECTIVE) { // directives const { name, arg, loc } = prop const isVBind = name === 'bind' @@ -264,16 +259,6 @@ export function processProps( } } - if (isVBind) { - // => - if ( - arg?.type === NodeTypes.SIMPLE_EXPRESSION && - arg.content === 'ref' - ) { - arg.content = 'data-ref' - } - } - const directiveTransform = context.directiveTransforms[name] if (name !== 'model' && directiveTransform) { const { props } = directiveTransform(prop, node, context as any) diff --git a/packages/uni-mp-compiler/src/transforms/utils.ts b/packages/uni-mp-compiler/src/transforms/utils.ts index 95b75bc9ef22cdf37cb599fc09a8650e9589e033..03485e9da7c8da342ee44331d436baee4d42d693 100644 --- a/packages/uni-mp-compiler/src/transforms/utils.ts +++ b/packages/uni-mp-compiler/src/transforms/utils.ts @@ -11,18 +11,11 @@ import { SpreadElement, stringLiteral, } from '@babel/types' -import { isComponentTag } from '@dcloudio/uni-shared' import { - ComponentNode, createSimpleExpression, - ElementTypes, ExpressionNode, - isCoreComponent, NodeTypes, - RootNode, SourceLocation, - TemplateChildNode, - TransformContext as VueTransformContext, } from '@vue/compiler-core' import { walk, BaseNode } from 'estree-walker' import { isUndefined, parseExpr } from '../ast' @@ -36,19 +29,6 @@ export const CLASS_VUE_REF = 'v-r' export const CLASS_VUE_REF_IN_FOR = 'v-r-i-f' export const SCOPED_SLOT_IDENTIFIER = '__SCOPED_SLOT__' -export function isUserComponent( - node: RootNode | TemplateChildNode, - context: TransformContext | VueTransformContext -): node is ComponentNode { - return ( - node.type === NodeTypes.ELEMENT && - node.tagType === ElementTypes.COMPONENT && - !isComponentTag(node.tag) && - !isCoreComponent(node.tag) && - !context.isBuiltInComponent(node.tag) - ) -} - export function rewriteSpreadElement( name: symbol, expr: SpreadElement, diff --git a/packages/uni-mp-compiler/src/transforms/vSlot.ts b/packages/uni-mp-compiler/src/transforms/vSlot.ts index 00dd3be070bc97af1a17dd37ef0b76a71dcfcd8e..44fe64148d7e0ad9c993fd3c95558ca653907c78 100644 --- a/packages/uni-mp-compiler/src/transforms/vSlot.ts +++ b/packages/uni-mp-compiler/src/transforms/vSlot.ts @@ -25,6 +25,7 @@ import { TemplateChildNode, TemplateNode, } from '@vue/compiler-core' +import { isUserComponent } from '@dcloudio/uni-cli-shared' import { WITH_SCOPED_SLOT } from '../runtimeHelpers' import { createBindDirectiveNode, parseExpr } from '../ast' import { genExpr } from '../codegen' @@ -33,14 +34,13 @@ import { isVForScope, NodeTransform, TransformContext } from '../transform' import { ATTR_VUE_ID, ATTR_VUE_SLOTS, - isUserComponent, rewriteExpressionWithoutProperty, SCOPED_SLOT_IDENTIFIER, } from './utils' import { createVForArrowFunctionExpression } from './vFor' export const transformSlot: NodeTransform = (node, context) => { - if (!isUserComponent(node, context)) { + if (!isUserComponent(node, context as any)) { return }