diff --git a/packages/shims-node.d.ts b/packages/shims-node.d.ts index 5e771ee017a6d3f0f93d47d5969307138f784828..e6e48fe2c2ec91285a7bb1988590f132d53ddc20 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 58bd1d901807b8bb0372cc48a548bf08503d2cad..0434c172a299f5620f648222ffc0936bfc7d3768 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 02848134eade7bf91a36de6d5687c0453f10d336..50b9c17dcbaabeb3dd76c0656343a341fb2247f5 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 67ee6aae829f390f4837547ffc37e84446e64800..120028f1b63988f14ead54ac5653d6fca3990e82 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 b33bcf845f388374e2a0de3bb27db66abb15c3a7..ecb04f94be96058c83f26d7572712538f922a0fe 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 559d85dd3b7566ead5bb2e7a4ef915cab1ce0c97..d6305ae4c849ed4ee79e747d6e37f201006e7f25 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 54062f534935584a2f3ee6b5a209951698aec015..50d3f1a77eb0a92f3580a4e654b8c5860c9e9d5f 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 95992905a9c92f5f2e014ca72dd51838c23208af..72449bdbef5a91e199fd0941597288c217748167 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 a5dad58470089f1a2806d3d8d7ee891a1683d3af..e5fb0364feb10e51846117e79891246383ea4e7e 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 bb1580478fcea1241f7ce0a6af3ee6743856c553..837e462b0139a9bacc3d2f06f7171820a00ab83d 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 b41af44ed5cb916674d116594dc8d8e124e34221..627feb3306c878f86defb6b9a8acf398b2cfe641 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 039d751cb53a95258a821cc72e86ae70abf73eaf..bf0e3468d71dbe20a154218c436ee037d7889fe2 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({