From 24dfc6f66f7a4afeaf4583cf3724f878ae63d9cf Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Sun, 8 Aug 2021 17:43:40 +0800 Subject: [PATCH] refactor(h5): renderjs --- packages/uni-cli-shared/src/index.ts | 1 + packages/uni-cli-shared/src/renderjs.ts | 36 ++++++++++++++++ packages/uni-h5-vite/dist/index.js | 2 + packages/uni-h5-vite/dist/plugins/renderjs.js | 41 ++++++++++++++++++ packages/uni-h5-vite/src/index.ts | 2 + packages/uni-h5-vite/src/plugins/renderjs.ts | 43 +++++++++++++++++++ .../src/configResolved/plugins/index.ts | 2 - 7 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 packages/uni-cli-shared/src/renderjs.ts create mode 100644 packages/uni-h5-vite/dist/plugins/renderjs.js create mode 100644 packages/uni-h5-vite/src/plugins/renderjs.ts diff --git a/packages/uni-cli-shared/src/index.ts b/packages/uni-cli-shared/src/index.ts index 44cedbaf7..6348103f0 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 000000000..f41d6888b --- /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 b340bcc96..e696dc64f 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 000000000..31433d2a0 --- /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 c7e49232c..70a8ecbef 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 000000000..f76d7a71e --- /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 42e775d6e..e0ceb8de5 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, -- GitLab