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

wip(app): nvue

上级 1f59921b
......@@ -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'
}
}
......@@ -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()),
......
......@@ -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 }),
]
}
......@@ -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: {
......
......@@ -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) {
......
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)
......
......@@ -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',
......
......@@ -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()
......
......@@ -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),
}
},
}
......
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' : '')
)
}
......@@ -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(
......
......@@ -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({
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册