提交 4828c8b7 编写于 作者: fxy060608's avatar fxy060608

wip(app): nvue

上级 1f59921b
...@@ -27,6 +27,6 @@ declare namespace NodeJS { ...@@ -27,6 +27,6 @@ declare namespace NodeJS {
UNI_CUSTOM_CONTEXT?: string UNI_CUSTOM_CONTEXT?: string
UNI_MINIMIZE?: 'true' UNI_MINIMIZE?: 'true'
UNI_COMPILER: 'vue' | 'nvue' UNI_COMPILER: 'vue' | 'nvue'
UNI_COMPILER_NVUE: 'app' | 'page' UNI_RENDERER_NATIVE: 'appService' | 'pages'
} }
} }
...@@ -3,7 +3,10 @@ import { initNVuePlugins } from './nvue' ...@@ -3,7 +3,10 @@ import { initNVuePlugins } from './nvue'
import { uniAppPlugin } from './plugin' import { uniAppPlugin } from './plugin'
export default () => { export default () => {
return [ 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' ...(process.env.UNI_COMPILER === 'nvue'
? initNVuePlugins() ? initNVuePlugins()
: initVuePlugins()), : initVuePlugins()),
......
...@@ -18,17 +18,17 @@ export { initNVueNodeTransforms } from './plugin' ...@@ -18,17 +18,17 @@ export { initNVueNodeTransforms } from './plugin'
export function initNVuePlugins() { export function initNVuePlugins() {
const renderer = process.env.UNI_RENDERER const renderer = process.env.UNI_RENDERER
const app = process.env.UNI_COMPILER_NVUE === 'app' const appService = process.env.UNI_RENDERER_NATIVE === 'appService'
return [ return [
uniAppCssPlugin(), uniAppCssPlugin(),
uniEasycomPlugin({ exclude: UNI_EASYCOM_EXCLUDE }), uniEasycomPlugin({ exclude: UNI_EASYCOM_EXCLUDE }),
uniHBuilderXConsolePlugin(), uniHBuilderXConsolePlugin(),
uniMainJsPlugin({ app }), uniMainJsPlugin({ appService }),
...(app ? [uniManifestJsonPlugin()] : []), ...(appService ? [uniManifestJsonPlugin()] : []),
uniPagesJsonPlugin({ app }), uniPagesJsonPlugin({ appService }),
uniViteInjectPlugin('uni:app-inject', initAppProvide()), uniViteInjectPlugin('uni:app-inject', initAppProvide()),
uniStatsPlugin(), uniStatsPlugin(),
uniAppNVuePlugin(), uniAppNVuePlugin({ appService }),
uniEsbuildPlugin({ renderer, app }), uniEsbuildPlugin({ renderer, appService }),
] ]
} }
...@@ -45,7 +45,11 @@ export function initNVueNodeTransforms() { ...@@ -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 inputDir = process.env.UNI_INPUT_DIR
const mainPath = resolveMainPathOnce(inputDir) const mainPath = resolveMainPathOnce(inputDir)
return { return {
...@@ -67,7 +71,7 @@ export function uniAppNVuePlugin(): Plugin { ...@@ -67,7 +71,7 @@ export function uniAppNVuePlugin(): Plugin {
entry: mainPath, entry: mainPath,
formats: ['es'], formats: ['es'],
}, },
outDir: nvueOutDir(), outDir: nvueOutDir(appService),
rollupOptions: { rollupOptions: {
external, external,
output: { output: {
......
...@@ -18,10 +18,10 @@ const debugEsbuild = debug('uni:app-nvue-esbuild') ...@@ -18,10 +18,10 @@ const debugEsbuild = debug('uni:app-nvue-esbuild')
export function uniEsbuildPlugin({ export function uniEsbuildPlugin({
renderer, renderer,
app, appService,
}: { }: {
renderer?: 'native' renderer?: 'native'
app: boolean appService: boolean
}): Plugin { }): Plugin {
let buildOptions: BuildOptions let buildOptions: BuildOptions
const outputDir = process.env.UNI_OUTPUT_DIR const outputDir = process.env.UNI_OUTPUT_DIR
...@@ -52,7 +52,7 @@ export function uniEsbuildPlugin({ ...@@ -52,7 +52,7 @@ export function uniEsbuildPlugin({
entryPoints.push(name) entryPoints.push(name)
} }
}) })
if (app) { if (appService) {
debugEsbuild('start', APP_SERVICE_FILENAME) debugEsbuild('start', APP_SERVICE_FILENAME)
await buildNVueAppService(buildOptions).then((code) => { await buildNVueAppService(buildOptions).then((code) => {
return fs.outputFile( return fs.outputFile(
...@@ -75,7 +75,7 @@ export function uniEsbuildPlugin({ ...@@ -75,7 +75,7 @@ export function uniEsbuildPlugin({
function buildNVueAppService(options: BuildOptions) { function buildNVueAppService(options: BuildOptions) {
return transformWithEsbuild( return transformWithEsbuild(
`import './app.js'`, `import './app.js'`,
path.join(nvueOutDir(), 'main.js'), path.join(nvueOutDir(true), 'main.js'),
options options
).then((res) => { ).then((res) => {
if (res.outputFiles) { if (res.outputFiles) {
...@@ -106,7 +106,7 @@ App.mpType = 'page' ...@@ -106,7 +106,7 @@ App.mpType = 'page'
const app = Vue.createApp(App,{$store:getApp().$store,__pageId,__pagePath,__pageQuery}) const app = Vue.createApp(App,{$store:getApp().$store,__pageId,__pagePath,__pageQuery})
app.provide('__globalStyles', Vue.useCssStyles([...AppStyles, ...(App.styles||[])])) app.provide('__globalStyles', Vue.useCssStyles([...AppStyles, ...(App.styles||[])]))
app.mount('#root')`, app.mount('#root')`,
path.join(nvueOutDir(), 'main.js'), path.join(nvueOutDir(false), 'main.js'),
options options
).then((res) => { ).then((res) => {
if (res.outputFiles) { if (res.outputFiles) {
......
import { defineUniMainJsPlugin, PAGES_JSON_JS } from '@dcloudio/uni-cli-shared' import { defineUniMainJsPlugin, PAGES_JSON_JS } from '@dcloudio/uni-cli-shared'
import { APP_CSS_JS } from './appCss' import { APP_CSS_JS } from './appCss'
export function uniMainJsPlugin({ app }: { app: boolean }) { export function uniMainJsPlugin({ appService }: { appService: boolean }) {
return defineUniMainJsPlugin((opts) => { return defineUniMainJsPlugin((opts) => {
return { return {
name: 'uni:app-nvue-main-js', name: 'uni:app-nvue-main-js',
enforce: 'pre', enforce: 'pre',
transform(code, id) { transform(code, id) {
if (opts.filter(id)) { if (opts.filter(id)) {
if (app) { if (appService) {
code = code.includes('createSSRApp') code = code.includes('createSSRApp')
? createApp(code) ? createApp(code)
: createLegacyApp(code) : createLegacyApp(code)
......
...@@ -11,7 +11,11 @@ import { ...@@ -11,7 +11,11 @@ import {
MANIFEST_JSON_JS, MANIFEST_JSON_JS,
} from '@dcloudio/uni-cli-shared' } from '@dcloudio/uni-cli-shared'
export function uniPagesJsonPlugin({ app }: { app: boolean }): Plugin { export function uniPagesJsonPlugin({
appService,
}: {
appService: boolean
}): Plugin {
return defineUniPagesJsonPlugin((opts) => { return defineUniPagesJsonPlugin((opts) => {
return { return {
name: 'uni:app-nvue-pages-json', name: 'uni:app-nvue-pages-json',
...@@ -34,7 +38,7 @@ export function uniPagesJsonPlugin({ app }: { app: boolean }): Plugin { ...@@ -34,7 +38,7 @@ export function uniPagesJsonPlugin({ app }: { app: boolean }): Plugin {
) )
} }
}) })
if (app) { if (appService) {
this.emitFile({ this.emitFile({
fileName: `app-config-service.js`, fileName: `app-config-service.js`,
type: 'asset', type: 'asset',
......
...@@ -11,7 +11,10 @@ import { ...@@ -11,7 +11,10 @@ import {
import { nvueOutDir } from '../utils' import { nvueOutDir } from '../utils'
export function buildOptions( export function buildOptions(
renderer: 'native' | undefined, {
appService,
renderer,
}: { renderer: 'native' | undefined; appService: boolean },
userConfig: UserConfig, userConfig: UserConfig,
_: ConfigEnv _: ConfigEnv
): UserConfig['build'] { ): UserConfig['build'] {
...@@ -19,7 +22,7 @@ export function buildOptions( ...@@ -19,7 +22,7 @@ export function buildOptions(
const outputDir = process.env.UNI_OUTPUT_DIR const outputDir = process.env.UNI_OUTPUT_DIR
// 开始编译时,清空输出目录 // 开始编译时,清空输出目录
function emptyNVueDir() { function emptyNVueDir() {
const nvueOutputDir = nvueOutDir() const nvueOutputDir = nvueOutDir(false)
if (fs.existsSync(nvueOutputDir)) { if (fs.existsSync(nvueOutputDir)) {
emptyDir(nvueOutputDir) emptyDir(nvueOutputDir)
} }
...@@ -30,8 +33,11 @@ export function buildOptions( ...@@ -30,8 +33,11 @@ export function buildOptions(
} }
} }
if (renderer === 'native') { if (renderer === 'native') {
emptyNVueDir() if (appService) {
emptyOutDir() // 仅编译 main.js+App.vue 的时候才清空
emptyNVueDir()
emptyOutDir()
}
} else { } else {
if (isInHybridNVue(userConfig)) { if (isInHybridNVue(userConfig)) {
emptyNVueDir() emptyNVueDir()
......
...@@ -3,17 +3,23 @@ import { UniVitePlugin } from '@dcloudio/uni-cli-shared' ...@@ -3,17 +3,23 @@ import { UniVitePlugin } from '@dcloudio/uni-cli-shared'
import { uniOptions } from './uni' import { uniOptions } from './uni'
import { buildOptions } from './build' import { buildOptions } from './build'
export function uniAppPlugin({ export function uniAppPlugin(
renderer, {
}: { renderer,
renderer?: 'native' appService,
} = {}): UniVitePlugin { }: {
renderer?: 'native'
appService: boolean
} = {
appService: false,
}
): UniVitePlugin {
return { return {
name: 'uni:app', name: 'uni:app',
uni: uniOptions(), uni: uniOptions(),
config(config, env) { config(config, env) {
return { return {
build: buildOptions(renderer, config, env), build: buildOptions({ renderer, appService }, config, env),
} }
}, },
} }
......
import path from 'path' import path from 'path'
export const templateDir = path.resolve(__dirname, '../lib/template/') export const templateDir = path.resolve(__dirname, '../lib/template/')
export function nvueOutDir() { export function nvueOutDir(appService: boolean) {
return path.join(process.env.UNI_OUTPUT_DIR, '../.nvue') return path.join(
process.env.UNI_OUTPUT_DIR,
'../.nvue' + (appService ? '/.app-service' : '')
)
} }
...@@ -101,7 +101,7 @@ export async function buildApp(options: CliOptions) { ...@@ -101,7 +101,7 @@ export async function buildApp(options: CliOptions) {
if (process.env.UNI_RENDERER === 'native') { if (process.env.UNI_RENDERER === 'native') {
// 纯原生渲染时,main.js + App.vue 需要跟页面分开,独立编译(因为需要包含 Vuex 等共享内容) // 纯原生渲染时,main.js + App.vue 需要跟页面分开,独立编译(因为需要包含 Vuex 等共享内容)
process.env.UNI_COMPILER = 'nvue' process.env.UNI_COMPILER = 'nvue'
process.env.UNI_COMPILER_NVUE = 'app' process.env.UNI_RENDERER_NATIVE = 'appService'
const nvueAppBuilder = await buildByVite( const nvueAppBuilder = await buildByVite(
addConfigFile( addConfigFile(
extend( extend(
...@@ -110,7 +110,7 @@ export async function buildApp(options: CliOptions) { ...@@ -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( const nvueBuilder = await buildByVite(
addConfigFile( addConfigFile(
extend( extend(
......
...@@ -134,10 +134,11 @@ export default function uniPlugin( ...@@ -134,10 +134,11 @@ export default function uniPlugin(
vuePlugin(initPluginVueOptions(options, uniPlugins, uniPluginOptions)) vuePlugin(initPluginVueOptions(options, uniPlugins, uniPluginOptions))
) )
// 混合编译时,nvue 下,不需要 copy // 仅在 vue 或 纯原生 App.vue 编译时做 copy
if ( 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( plugins.push(
uniCopyPlugin({ uniCopyPlugin({
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册