提交 8af8da50 编写于 作者: fxy060608's avatar fxy060608

wip(app): nvue

上级 b56be6b3
......@@ -33,6 +33,7 @@
"devDependencies": {
"@types/debug": "^4.1.7",
"@types/fs-extra": "^9.0.13",
"@vue/compiler-core": "3.2.26"
"@vue/compiler-core": "3.2.26",
"esbuild": "^0.13.12"
}
}
......@@ -7,6 +7,7 @@ import {
import { uniEasycomPlugin } from '../plugins/easycom'
import { uniManifestJsonPlugin } from '../plugins/manifestJson'
import { uniStatsPlugin } from '../plugins/stats'
import { uniAppNVuePlugin } from './plugin'
import { uniEsbuildPlugin } from './plugins/esbuild'
import { uniMainJsPlugin } from './plugins/mainJs'
......@@ -20,6 +21,7 @@ export function initNVuePlugins() {
...(process.env.UNI_RENDERER === 'native' ? [uniManifestJsonPlugin()] : []),
uniPagesJsonPlugin(),
uniViteInjectPlugin('uni:app-inject', initAppProvide()),
uniStatsPlugin(),
uniAppNVuePlugin(),
uniEsbuildPlugin(),
]
......
import { esbuild } from '@dcloudio/uni-cli-shared'
import path from 'path'
import fs from 'fs-extra'
import { transformWithEsbuild } from '@dcloudio/uni-cli-shared'
import type { BuildOptions, PluginBuild } from 'esbuild'
import type { Plugin } from 'vite'
import { nvueOutDir } from '../../utils'
export function uniEsbuildPlugin(): Plugin {
let buildOptions: BuildOptions
const outputDir = process.env.UNI_OUTPUT_DIR
return {
name: 'uni:app-nvue-esbuild',
enforce: 'post',
configResolved(config) {
buildOptions = {
format: 'iife',
minify: config.build.minify ? true : false,
bundle: true,
write: false,
plugins: [esbuildGlobalPlugin({ vue: 'Vue' })],
}
},
async writeBundle(_, bundle) {
const entryPoints: string[] = []
Object.keys(bundle).forEach((name) => {
......@@ -18,12 +32,48 @@ export function uniEsbuildPlugin(): Plugin {
entryPoints.push(name)
}
})
await esbuild({
absWorkingDir: nvueOutDir(),
entryPoints,
bundle: true,
external: ['vue'],
outdir: process.env.UNI_OUTPUT_DIR,
await Promise.all(
entryPoints.map((filename) => {
return buildNVuePage(filename, buildOptions).then((code) => {
return fs.outputFile(path.resolve(outputDir, filename), code)
})
})
)
},
}
}
function buildNVuePage(filename: string, options: BuildOptions) {
return transformWithEsbuild(
`import NVuePageComponent from './${filename}'
Vue.createApp(NVuePageComponent).mount('#root')`,
path.join(nvueOutDir(), 'main.js'),
options
).then((res) => {
if (res.outputFiles) {
return res.outputFiles[0].text
}
return ''
})
}
function esbuildGlobalPlugin(options: Record<string, string>) {
const keys = Object.keys(options)
return {
name: 'global',
setup(build: PluginBuild) {
keys.forEach((key) => {
const namespace = key + '-ns'
build.onResolve({ filter: new RegExp('^' + key + '$') }, ({ path }) => {
return {
path,
namespace,
}
})
build.onLoad({ filter: /.*/, namespace }, () => ({
contents: `module.exports = ${options[key]}`,
loader: 'js',
}))
})
},
}
......
......@@ -207,6 +207,7 @@ importers:
'@vue/compiler-core': 3.2.26
'@vue/compiler-sfc': 3.2.26
debug: ^4.3.2
esbuild: ^0.13.12
fs-extra: ^10.0.0
rollup: ^2.59.0
dependencies:
......@@ -224,6 +225,7 @@ importers:
'@types/debug': 4.1.7
'@types/fs-extra': 9.0.13
'@vue/compiler-core': 3.2.26
esbuild: 0.13.15
packages/uni-app-vue:
specifiers:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册