diff --git a/packages/uni-cli-shared/src/index.ts b/packages/uni-cli-shared/src/index.ts index 44cedbaf74837351fbbcf0c889a93953bc76864e..6348103f02d971cc04b6e448a5c16bbc2a6cae25 100644 --- a/packages/uni-cli-shared/src/index.ts +++ b/packages/uni-cli-shared/src/index.ts @@ -11,5 +11,6 @@ export * from './easycom' export * from './constants' export * from './preprocess' export * from './postcss' +export * from './renderjs' export { checkUpdate } from './checkUpdate' diff --git a/packages/uni-cli-shared/src/renderjs.ts b/packages/uni-cli-shared/src/renderjs.ts new file mode 100644 index 0000000000000000000000000000000000000000..f41d6888bc759bb68acdd4339340944a100b0ff5 --- /dev/null +++ b/packages/uni-cli-shared/src/renderjs.ts @@ -0,0 +1,36 @@ +import { parseVueRequest } from './vite/utils/url' + +const WXS_RE = /vue&type=wxs/ +export function isWxs(id: string) { + return WXS_RE.test(id) +} + +const RENDERJS_RE = /vue&type=renderjs/ +export function isRenderjs(id: string) { + return RENDERJS_RE.test(id) +} + +export function parseRenderjs(id: string) { + if (isWxs(id)) { + return { + type: 'wxs', + name: (parseVueRequest(id).query as any).name as string, + } as const + } + if (isRenderjs(id)) { + return { + type: 'renderjs', + name: (parseVueRequest(id).query as any).name as string, + } as const + } + return { + type: '', + name: '', + } as const +} + +export function missingModuleName(type: 'wxs' | 'renderjs', code: string) { + return `` +} diff --git a/packages/uni-h5-vite/dist/index.js b/packages/uni-h5-vite/dist/index.js index b340bcc96e6f1a07bb32beee27711649da7dccff..e696dc64f22563891170810d03da5ca6b526972d 100644 --- a/packages/uni-h5-vite/dist/index.js +++ b/packages/uni-h5-vite/dist/index.js @@ -7,6 +7,7 @@ const inject_1 = require("./plugins/inject"); const mainJs_1 = require("./plugins/mainJs"); const manifestJson_1 = require("./plugins/manifestJson"); const pagesJson_1 = require("./plugins/pagesJson"); +const renderjs_1 = require("./plugins/renderjs"); const resolveId_1 = require("./plugins/resolveId"); const setup_1 = require("./plugins/setup"); const ssr_1 = require("./plugins/ssr"); @@ -20,5 +21,6 @@ exports.default = [ css_1.uniCssPlugin(), ssr_1.uniSSRPlugin(), setup_1.uniSetupPlugin(), + renderjs_1.uniRenderjsPlugin(), plugin_1.UniH5Plugin, ]; diff --git a/packages/uni-h5-vite/dist/plugins/renderjs.js b/packages/uni-h5-vite/dist/plugins/renderjs.js new file mode 100644 index 0000000000000000000000000000000000000000..31433d2a0289bb489c52168bda2cc7f6276452d6 --- /dev/null +++ b/packages/uni-h5-vite/dist/plugins/renderjs.js @@ -0,0 +1,41 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.uniRenderjsPlugin = void 0; +const debug_1 = __importDefault(require("debug")); +const compiler_sfc_1 = require("@vue/compiler-sfc"); +const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared"); +const debugRenderjs = debug_1.default('vite:uni:renderjs'); +function uniRenderjsPlugin() { + return { + name: 'vite:uni-h5-renderjs', + transform(code, id) { + const { type, name } = uni_cli_shared_1.parseRenderjs(id); + if (!type) { + return; + } + debugRenderjs(id); + if (!name) { + this.error(uni_cli_shared_1.missingModuleName(type, code)); + } + return `${compiler_sfc_1.rewriteDefault(code.replace(/module\.exports\s*=/, 'export default '), '_sfc_' + type)} +${type === 'renderjs' ? genRenderjsCode(name) : genWxsCode(name)}`; + }, + }; +} +exports.uniRenderjsPlugin = uniRenderjsPlugin; +function genRenderjsCode(name) { + return `export default Comp => { + if(!Comp.mixins){Comp.mixins = []} + Comp.mixins.push({beforeCreate(){ this['${name}'] = this }}) + Comp.mixins.push(_sfc_renderjs) +}`; +} +function genWxsCode(name) { + return `export default Comp => { + if(!Comp.mixins){Comp.mixins = []} + Comp.mixins.push({beforeCreate(){ this['${name}'] = _sfc_wxs }}) +}`; +} diff --git a/packages/uni-h5-vite/src/index.ts b/packages/uni-h5-vite/src/index.ts index c7e49232c0fc80f390fd52b516a0d815f3867abe..70a8ecbefab53db53ceef17e91750b7e3e691355 100644 --- a/packages/uni-h5-vite/src/index.ts +++ b/packages/uni-h5-vite/src/index.ts @@ -5,6 +5,7 @@ import { uniInjectPlugin } from './plugins/inject' import { uniMainJsPlugin } from './plugins/mainJs' import { uniManifestJsonPlugin } from './plugins/manifestJson' import { uniPagesJsonPlugin } from './plugins/pagesJson' +import { uniRenderjsPlugin } from './plugins/renderjs' import { uniResolveIdPlugin } from './plugins/resolveId' import { uniSetupPlugin } from './plugins/setup' import { uniSSRPlugin } from './plugins/ssr' @@ -19,5 +20,6 @@ export default [ uniCssPlugin(), uniSSRPlugin(), uniSetupPlugin(), + uniRenderjsPlugin(), UniH5Plugin, ] diff --git a/packages/uni-h5-vite/src/plugins/renderjs.ts b/packages/uni-h5-vite/src/plugins/renderjs.ts new file mode 100644 index 0000000000000000000000000000000000000000..f76d7a71ead16300ac20b3e90e13101fb0c676af --- /dev/null +++ b/packages/uni-h5-vite/src/plugins/renderjs.ts @@ -0,0 +1,43 @@ +import debug from 'debug' +import { Plugin } from 'vite' +import { rewriteDefault } from '@vue/compiler-sfc' + +import { missingModuleName, parseRenderjs } from '@dcloudio/uni-cli-shared' + +const debugRenderjs = debug('vite:uni:renderjs') + +export function uniRenderjsPlugin(): Plugin { + return { + name: 'vite:uni-h5-renderjs', + transform(code, id) { + const { type, name } = parseRenderjs(id) + if (!type) { + return + } + debugRenderjs(id) + if (!name) { + this.error(missingModuleName(type, code)) + } + return `${rewriteDefault( + code.replace(/module\.exports\s*=/, 'export default '), + '_sfc_' + type + )} +${type === 'renderjs' ? genRenderjsCode(name) : genWxsCode(name)}` + }, + } +} + +function genRenderjsCode(name: string) { + return `export default Comp => { + if(!Comp.mixins){Comp.mixins = []} + Comp.mixins.push({beforeCreate(){ this['${name}'] = this }}) + Comp.mixins.push(_sfc_renderjs) +}` +} + +function genWxsCode(name: string) { + return `export default Comp => { + if(!Comp.mixins){Comp.mixins = []} + Comp.mixins.push({beforeCreate(){ this['${name}'] = _sfc_wxs }}) +}` +} diff --git a/packages/vite-plugin-uni/src/configResolved/plugins/index.ts b/packages/vite-plugin-uni/src/configResolved/plugins/index.ts index 42e775d6e18684f00f9c748fd3e661b6f87bbe70..e0ceb8de5de9e09fb87a8e83b88af32953634383 100644 --- a/packages/vite-plugin-uni/src/configResolved/plugins/index.ts +++ b/packages/vite-plugin-uni/src/configResolved/plugins/index.ts @@ -12,7 +12,6 @@ import { uniPreCssPlugin } from './preCss' import { uniEasycomPlugin } from './easycom' import { uniStaticPlugin } from './static' -import { uniRenderjsPlugin } from './renderjs' import { uniPreVuePlugin } from './preVue' import { uniSSRPlugin } from './ssr' import { uniResolveIdPlugin } from './resolveId' @@ -60,7 +59,6 @@ export function initPlugins( 'vite:css' ) addPlugin(plugins, uniPreVuePlugin(), 'vite:vue', 'pre') - addPlugin(plugins, uniRenderjsPlugin(), 'vite:vue') addPlugin( plugins,