From 4828c8b70e0987067ca02603d5a944dfc086e007 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Mon, 14 Feb 2022 20:41:08 +0800 Subject: [PATCH] wip(app): nvue --- packages/shims-node.d.ts | 2 +- packages/uni-app-vite/src/index.ts | 5 ++++- packages/uni-app-vite/src/nvue/index.ts | 12 ++++++------ packages/uni-app-vite/src/nvue/plugin/index.ts | 8 ++++++-- .../uni-app-vite/src/nvue/plugins/esbuild.ts | 10 +++++----- .../uni-app-vite/src/nvue/plugins/mainJs.ts | 4 ++-- .../uni-app-vite/src/nvue/plugins/pagesJson.ts | 8 ++++++-- packages/uni-app-vite/src/plugin/build.ts | 14 ++++++++++---- packages/uni-app-vite/src/plugin/index.ts | 18 ++++++++++++------ packages/uni-app-vite/src/utils.ts | 7 +++++-- packages/vite-plugin-uni/src/cli/build.ts | 4 ++-- packages/vite-plugin-uni/src/index.ts | 7 ++++--- 12 files changed, 63 insertions(+), 36 deletions(-) diff --git a/packages/shims-node.d.ts b/packages/shims-node.d.ts index 5e771ee01..e6e48fe2c 100644 --- a/packages/shims-node.d.ts +++ b/packages/shims-node.d.ts @@ -27,6 +27,6 @@ declare namespace NodeJS { UNI_CUSTOM_CONTEXT?: string UNI_MINIMIZE?: 'true' UNI_COMPILER: 'vue' | 'nvue' - UNI_COMPILER_NVUE: 'app' | 'page' + UNI_RENDERER_NATIVE: 'appService' | 'pages' } } diff --git a/packages/uni-app-vite/src/index.ts b/packages/uni-app-vite/src/index.ts index 58bd1d901..0434c172a 100644 --- a/packages/uni-app-vite/src/index.ts +++ b/packages/uni-app-vite/src/index.ts @@ -3,7 +3,10 @@ import { initNVuePlugins } from './nvue' import { uniAppPlugin } from './plugin' export default () => { return [ - uniAppPlugin({ renderer: process.env.UNI_RENDERER }), + uniAppPlugin({ + renderer: process.env.UNI_RENDERER, + appService: process.env.UNI_RENDERER_NATIVE === 'appService', + }), ...(process.env.UNI_COMPILER === 'nvue' ? initNVuePlugins() : initVuePlugins()), diff --git a/packages/uni-app-vite/src/nvue/index.ts b/packages/uni-app-vite/src/nvue/index.ts index 02848134e..50b9c17dc 100644 --- a/packages/uni-app-vite/src/nvue/index.ts +++ b/packages/uni-app-vite/src/nvue/index.ts @@ -18,17 +18,17 @@ export { initNVueNodeTransforms } from './plugin' export function initNVuePlugins() { const renderer = process.env.UNI_RENDERER - const app = process.env.UNI_COMPILER_NVUE === 'app' + const appService = process.env.UNI_RENDERER_NATIVE === 'appService' return [ uniAppCssPlugin(), uniEasycomPlugin({ exclude: UNI_EASYCOM_EXCLUDE }), uniHBuilderXConsolePlugin(), - uniMainJsPlugin({ app }), - ...(app ? [uniManifestJsonPlugin()] : []), - uniPagesJsonPlugin({ app }), + uniMainJsPlugin({ appService }), + ...(appService ? [uniManifestJsonPlugin()] : []), + uniPagesJsonPlugin({ appService }), uniViteInjectPlugin('uni:app-inject', initAppProvide()), uniStatsPlugin(), - uniAppNVuePlugin(), - uniEsbuildPlugin({ renderer, app }), + uniAppNVuePlugin({ appService }), + uniEsbuildPlugin({ renderer, appService }), ] } diff --git a/packages/uni-app-vite/src/nvue/plugin/index.ts b/packages/uni-app-vite/src/nvue/plugin/index.ts index 67ee6aae8..120028f1b 100644 --- a/packages/uni-app-vite/src/nvue/plugin/index.ts +++ b/packages/uni-app-vite/src/nvue/plugin/index.ts @@ -45,7 +45,11 @@ export function initNVueNodeTransforms() { ] } -export function uniAppNVuePlugin(): Plugin { +export function uniAppNVuePlugin({ + appService, +}: { + appService: boolean +}): Plugin { const inputDir = process.env.UNI_INPUT_DIR const mainPath = resolveMainPathOnce(inputDir) return { @@ -67,7 +71,7 @@ export function uniAppNVuePlugin(): Plugin { entry: mainPath, formats: ['es'], }, - outDir: nvueOutDir(), + outDir: nvueOutDir(appService), rollupOptions: { external, output: { diff --git a/packages/uni-app-vite/src/nvue/plugins/esbuild.ts b/packages/uni-app-vite/src/nvue/plugins/esbuild.ts index b33bcf845..ecb04f94b 100644 --- a/packages/uni-app-vite/src/nvue/plugins/esbuild.ts +++ b/packages/uni-app-vite/src/nvue/plugins/esbuild.ts @@ -18,10 +18,10 @@ const debugEsbuild = debug('uni:app-nvue-esbuild') export function uniEsbuildPlugin({ renderer, - app, + appService, }: { renderer?: 'native' - app: boolean + appService: boolean }): Plugin { let buildOptions: BuildOptions const outputDir = process.env.UNI_OUTPUT_DIR @@ -52,7 +52,7 @@ export function uniEsbuildPlugin({ entryPoints.push(name) } }) - if (app) { + if (appService) { debugEsbuild('start', APP_SERVICE_FILENAME) await buildNVueAppService(buildOptions).then((code) => { return fs.outputFile( @@ -75,7 +75,7 @@ export function uniEsbuildPlugin({ function buildNVueAppService(options: BuildOptions) { return transformWithEsbuild( `import './app.js'`, - path.join(nvueOutDir(), 'main.js'), + path.join(nvueOutDir(true), 'main.js'), options ).then((res) => { if (res.outputFiles) { @@ -106,7 +106,7 @@ App.mpType = 'page' const app = Vue.createApp(App,{$store:getApp().$store,__pageId,__pagePath,__pageQuery}) app.provide('__globalStyles', Vue.useCssStyles([...AppStyles, ...(App.styles||[])])) app.mount('#root')`, - path.join(nvueOutDir(), 'main.js'), + path.join(nvueOutDir(false), 'main.js'), options ).then((res) => { if (res.outputFiles) { diff --git a/packages/uni-app-vite/src/nvue/plugins/mainJs.ts b/packages/uni-app-vite/src/nvue/plugins/mainJs.ts index 559d85dd3..d6305ae4c 100644 --- a/packages/uni-app-vite/src/nvue/plugins/mainJs.ts +++ b/packages/uni-app-vite/src/nvue/plugins/mainJs.ts @@ -1,14 +1,14 @@ import { defineUniMainJsPlugin, PAGES_JSON_JS } from '@dcloudio/uni-cli-shared' import { APP_CSS_JS } from './appCss' -export function uniMainJsPlugin({ app }: { app: boolean }) { +export function uniMainJsPlugin({ appService }: { appService: boolean }) { return defineUniMainJsPlugin((opts) => { return { name: 'uni:app-nvue-main-js', enforce: 'pre', transform(code, id) { if (opts.filter(id)) { - if (app) { + if (appService) { code = code.includes('createSSRApp') ? createApp(code) : createLegacyApp(code) diff --git a/packages/uni-app-vite/src/nvue/plugins/pagesJson.ts b/packages/uni-app-vite/src/nvue/plugins/pagesJson.ts index 54062f534..50d3f1a77 100644 --- a/packages/uni-app-vite/src/nvue/plugins/pagesJson.ts +++ b/packages/uni-app-vite/src/nvue/plugins/pagesJson.ts @@ -11,7 +11,11 @@ import { MANIFEST_JSON_JS, } from '@dcloudio/uni-cli-shared' -export function uniPagesJsonPlugin({ app }: { app: boolean }): Plugin { +export function uniPagesJsonPlugin({ + appService, +}: { + appService: boolean +}): Plugin { return defineUniPagesJsonPlugin((opts) => { return { name: 'uni:app-nvue-pages-json', @@ -34,7 +38,7 @@ export function uniPagesJsonPlugin({ app }: { app: boolean }): Plugin { ) } }) - if (app) { + if (appService) { this.emitFile({ fileName: `app-config-service.js`, type: 'asset', diff --git a/packages/uni-app-vite/src/plugin/build.ts b/packages/uni-app-vite/src/plugin/build.ts index 95992905a..72449bdbe 100644 --- a/packages/uni-app-vite/src/plugin/build.ts +++ b/packages/uni-app-vite/src/plugin/build.ts @@ -11,7 +11,10 @@ import { import { nvueOutDir } from '../utils' export function buildOptions( - renderer: 'native' | undefined, + { + appService, + renderer, + }: { renderer: 'native' | undefined; appService: boolean }, userConfig: UserConfig, _: ConfigEnv ): UserConfig['build'] { @@ -19,7 +22,7 @@ export function buildOptions( const outputDir = process.env.UNI_OUTPUT_DIR // 开始编译时,清空输出目录 function emptyNVueDir() { - const nvueOutputDir = nvueOutDir() + const nvueOutputDir = nvueOutDir(false) if (fs.existsSync(nvueOutputDir)) { emptyDir(nvueOutputDir) } @@ -30,8 +33,11 @@ export function buildOptions( } } if (renderer === 'native') { - emptyNVueDir() - emptyOutDir() + if (appService) { + // 仅编译 main.js+App.vue 的时候才清空 + emptyNVueDir() + emptyOutDir() + } } else { if (isInHybridNVue(userConfig)) { emptyNVueDir() diff --git a/packages/uni-app-vite/src/plugin/index.ts b/packages/uni-app-vite/src/plugin/index.ts index a5dad5847..e5fb0364f 100644 --- a/packages/uni-app-vite/src/plugin/index.ts +++ b/packages/uni-app-vite/src/plugin/index.ts @@ -3,17 +3,23 @@ import { UniVitePlugin } from '@dcloudio/uni-cli-shared' import { uniOptions } from './uni' import { buildOptions } from './build' -export function uniAppPlugin({ - renderer, -}: { - renderer?: 'native' -} = {}): UniVitePlugin { +export function uniAppPlugin( + { + renderer, + appService, + }: { + renderer?: 'native' + appService: boolean + } = { + appService: false, + } +): UniVitePlugin { return { name: 'uni:app', uni: uniOptions(), config(config, env) { return { - build: buildOptions(renderer, config, env), + build: buildOptions({ renderer, appService }, config, env), } }, } diff --git a/packages/uni-app-vite/src/utils.ts b/packages/uni-app-vite/src/utils.ts index bb1580478..837e462b0 100644 --- a/packages/uni-app-vite/src/utils.ts +++ b/packages/uni-app-vite/src/utils.ts @@ -1,5 +1,8 @@ import path from 'path' export const templateDir = path.resolve(__dirname, '../lib/template/') -export function nvueOutDir() { - return path.join(process.env.UNI_OUTPUT_DIR, '../.nvue') +export function nvueOutDir(appService: boolean) { + return path.join( + process.env.UNI_OUTPUT_DIR, + '../.nvue' + (appService ? '/.app-service' : '') + ) } diff --git a/packages/vite-plugin-uni/src/cli/build.ts b/packages/vite-plugin-uni/src/cli/build.ts index b41af44ed..627feb330 100644 --- a/packages/vite-plugin-uni/src/cli/build.ts +++ b/packages/vite-plugin-uni/src/cli/build.ts @@ -101,7 +101,7 @@ export async function buildApp(options: CliOptions) { if (process.env.UNI_RENDERER === 'native') { // 纯原生渲染时,main.js + App.vue 需要跟页面分开,独立编译(因为需要包含 Vuex 等共享内容) process.env.UNI_COMPILER = 'nvue' - process.env.UNI_COMPILER_NVUE = 'app' + process.env.UNI_RENDERER_NATIVE = 'appService' const nvueAppBuilder = await buildByVite( addConfigFile( extend( @@ -110,7 +110,7 @@ export async function buildApp(options: CliOptions) { ) ) ) - process.env.UNI_COMPILER_NVUE = 'page' + process.env.UNI_RENDERER_NATIVE = 'pages' const nvueBuilder = await buildByVite( addConfigFile( extend( diff --git a/packages/vite-plugin-uni/src/index.ts b/packages/vite-plugin-uni/src/index.ts index 039d751cb..bf0e3468d 100644 --- a/packages/vite-plugin-uni/src/index.ts +++ b/packages/vite-plugin-uni/src/index.ts @@ -134,10 +134,11 @@ export default function uniPlugin( vuePlugin(initPluginVueOptions(options, uniPlugins, uniPluginOptions)) ) - // 混合编译时,nvue 下,不需要 copy + // 仅在 vue 或 纯原生 App.vue 编译时做 copy if ( - process.env.UNI_RENDERER === 'native' || - process.env.UNI_COMPILER === 'vue' + process.env.UNI_COMPILER === 'vue' || + (process.env.UNI_RENDERER === 'native' && + process.env.UNI_COMPILER_NVUE === 'app') ) { plugins.push( uniCopyPlugin({ -- GitLab