From 120c69a2d6576499dadb32745ea6ed71ec017f52 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Thu, 20 May 2021 13:20:58 +0800 Subject: [PATCH] refactor: plugin --- packages/uni-cli-shared/src/index.ts | 1 - packages/uni-cli-shared/src/uni/compiler.ts | 44 ------------ packages/uni-cli-shared/src/uni/index.ts | 3 - packages/uni-cli-shared/src/uni/plugin.ts | 27 ------- packages/uni-cli-shared/src/uni/utils.ts | 61 ---------------- .../lib/{uni.config.js => uni.plugin.js} | 70 +++++++++++-------- packages/uni-shared/dist/uni-shared.cjs.js | 4 +- packages/uni-shared/dist/uni-shared.es.js | 4 +- packages/uni-shared/src/dom/costomDataset.ts | 5 +- packages/vite-plugin-uni/src/config/index.ts | 4 +- .../src/configResolved/plugins/index.ts | 17 +---- .../src/configureServer/index.ts | 4 -- packages/vite-plugin-uni/src/index.ts | 14 ++-- packages/vite-plugin-uni/src/utils/index.ts | 1 + packages/vite-plugin-uni/src/utils/plugin.ts | 67 ++++++++++++++++++ 15 files changed, 128 insertions(+), 198 deletions(-) delete mode 100644 packages/uni-cli-shared/src/uni/compiler.ts delete mode 100644 packages/uni-cli-shared/src/uni/index.ts delete mode 100644 packages/uni-cli-shared/src/uni/plugin.ts delete mode 100644 packages/uni-cli-shared/src/uni/utils.ts rename packages/uni-cloud/lib/{uni.config.js => uni.plugin.js} (60%) create mode 100644 packages/vite-plugin-uni/src/utils/plugin.ts diff --git a/packages/uni-cli-shared/src/index.ts b/packages/uni-cli-shared/src/index.ts index 6370a0953..d44b62ffe 100644 --- a/packages/uni-cli-shared/src/index.ts +++ b/packages/uni-cli-shared/src/index.ts @@ -1,5 +1,4 @@ export * from './ssr' -export * from './uni' export * from './url' export * from './deps' export * from './json' diff --git a/packages/uni-cli-shared/src/uni/compiler.ts b/packages/uni-cli-shared/src/uni/compiler.ts deleted file mode 100644 index 130d3b8c0..000000000 --- a/packages/uni-cli-shared/src/uni/compiler.ts +++ /dev/null @@ -1,44 +0,0 @@ -import debug from 'debug' -import { SyncHook, SyncWaterfallHook } from 'tapable' -import { UniPlugin } from './plugin' - -interface UniCompilerHooks { - init: SyncHook - define: SyncWaterfallHook> - inject: SyncWaterfallHook> - done: SyncHook -} - -const debugCompiler = debug('uni:compiler') - -export class UniCompiler { - hooks: UniCompilerHooks - constructor({ plugins }: { plugins: UniPlugin[] }) { - this.hooks = { - init: new SyncHook(), - define: new SyncWaterfallHook(['define']), - inject: new SyncWaterfallHook(['inject']), - done: new SyncHook(), - } - plugins.forEach((plugin) => { - debugCompiler('plugin', plugin.name) - plugin.apply(this) - }) - } - init() { - return this.hooks.init.call() - } - define() { - const define = this.hooks.define.call({}) - debugCompiler('define', define) - return define - } - inject() { - const inject = this.hooks.inject.call({}) - debugCompiler('inject', inject) - return inject - } - done() { - return this.hooks.done.call() - } -} diff --git a/packages/uni-cli-shared/src/uni/index.ts b/packages/uni-cli-shared/src/uni/index.ts deleted file mode 100644 index 0931b3b14..000000000 --- a/packages/uni-cli-shared/src/uni/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './utils' -export * from './compiler' -export * from './plugin' diff --git a/packages/uni-cli-shared/src/uni/plugin.ts b/packages/uni-cli-shared/src/uni/plugin.ts deleted file mode 100644 index 17ea0b7a7..000000000 --- a/packages/uni-cli-shared/src/uni/plugin.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { isFunction } from '@vue/shared' -import { UniCompiler } from './compiler' - -export interface UniPluginConfig { - init?: () => void - define?: () => Record - inject?: () => Record - done?: () => void -} -export class UniPlugin { - name: string - private options: UniPluginConfig - constructor(name: string, config: UniPluginConfig = {}) { - this.name = name - this.options = config - } - apply(compiler: UniCompiler) { - const { - name, - options: { init, define, inject, done }, - } = this - isFunction(init) && compiler.hooks.init.tap(name, init) - isFunction(define) && compiler.hooks.define.tap(name, define) - isFunction(inject) && compiler.hooks.inject.tap(name, inject) - isFunction(done) && compiler.hooks.done.tap(name, done) - } -} diff --git a/packages/uni-cli-shared/src/uni/utils.ts b/packages/uni-cli-shared/src/uni/utils.ts deleted file mode 100644 index d305909c8..000000000 --- a/packages/uni-cli-shared/src/uni/utils.ts +++ /dev/null @@ -1,61 +0,0 @@ -import path from 'path' -import { UniCompiler } from './compiler' -import { UniPlugin } from './plugin' -interface PluginConfig { - id: string - name: string - config: { - name: string - main?: string - } -} - -interface InitUniCompilerOptions { - root: string -} - -export function initUniCompiler(opts: InitUniCompilerOptions) { - return new UniCompiler({ plugins: initPlugins(resolvePlugins(opts)) }) -} - -function initPlugin(plugin: PluginConfig) { - const configFile = path.join( - plugin.id, - plugin.config.main || '/lib/uni.config.js' - ) - try { - /* eslint-disable no-restricted-globals */ - return new UniPlugin(plugin.id, require(configFile)) - } catch (e) { - console.warn(`${configFile} not found`) - } -} - -function initPlugins(plugins: PluginConfig[]): UniPlugin[] { - return plugins - .map((plugin) => initPlugin(plugin)) - .filter(Boolean as any) -} - -function resolvePlugins(opts: InitUniCompilerOptions) { - /* eslint-disable no-restricted-globals */ - const pkg = require(path.join(opts.root, 'package.json')) - return Object.keys(pkg.devDependencies || {}) - .concat(Object.keys(pkg.dependencies || {})) - .map((id) => { - try { - /* eslint-disable no-restricted-globals */ - const pluginPkg = require(id + '/package.json') - const config = pluginPkg['uni-app'] - if (!config || !config.name) { - return - } - return { - id, - name: config.name, - config, - } - } catch (e) {} - }) - .filter(Boolean as any) -} diff --git a/packages/uni-cloud/lib/uni.config.js b/packages/uni-cloud/lib/uni.plugin.js similarity index 60% rename from packages/uni-cloud/lib/uni.config.js rename to packages/uni-cloud/lib/uni.plugin.js index a16230c37..07cb32c13 100644 --- a/packages/uni-cloud/lib/uni.config.js +++ b/packages/uni-cloud/lib/uni.plugin.js @@ -1,13 +1,43 @@ const { once } = require('@dcloudio/uni-shared') - -module.exports = { - init, - define, - inject, - done: once(done), +const { uniInjectPlugin } = require('@dcloudio/vite-plugin-uni') +/** + * @type {import('vite').Plugin} + */ +const UniCloudPlugin = { + name: 'vite:uni-cloud', + config() { + initUniCloudEnv() + return { + define: { + 'process.env.UNI_CLOUD_PROVIDER': JSON.stringify( + process.env.UNI_CLOUD_PROVIDER + ), + 'process.env.UNICLOUD_DEBUG': JSON.stringify( + process.env.UNICLOUD_DEBUG + ), + }, + } + }, + configureServer(server) { + server.httpServer && + server.httpServer.on('listening', () => { + if (!process.UNI_CLOUD) { + return + } + process.nextTick(() => { + initUniCloudWarningOnce() + }) + }) + }, } -function init() { +const initUniCloudWarningOnce = once(() => { + console.warn( + '当前项目使用了uniCloud,为避免云函数调用跨域问题,建议在HBuilderX内置浏览器里调试,如使用外部浏览器需处理跨域,详见:https://uniapp.dcloud.io/uniCloud/quickstart?id=useinh5' + ) +}) + +function initUniCloudEnv() { process.UNI_CLOUD = false process.UNI_CLOUD_TCB = false process.UNI_CLOUD_ALIYUN = false @@ -59,25 +89,9 @@ function init() { } } -function define() { - return { - 'process.env.UNI_CLOUD_PROVIDER': JSON.stringify( - process.env.UNI_CLOUD_PROVIDER - ), - 'process.env.UNICLOUD_DEBUG': JSON.stringify(process.env.UNICLOUD_DEBUG), - } -} - -function inject() { - return { +module.exports = [ + UniCloudPlugin, + uniInjectPlugin({ uniCloud: ['@dcloudio/uni-cloud', 'default'], - } -} - -function done() { - if (process.UNI_CLOUD) { - console.warn( - '当前项目使用了uniCloud,为避免云函数调用跨域问题,建议在HBuilderX内置浏览器里调试,如使用外部浏览器需处理跨域,详见:https://uniapp.dcloud.io/uniCloud/quickstart?id=useinh5' - ) - } -} + }), +] diff --git a/packages/uni-shared/dist/uni-shared.cjs.js b/packages/uni-shared/dist/uni-shared.cjs.js index 0ffa35a21..bde020ab5 100644 --- a/packages/uni-shared/dist/uni-shared.cjs.js +++ b/packages/uni-shared/dist/uni-shared.cjs.js @@ -12,8 +12,8 @@ function initCostomDataset() { const setAttribute = prototype.setAttribute; prototype.setAttribute = function (key, value) { if (key.startsWith('data-') && this.tagName.startsWith('UNI-')) { - const dataset = (this.__uniDataset = - this.__uniDataset || {}); + const dataset = this.__uniDataset || + (this.__uniDataset = {}); dataset[formatKey(key)] = value; } setAttribute.call(this, key, value); diff --git a/packages/uni-shared/dist/uni-shared.es.js b/packages/uni-shared/dist/uni-shared.es.js index 2ed21b2b6..ec5dc9fc8 100644 --- a/packages/uni-shared/dist/uni-shared.es.js +++ b/packages/uni-shared/dist/uni-shared.es.js @@ -8,8 +8,8 @@ function initCostomDataset() { const setAttribute = prototype.setAttribute; prototype.setAttribute = function (key, value) { if (key.startsWith('data-') && this.tagName.startsWith('UNI-')) { - const dataset = (this.__uniDataset = - this.__uniDataset || {}); + const dataset = this.__uniDataset || + (this.__uniDataset = {}); dataset[formatKey(key)] = value; } setAttribute.call(this, key, value); diff --git a/packages/uni-shared/src/dom/costomDataset.ts b/packages/uni-shared/src/dom/costomDataset.ts index f7c50c421..6e955b550 100644 --- a/packages/uni-shared/src/dom/costomDataset.ts +++ b/packages/uni-shared/src/dom/costomDataset.ts @@ -12,8 +12,9 @@ export function initCostomDataset() { const setAttribute = prototype.setAttribute prototype.setAttribute = function (key, value) { if (key.startsWith('data-') && this.tagName.startsWith('UNI-')) { - const dataset = ((this as HTMLElementWithDataset).__uniDataset = - (this as HTMLElementWithDataset).__uniDataset || {}) + const dataset = + (this as HTMLElementWithDataset).__uniDataset || + ((this as HTMLElementWithDataset).__uniDataset = {}) dataset[formatKey(key)] = value } setAttribute.call(this, key, value) diff --git a/packages/vite-plugin-uni/src/config/index.ts b/packages/vite-plugin-uni/src/config/index.ts index bac0904ff..9eb0892bd 100644 --- a/packages/vite-plugin-uni/src/config/index.ts +++ b/packages/vite-plugin-uni/src/config/index.ts @@ -1,5 +1,4 @@ import path from 'path' -import { extend } from '@vue/shared' import { Plugin, UserConfig } from 'vite' import { normalizePath, parseManifestJsonOnce } from '@dcloudio/uni-cli-shared' @@ -44,14 +43,13 @@ export function createConfig( options.vueOptions = initPluginVueOptions(options) options.vueJsxOptions = initPluginVueJsxOptions(options) options.viteLegacyOptions = initPluginViteLegacyOptions(options) - options.compiler.init() const define = createDefine(options, config, env) return { base, publicDir: config.publicDir || false, - define: extend(define, options.compiler.define()), + define, resolve: createResolve(options, config), optimizeDeps: createOptimizeDeps(options), server: createServer(options), diff --git a/packages/vite-plugin-uni/src/configResolved/plugins/index.ts b/packages/vite-plugin-uni/src/configResolved/plugins/index.ts index 633b2538d..570a512fe 100644 --- a/packages/vite-plugin-uni/src/configResolved/plugins/index.ts +++ b/packages/vite-plugin-uni/src/configResolved/plugins/index.ts @@ -122,24 +122,9 @@ export function initPlugins( addPlugin(plugins, uniPreVuePlugin(), 'vite:vue', 'pre') addPlugin(plugins, uniRenderjsPlugin(), 'vite:vue') - const injectOptions = options.compiler.inject() // 可以考虑使用apply:'build' if (command === 'build') { - addPlugin( - plugins, - uniInjectPlugin(extend(uniInjectPluginOptions, injectOptions)), - 'vite:vue' - ) - } else { - if (injectOptions && Object.keys(injectOptions).length) { - addPlugin( - plugins, - uniInjectPlugin( - extend({ exclude: [...COMMON_EXCLUDE] }, injectOptions) - ), - 'vite:vue' - ) - } + addPlugin(plugins, uniInjectPlugin(uniInjectPluginOptions), 'vite:vue') } addPlugin( diff --git a/packages/vite-plugin-uni/src/configureServer/index.ts b/packages/vite-plugin-uni/src/configureServer/index.ts index 24fc808e8..31c6cb7de 100644 --- a/packages/vite-plugin-uni/src/configureServer/index.ts +++ b/packages/vite-plugin-uni/src/configureServer/index.ts @@ -9,10 +9,6 @@ export function createConfigureServer( return function (server) { options.devServer = server serveEasycom(server, options) - server.httpServer && - server.httpServer.on('listening', () => { - process.nextTick(() => options.compiler.done()) - }) return () => { serveStatic(server, options) } diff --git a/packages/vite-plugin-uni/src/index.ts b/packages/vite-plugin-uni/src/index.ts index 673c4f4cf..5c7d60fe2 100644 --- a/packages/vite-plugin-uni/src/index.ts +++ b/packages/vite-plugin-uni/src/index.ts @@ -1,5 +1,4 @@ import { Plugin, ResolvedConfig, ViteDevServer } from 'vite' -import { UniCompiler, initUniCompiler } from '@dcloudio/uni-cli-shared' import { Options as VueOptions } from '@vitejs/plugin-vue' import { Options as ViteLegacyOptions } from '@vitejs/plugin-legacy' import { VueJSXPluginOptions } from '@vue/babel-plugin-jsx' @@ -10,6 +9,7 @@ import { createConfig } from './config' import { createConfigResolved } from './configResolved' import { createConfigureServer } from './configureServer' import { createHandleHotUpdate } from './handleHotUpdate' +import { initExtraPlugins } from './utils' export interface VitePluginUniOptions { inputDir?: string outputDir?: string @@ -25,7 +25,6 @@ export interface VitePluginUniResolvedOptions extends VitePluginUniOptions { outputDir: string assetsDir: string devServer?: ViteDevServer - compiler: UniCompiler } export * from './vue' @@ -51,9 +50,6 @@ export default function uniPlugin( outputDir: '', command: 'serve', platform: 'h5', - compiler: initUniCompiler({ - root: process.env.UNI_CLI_CONTEXT || process.cwd(), - }), } const plugins: Plugin[] = [] @@ -75,5 +71,13 @@ export default function uniPlugin( configureServer: createConfigureServer(options), handleHotUpdate: createHandleHotUpdate(options), }) + plugins.push( + ...initExtraPlugins( + process.env.UNI_CLI_CONTEXT || process.cwd(), + (process.env.UNI_PLATFORM as UniApp.PLATFORM) || 'h5' + ) + ) return plugins } + +export { uniInjectPlugin } from './configResolved/plugins/inject' diff --git a/packages/vite-plugin-uni/src/utils/index.ts b/packages/vite-plugin-uni/src/utils/index.ts index 32b21aaae..e2962afe5 100644 --- a/packages/vite-plugin-uni/src/utils/index.ts +++ b/packages/vite-plugin-uni/src/utils/index.ts @@ -1,6 +1,7 @@ export * from './ast' export * from './ssr' export * from './filter' +export * from './plugin' export * from './features' export * from './easycom' export * from './postcss' diff --git a/packages/vite-plugin-uni/src/utils/plugin.ts b/packages/vite-plugin-uni/src/utils/plugin.ts new file mode 100644 index 000000000..08971fbed --- /dev/null +++ b/packages/vite-plugin-uni/src/utils/plugin.ts @@ -0,0 +1,67 @@ +import { isArray, isString } from '@vue/shared' +import path from 'path' + +import { Plugin } from 'vite' + +interface PluginConfig { + id: string + name: string + apply?: UniApp.PLATFORM | UniApp.PLATFORM[] + config: { + name: string + main?: string + } +} + +export function initExtraPlugins(cliRoot: string, platform: UniApp.PLATFORM) { + return initPlugins(resolvePlugins(cliRoot, platform)) +} + +function initPlugin(plugin: PluginConfig): Plugin | void { + const configFile = path.join( + plugin.id, + plugin.config.main || '/lib/uni.plugin.js' + ) + try { + return require(configFile) + } catch (e) { + console.warn(`${configFile} not found`) + } +} + +function initPlugins(plugins: PluginConfig[]): Plugin[] { + return plugins + .map((plugin) => initPlugin(plugin)) + .filter(Boolean as any) +} + +function resolvePlugins(cliRoot: string, platform: UniApp.PLATFORM) { + const pkg = require(path.join(cliRoot, 'package.json')) + return Object.keys(pkg.devDependencies || {}) + .concat(Object.keys(pkg.dependencies || {})) + .map((id) => { + try { + const pluginPkg = require(id + '/package.json') + const config = pluginPkg['uni-app'] as PluginConfig + if (!config || !config.name) { + return + } + const { apply } = config + if (isArray(apply)) { + if (!apply.includes(platform)) { + return + } + } else if (isString(apply)) { + if (apply !== platform) { + return + } + } + return { + id, + name: config.name, + config, + } + } catch (e) {} + }) + .filter(Boolean as any) +} -- GitLab