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

wip: uni-h5-vite

上级 80394f20
...@@ -3,6 +3,7 @@ import uniH5VitePlugins from '@dcloudio/uni-h5-vite' ...@@ -3,6 +3,7 @@ import uniH5VitePlugins from '@dcloudio/uni-h5-vite'
import uni from '@dcloudio/vite-plugin-uni' import uni from '@dcloudio/vite-plugin-uni'
process.env.UNI_CLI_CONTEXT = __dirname process.env.UNI_CLI_CONTEXT = __dirname
process.env.UNI_INPUT_DIR = path.resolve(__dirname, 'src')
/** /**
* @type {import('vite').UserConfig} * @type {import('vite').UserConfig}
*/ */
......
...@@ -22,7 +22,9 @@ ...@@ -22,7 +22,9 @@
"url": "https://github.com/dcloudio/uni-app/issues" "url": "https://github.com/dcloudio/uni-app/issues"
}, },
"dependencies": { "dependencies": {
"@rollup/pluginutils": "^4.1.0",
"debug": "^4.3.1", "debug": "^4.3.1",
"estree-walker": "^2.0.2",
"jsonc-parser": "^3.0.0", "jsonc-parser": "^3.0.0",
"slash": "^3.0.0", "slash": "^3.0.0",
"tapable": "^2.2.0", "tapable": "^2.2.0",
......
...@@ -7,3 +7,16 @@ export const H5_API_STYLE_PATH = '@dcloudio/uni-h5/style/api/' ...@@ -7,3 +7,16 @@ export const H5_API_STYLE_PATH = '@dcloudio/uni-h5/style/api/'
export const H5_FRAMEWORK_STYLE_PATH = '@dcloudio/uni-h5/style/framework/' export const H5_FRAMEWORK_STYLE_PATH = '@dcloudio/uni-h5/style/framework/'
export const H5_COMPONENTS_STYLE_PATH = '@dcloudio/uni-h5/style/' export const H5_COMPONENTS_STYLE_PATH = '@dcloudio/uni-h5/style/'
export const BASE_COMPONENTS_STYLE_PATH = '@dcloudio/uni-components/style/' export const BASE_COMPONENTS_STYLE_PATH = '@dcloudio/uni-components/style/'
export const COMMON_EXCLUDE = [
/pages\.json\.js$/,
/manifest\.json\.js$/,
/vite\//,
/\/@vue\//,
/\/vue-router\//,
/\/vuex\//,
/@dcloudio\/uni-h5-vue/,
/@dcloudio\/uni-shared/,
/@dcloudio\/uni-h5\/style/,
/@dcloudio\/uni-components\/style/,
]
export * from './ssr' export * from './ssr'
export * from './url'
export * from './deps' export * from './deps'
export * from './json' export * from './json'
export * from './vite' export * from './vite'
......
...@@ -6,4 +6,5 @@ export interface UniVitePlugin extends Plugin { ...@@ -6,4 +6,5 @@ export interface UniVitePlugin extends Plugin {
} }
export * from './utils' export * from './utils'
export * from './plugins'
export * from './features' export * from './features'
...@@ -16,15 +16,14 @@ import { walk } from 'estree-walker' ...@@ -16,15 +16,14 @@ import { walk } from 'estree-walker'
import { extend } from '@vue/shared' import { extend } from '@vue/shared'
import { MagicString } from '@vue/compiler-sfc' import { MagicString } from '@vue/compiler-sfc'
import { EXTNAME_JS, EXTNAME_VUE } from '../../constants'
import { import {
EXTNAME_JS, isProperty,
EXTNAME_VUE, isReference,
isMemberExpression,
parseVueRequest, parseVueRequest,
} from '@dcloudio/uni-cli-shared' } from '../utils'
import { UniPluginFilterOptions } from '.'
import { isProperty, isReference, isMemberExpression } from '../../utils'
interface Scope { interface Scope {
parent: Scope parent: Scope
...@@ -38,17 +37,13 @@ export interface InjectOptions { ...@@ -38,17 +37,13 @@ export interface InjectOptions {
callback?: (imports: Map<any, any>, mod: [string, string]) => void callback?: (imports: Map<any, any>, mod: [string, string]) => void
include?: FilterPattern include?: FilterPattern
exclude?: FilterPattern exclude?: FilterPattern
[str: string]: [str: string]: Injectment | FilterPattern | Boolean | Function | undefined
| Injectment
| UniPluginFilterOptions['include']
| Boolean
| Function
} }
const debugInject = debug('vite:uni:inject') const debugInject = debug('vite:uni:inject')
const debugInjectTry = debug('vite:uni:inject-try') const debugInjectTry = debug('vite:uni:inject-try')
export function uniInjectPlugin(options: InjectOptions): Plugin { export function uniViteInjectPlugin(options: InjectOptions): Plugin {
if (!options) throw new Error('Missing options') if (!options) throw new Error('Missing options')
const filter = createFilter(options.include, options.exclude) const filter = createFilter(options.include, options.exclude)
......
import {
Literal,
BaseNode,
Property,
Identifier,
CallExpression,
MemberExpression,
MethodDefinition,
ExportSpecifier,
} from 'estree'
import {
Node,
TextModes,
NodeTypes,
ElementNode,
DirectiveNode,
SimpleExpressionNode,
} from '@vue/compiler-core'
import { parse } from '@vue/compiler-dom'
export const isProperty = (node: BaseNode): node is Property =>
node.type === 'Property'
export const isIdentifier = (node: BaseNode): node is Identifier =>
node.type === 'Identifier'
export const isCallExpression = (node: BaseNode): node is CallExpression =>
node.type === 'CallExpression'
export const isMemberExpression = (node: BaseNode): node is MemberExpression =>
node.type === 'MemberExpression'
export const isMethodDefinition = (node: BaseNode): node is MethodDefinition =>
node.type === 'MethodDefinition'
export const isExportSpecifier = (node: BaseNode): node is ExportSpecifier =>
node.type === 'ExportSpecifier'
export const isReference = (node: BaseNode, parent: BaseNode): boolean => {
if (isMemberExpression(node)) {
return !node.computed && isReference(node.object, node)
}
if (isIdentifier(node)) {
if (isMemberExpression(parent))
return parent.computed || node === parent.object
// `bar` in { bar: foo }
if (isProperty(parent) && node !== parent.value) return false
// `bar` in `class Foo { bar () {...} }`
if (isMethodDefinition(parent)) return false
// `bar` in `export { foo as bar }`
if (isExportSpecifier(parent) && node !== parent.local) return false
return true
}
return false
}
export function createLiteral(value: string) {
return {
type: 'Literal',
value,
raw: `'${value}'`,
} as Literal
}
export function parseVue(code: string, errors: SyntaxError[]) {
return parse(code, {
isNativeTag: () => true,
isPreTag: () => true,
getTextMode: () => TextModes.DATA,
onError: (e) => {
errors.push(e)
},
})
}
export function isElementNode(node: Node): node is ElementNode {
return node.type === NodeTypes.ELEMENT
}
export function isDirectiveNode(node: Node): node is DirectiveNode {
return node.type === NodeTypes.DIRECTIVE
}
export function isSimpleExpressionNode(
node: Node
): node is SimpleExpressionNode {
return node.type === NodeTypes.SIMPLE_EXPRESSION
}
import { ResolvedConfig } from 'vite' import { ResolvedConfig } from 'vite'
export * from './ast'
export * from './url'
// 内置组件css列表,h5平台需要合并进去首页css中 // 内置组件css列表,h5平台需要合并进去首页css中
export const buildInCssSet = new Set<string>() export const buildInCssSet = new Set<string>()
......
const { once } = require('@dcloudio/uni-shared') const { once } = require('@dcloudio/uni-shared')
const { uniInjectPlugin } = require('@dcloudio/vite-plugin-uni') const { uniViteInjectPlugin } = require('@dcloudio/uni-cli-shared')
/** /**
* @type {import('vite').Plugin} * @type {import('vite').Plugin}
*/ */
...@@ -108,7 +108,7 @@ function initUniCloudEnv(config) { ...@@ -108,7 +108,7 @@ function initUniCloudEnv(config) {
module.exports = [ module.exports = [
UniCloudPlugin, UniCloudPlugin,
uniInjectPlugin({ uniViteInjectPlugin({
uniCloud: ['@dcloudio/uni-cloud', 'default'], uniCloud: ['@dcloudio/uni-cloud', 'default'],
}), }),
] ]
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const css_1 = require("./plugins/css"); const css_1 = require("./plugins/css");
const cssScoped_1 = require("./plugins/cssScoped"); const cssScoped_1 = require("./plugins/cssScoped");
const inject_1 = require("./plugins/inject");
const mainJs_1 = require("./plugins/mainJs"); const mainJs_1 = require("./plugins/mainJs");
const manifestJson_1 = require("./plugins/manifestJson"); const manifestJson_1 = require("./plugins/manifestJson");
const pagesJson_1 = require("./plugins/pagesJson"); const pagesJson_1 = require("./plugins/pagesJson");
...@@ -20,6 +21,7 @@ exports.default = [ ...@@ -20,6 +21,7 @@ exports.default = [
mainJs_1.uniMainJsPlugin(), mainJs_1.uniMainJsPlugin(),
manifestJson_1.uniManifestJsonPlugin(), manifestJson_1.uniManifestJsonPlugin(),
pagesJson_1.uniPagesJsonPlugin(), pagesJson_1.uniPagesJsonPlugin(),
inject_1.uniInjectPlugin(),
css_1.uniCssPlugin(), css_1.uniCssPlugin(),
UniH5Plugin, UniH5Plugin,
]; ];
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.uniInjectPlugin = void 0;
const shared_1 = require("@vue/shared");
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
const uniInjectPluginOptions = {
exclude: [...uni_cli_shared_1.COMMON_EXCLUDE],
'uni.': '@dcloudio/uni-h5',
getApp: ['@dcloudio/uni-h5', 'getApp'],
getCurrentPages: ['@dcloudio/uni-h5', 'getCurrentPages'],
UniServiceJSBridge: ['@dcloudio/uni-h5', 'UniServiceJSBridge'],
UniViewJSBridge: ['@dcloudio/uni-h5', 'UniViewJSBridge'],
};
function uniInjectPlugin() {
let resolvedConfig;
const callback = function (imports, mod) {
const styles = mod[0] === '@dcloudio/uni-h5' &&
uni_cli_shared_1.API_DEPS_CSS[mod[1]];
if (!styles) {
return;
}
styles.forEach((style) => {
if (uni_cli_shared_1.isCombineBuiltInCss(resolvedConfig)) {
uni_cli_shared_1.buildInCssSet.add(style);
}
else {
if (!imports.has(style)) {
imports.set(style, `import '${style}';`);
}
}
});
};
const injectPlugin = uni_cli_shared_1.uniViteInjectPlugin(shared_1.extend(uniInjectPluginOptions, {
callback,
}));
return {
name: 'vite:uni-h5-inject',
apply: 'build',
enforce: 'post',
configResolved(config) {
resolvedConfig = config;
},
transform(code, id) {
return injectPlugin.transform.call(this, code, id);
},
};
}
exports.uniInjectPlugin = uniInjectPlugin;
import { UniVitePlugin } from '@dcloudio/uni-cli-shared' import { UniVitePlugin } from '@dcloudio/uni-cli-shared'
import { uniCssPlugin } from './plugins/css' import { uniCssPlugin } from './plugins/css'
import { uniCssScopedPlugin } from './plugins/cssScoped' import { uniCssScopedPlugin } from './plugins/cssScoped'
import { uniInjectPlugin } from './plugins/inject'
import { uniMainJsPlugin } from './plugins/mainJs' import { uniMainJsPlugin } from './plugins/mainJs'
import { uniManifestJsonPlugin } from './plugins/manifestJson' import { uniManifestJsonPlugin } from './plugins/manifestJson'
import { uniPagesJsonPlugin } from './plugins/pagesJson' import { uniPagesJsonPlugin } from './plugins/pagesJson'
...@@ -21,6 +22,7 @@ export default [ ...@@ -21,6 +22,7 @@ export default [
uniMainJsPlugin(), uniMainJsPlugin(),
uniManifestJsonPlugin(), uniManifestJsonPlugin(),
uniPagesJsonPlugin(), uniPagesJsonPlugin(),
uniInjectPlugin(),
uniCssPlugin(), uniCssPlugin(),
UniH5Plugin, UniH5Plugin,
] ]
import { Plugin, ResolvedConfig } from 'vite'
import { extend } from '@vue/shared'
import {
API_DEPS_CSS,
COMMON_EXCLUDE,
InjectOptions,
buildInCssSet,
uniViteInjectPlugin,
isCombineBuiltInCss,
} from '@dcloudio/uni-cli-shared'
const uniInjectPluginOptions: Partial<InjectOptions> = {
exclude: [...COMMON_EXCLUDE],
'uni.': '@dcloudio/uni-h5',
getApp: ['@dcloudio/uni-h5', 'getApp'],
getCurrentPages: ['@dcloudio/uni-h5', 'getCurrentPages'],
UniServiceJSBridge: ['@dcloudio/uni-h5', 'UniServiceJSBridge'],
UniViewJSBridge: ['@dcloudio/uni-h5', 'UniViewJSBridge'],
}
export function uniInjectPlugin(): Plugin {
let resolvedConfig: ResolvedConfig
const callback: InjectOptions['callback'] = function (imports, mod) {
const styles =
mod[0] === '@dcloudio/uni-h5' &&
API_DEPS_CSS[mod[1] as keyof typeof API_DEPS_CSS]
if (!styles) {
return
}
styles.forEach((style) => {
if (isCombineBuiltInCss(resolvedConfig)) {
buildInCssSet.add(style)
} else {
if (!imports.has(style)) {
imports.set(style, `import '${style}';`)
}
}
})
}
const injectPlugin = uniViteInjectPlugin(
extend(uniInjectPluginOptions, {
callback,
})
)
return {
name: 'vite:uni-h5-inject',
apply: 'build',
enforce: 'post',
configResolved(config) {
resolvedConfig = config
},
transform(code, id) {
return injectPlugin.transform!.call(this, code, id)
},
}
}
...@@ -30,7 +30,6 @@ ...@@ -30,7 +30,6 @@
"cac": "^6.7.3", "cac": "^6.7.3",
"chalk": "^4.1.1", "chalk": "^4.1.1",
"debug": "^4.3.1", "debug": "^4.3.1",
"estree-walker": "^2.0.1",
"express": "^4.17.1", "express": "^4.17.1",
"fs-extra": "^9.0.1", "fs-extra": "^9.0.1",
"jsonc-parser": "^3.0.0", "jsonc-parser": "^3.0.0",
......
...@@ -4,18 +4,13 @@ import { Plugin, ResolvedConfig } from 'vite' ...@@ -4,18 +4,13 @@ import { Plugin, ResolvedConfig } from 'vite'
import { FilterPattern } from '@rollup/pluginutils' import { FilterPattern } from '@rollup/pluginutils'
import vue from '@vitejs/plugin-vue' import vue from '@vitejs/plugin-vue'
import { import { COMMON_EXCLUDE } from '@dcloudio/uni-cli-shared'
API_DEPS_CSS,
buildInCssSet,
isCombineBuiltInCss,
} from '@dcloudio/uni-cli-shared'
import { VitePluginUniResolvedOptions } from '../..' import { VitePluginUniResolvedOptions } from '../..'
import { uniPrePlugin } from './pre' import { uniPrePlugin } from './pre'
import { uniJsonPlugin } from './json' import { uniJsonPlugin } from './json'
import { uniPreCssPlugin } from './preCss' import { uniPreCssPlugin } from './preCss'
import { uniEasycomPlugin } from './easycom' import { uniEasycomPlugin } from './easycom'
import { InjectOptions, uniInjectPlugin } from './inject'
import { uniPageVuePlugin } from './pageVue' import { uniPageVuePlugin } from './pageVue'
import { uniCopyPlugin } from './copy' import { uniCopyPlugin } from './copy'
...@@ -34,18 +29,6 @@ export interface UniPluginFilterOptions extends VitePluginUniResolvedOptions { ...@@ -34,18 +29,6 @@ export interface UniPluginFilterOptions extends VitePluginUniResolvedOptions {
const UNI_H5_RE = /@dcloudio\/uni-h5/ const UNI_H5_RE = /@dcloudio\/uni-h5/
const COMMON_EXCLUDE = [
/pages\.json\.js$/,
/manifest\.json\.js$/,
/vite\//,
/\/@vue\//,
/\/vue-router\//,
/\/vuex\//,
/@dcloudio\/uni-h5-vue/,
/@dcloudio\/uni-shared/,
/@dcloudio\/uni-components\/style/,
]
const APP_VUE_RE = /App.vue$/ const APP_VUE_RE = /App.vue$/
const uniPrePluginOptions: Partial<UniPluginFilterOptions> = { const uniPrePluginOptions: Partial<UniPluginFilterOptions> = {
...@@ -59,38 +42,6 @@ const uniEasycomPluginOptions: Partial<UniPluginFilterOptions> = { ...@@ -59,38 +42,6 @@ const uniEasycomPluginOptions: Partial<UniPluginFilterOptions> = {
exclude: [APP_VUE_RE, UNI_H5_RE], exclude: [APP_VUE_RE, UNI_H5_RE],
} }
const uniInjectPluginOptions: Partial<InjectOptions> = {
exclude: [...COMMON_EXCLUDE],
'uni.': '@dcloudio/uni-h5',
getApp: ['@dcloudio/uni-h5', 'getApp'],
getCurrentPages: ['@dcloudio/uni-h5', 'getCurrentPages'],
UniServiceJSBridge: ['@dcloudio/uni-h5', 'UniServiceJSBridge'],
UniViewJSBridge: ['@dcloudio/uni-h5', 'UniViewJSBridge'],
}
function createUniInjectCallback(
config: ResolvedConfig
): InjectOptions['callback'] {
const needCombineBuiltInCss = isCombineBuiltInCss(config)
return (imports, mod) => {
const styles =
mod[0] === '@dcloudio/uni-h5' &&
API_DEPS_CSS[mod[1] as keyof typeof API_DEPS_CSS]
if (!styles) {
return
}
styles.forEach((style) => {
if (needCombineBuiltInCss) {
buildInCssSet.add(style)
} else {
if (!imports.has(style)) {
imports.set(style, `import '${style}';`)
}
}
})
}
}
export function initPlugins( export function initPlugins(
config: ResolvedConfig, config: ResolvedConfig,
options: VitePluginUniResolvedOptions options: VitePluginUniResolvedOptions
...@@ -116,19 +67,6 @@ export function initPlugins( ...@@ -116,19 +67,6 @@ export function initPlugins(
addPlugin(plugins, uniPreVuePlugin(), 'vite:vue', 'pre') addPlugin(plugins, uniPreVuePlugin(), 'vite:vue', 'pre')
addPlugin(plugins, uniRenderjsPlugin(), 'vite:vue') addPlugin(plugins, uniRenderjsPlugin(), 'vite:vue')
// 可以考虑使用apply:'build'
if (command === 'build') {
addPlugin(
plugins,
uniInjectPlugin(
extend(uniInjectPluginOptions, {
callback: createUniInjectCallback(config),
})
),
'vite:vue'
)
}
addPlugin( addPlugin(
plugins, plugins,
uniSSRPlugin(config, extend({ exclude: [...COMMON_EXCLUDE] }, options)), uniSSRPlugin(config, extend({ exclude: [...COMMON_EXCLUDE] }, options)),
......
import fs from 'fs'
import path from 'path'
import slash from 'slash'
import { Plugin, ResolvedConfig } from 'vite'
import { extend, camelize, capitalize } from '@vue/shared'
import {
H5_FRAMEWORK_STYLE_PATH,
BASE_COMPONENTS_STYLE_PATH,
normalizePagesJson,
API_DEPS_CSS,
} from '@dcloudio/uni-cli-shared'
import { VitePluginUniResolvedOptions } from '../..'
import { FEATURE_DEFINES } from '../../utils'
const pkg = require('@dcloudio/vite-plugin-uni/package.json')
const PAGES_JSON_JS = 'pages.json.js'
export function uniPagesJsonPlugin(
config: ResolvedConfig,
options: VitePluginUniResolvedOptions
): Plugin {
const pagesJsonPath = slash(path.join(options.inputDir, 'pages.json'))
return {
name: 'vite:uni-pages-json',
resolveId(id) {
if (id.endsWith(PAGES_JSON_JS)) {
return pagesJsonPath + '.js'
}
},
transform(code, id, ssr) {
if (id.endsWith(PAGES_JSON_JS)) {
return {
code:
(options.command === 'serve' || (options.command === 'build' && ssr)
? registerGlobalCode(config, ssr)
: '') + generatePagesJsonCode(ssr, code, config, options),
map: { mappings: '' },
}
}
},
load(id) {
if (id.endsWith(PAGES_JSON_JS)) {
return fs.readFileSync(pagesJsonPath, 'utf8')
}
},
}
}
interface PageRouteOptions {
name: string
path: string
meta: Partial<UniApp.PageRouteMeta>
}
function generatePagesJsonCode(
ssr: boolean | undefined,
jsonStr: string,
config: ResolvedConfig,
options: VitePluginUniResolvedOptions
) {
const globalName = getGlobal(ssr)
const pagesJson = normalizePagesJson(
jsonStr,
options.inputDir,
options.platform
)
const { importLayoutComponentsCode, defineLayoutComponentsCode } =
generateLayoutComponentsCode(globalName, pagesJson)
const definePagesCode = generatePagesDefineCode(pagesJson, config)
const uniRoutesCode = generateRoutes(globalName, pagesJson, config, options)
const uniConfigCode = generateConfig(globalName, pagesJson, options)
const manifestJsonPath = slash(
path.resolve(options.inputDir, 'manifest.json.js')
)
const cssCode = generateCssCode(config, options)
return `
import { defineAsyncComponent, resolveComponent, createVNode, withCtx, openBlock, createBlock } from 'vue'
import { PageComponent, AsyncLoadingComponent, AsyncErrorComponent } from '@dcloudio/uni-h5'
import { appid, debug, networkTimeout, router, async, sdkConfigs, qqMapKey, nvue } from '${manifestJsonPath}'
${importLayoutComponentsCode}
const extend = Object.assign
${cssCode}
${uniConfigCode}
${defineLayoutComponentsCode}
${definePagesCode}
${uniRoutesCode}
${options.command === 'serve' ? hmrCode : ''}
export {}
`
}
const hmrCode = `if(import.meta.hot){
import.meta.hot.on('invalidate', (data) => {
import.meta.hot.invalidate()
})
}`
function getGlobal(ssr?: boolean) {
return ssr ? 'global' : 'window'
}
function registerGlobalCode(config: ResolvedConfig, ssr?: boolean) {
const name = getGlobal(ssr)
const rpx2pxCode =
!ssr && config.define!.__UNI_FEATURE_RPX__
? `import {upx2px} from '@dcloudio/uni-h5'
${name}.rpx2px = upx2px
`
: ''
return `${rpx2pxCode}
import {uni,getCurrentPages,getApp,UniServiceJSBridge,UniViewJSBridge} from '@dcloudio/uni-h5'
${name}.getApp = getApp
${name}.getCurrentPages = getCurrentPages
${name}.uni = uni
${name}.UniViewJSBridge = UniViewJSBridge
${name}.UniServiceJSBridge = UniServiceJSBridge
`
}
function normalizePageIdentifier(path: string) {
return capitalize(camelize(path.replace(/\//g, '-')))
}
function generateCssCode(
config: ResolvedConfig,
options: VitePluginUniResolvedOptions
) {
const define = config.define! as FEATURE_DEFINES
const cssFiles = [H5_FRAMEWORK_STYLE_PATH + 'base.css']
// if (define.__UNI_FEATURE_PAGES__) {
cssFiles.push(H5_FRAMEWORK_STYLE_PATH + 'async.css')
// }
if (define.__UNI_FEATURE_RESPONSIVE__) {
cssFiles.push(H5_FRAMEWORK_STYLE_PATH + 'layout.css')
}
if (define.__UNI_FEATURE_NAVIGATIONBAR__) {
cssFiles.push(H5_FRAMEWORK_STYLE_PATH + 'pageHead.css')
}
if (define.__UNI_FEATURE_TABBAR__) {
cssFiles.push(H5_FRAMEWORK_STYLE_PATH + 'tabBar.css')
}
if (define.__UNI_FEATURE_NVUE__) {
cssFiles.push(H5_FRAMEWORK_STYLE_PATH + 'nvue.css')
}
if (define.__UNI_FEATURE_PULL_DOWN_REFRESH__) {
cssFiles.push(H5_FRAMEWORK_STYLE_PATH + 'pageRefresh.css')
}
if (define.__UNI_FEATURE_NAVIGATIONBAR_SEARCHINPUT__) {
cssFiles.push(BASE_COMPONENTS_STYLE_PATH + 'input.css')
}
if (options.command === 'serve') {
// 开发模式,自动添加所有API相关css
Object.keys(API_DEPS_CSS).forEach((name) => {
const styles = API_DEPS_CSS[name as keyof typeof API_DEPS_CSS]
styles.forEach((style) => {
if (!cssFiles.includes(style)) {
cssFiles.push(style)
}
})
})
}
return cssFiles.map((file) => `import '${file}'`).join('\n')
}
function generateLayoutComponentsCode(
globalName: string,
pagesJson: UniApp.PagesJson
) {
const windowNames: Array<'topWindow' | 'leftWindow' | 'rightWindow'> = [
'topWindow',
'leftWindow',
'rightWindow',
]
let importLayoutComponentsCode = ''
let defineLayoutComponentsCode = `${globalName}.__uniLayout = ${globalName}.__uniLayout || {}\n`
windowNames.forEach((name) => {
const windowConfig = pagesJson[name]
if (windowConfig && windowConfig.path) {
importLayoutComponentsCode += `import ${name} from './${windowConfig.path}'\n`
defineLayoutComponentsCode += `${globalName}.__uniConfig.${name}.component = ${name}\n`
}
})
return {
importLayoutComponentsCode,
defineLayoutComponentsCode,
}
}
function generatePageDefineCode(pageOptions: UniApp.PagesJsonPageOptions) {
const pageIdent = normalizePageIdentifier(pageOptions.path)
return `const ${pageIdent}Loader = ()=>import('./${pageOptions.path}?mpType=page')
const ${pageIdent} = defineAsyncComponent(extend({loader:${pageIdent}Loader},AsyncComponentOptions))`
}
function generatePagesDefineCode(
pagesJson: UniApp.PagesJson,
_config: ResolvedConfig
) {
// const define = config.define! as FEATURE_DEFINES
// if (!define.__UNI_FEATURE_PAGES__) {
// // single page
// const pagePath = pagesJson.pages[0].path
// return `import ${normalizePageIdentifier(
// pagePath
// )} from './${pagePath}.vue?mpType=page'`
// }
const { pages } = pagesJson
return (
`const AsyncComponentOptions = {
loadingComponent: AsyncLoadingComponent,
errorComponent: AsyncErrorComponent,
delay: async.delay,
timeout: async.timeout,
suspensible: async.suspensible
}
` + pages.map((pageOptions) => generatePageDefineCode(pageOptions)).join('\n')
)
}
function normalizePagesRoute(
pagesJson: UniApp.PagesJson,
options: VitePluginUniResolvedOptions
): PageRouteOptions[] {
const firstPagePath = pagesJson.pages[0].path
const tabBarList = (pagesJson.tabBar && pagesJson.tabBar.list) || []
return pagesJson.pages.map((pageOptions) => {
const pagePath = pageOptions.path
const name = normalizePageIdentifier(pagePath)
const isEntry = firstPagePath === pagePath ? true : undefined
const tabBarIndex = tabBarList.findIndex(
(tabBarPage: { pagePath: string }) => tabBarPage.pagePath === pagePath
)
const isTabBar = tabBarIndex !== -1 ? true : undefined
const isNVue = fs.existsSync(
path.join(options.inputDir, pagePath + '.nvue')
)
let windowTop = 0
const meta = extend(
{
route: pageOptions.path,
isNVue: isNVue ? true : undefined,
isQuit: isEntry || isTabBar ? true : undefined,
isEntry,
isTabBar,
tabBarIndex,
windowTop,
},
pageOptions.style
)
return {
name,
path: pageOptions.path,
meta,
}
})
}
function generatePageRoute(
{ name, path, meta }: PageRouteOptions,
config: ResolvedConfig
) {
const { isEntry } = meta
const alias = isEntry ? `\n alias:'/${path}',` : ''
return `{
path:'/${isEntry ? '' : path}',${alias}
component:{setup(){return ()=>renderPage(${name})}},
loader: ${normalizePageIdentifier(path)}Loader,
meta: ${JSON.stringify(meta)}
}`
}
function generatePagesRoute(
pagesRouteOptions: PageRouteOptions[],
config: ResolvedConfig
) {
return pagesRouteOptions.map((pageOptions) =>
generatePageRoute(pageOptions, config)
)
}
function generateRoutes(
globalName: string,
pagesJson: UniApp.PagesJson,
config: ResolvedConfig,
options: VitePluginUniResolvedOptions
) {
return `
function renderPage(component){
return (openBlock(), createBlock(PageComponent, null, {page: withCtx(() => [createVNode(component, { ref: "page" }, null, 512 /* NEED_PATCH */)]), _: 1 /* STABLE */}))
}
${globalName}.__uniRoutes=[${[
...generatePagesRoute(normalizePagesRoute(pagesJson, options), config),
].join(',')}]`
}
function generateConfig(
globalName: string,
pagesJson: Record<string, any>,
options: VitePluginUniResolvedOptions
) {
delete pagesJson.pages
delete pagesJson.subPackages
delete pagesJson.subpackages
pagesJson.compilerVersion = pkg['uni-app'].compilerVersion
return (
(options.command === 'serve'
? ''
: `${globalName}['____'+appid+'____']=true
delete ${globalName}['____'+appid+'____']
`) +
`${globalName}.__uniConfig=extend(${JSON.stringify(pagesJson)},{
async,
debug,
networkTimeout,
sdkConfigs,
qqMapKey,
nvue,
router
})
`
)
}
...@@ -85,5 +85,3 @@ export default function uniPlugin( ...@@ -85,5 +85,3 @@ export default function uniPlugin(
plugins.push(...uniPlugins) plugins.push(...uniPlugins)
return plugins return plugins
} }
export { uniInjectPlugin } from './configResolved/plugins/inject'
...@@ -16,6 +16,7 @@ const priority = { ...@@ -16,6 +16,7 @@ const priority = {
'uni-cli-shared': 60, 'uni-cli-shared': 60,
'uni-h5': 50, 'uni-h5': 50,
'uni-h5-vue': 40, 'uni-h5-vue': 40,
'uni-h5-vite': 40,
'uni-app-plus': 30, 'uni-app-plus': 30,
'vite-plugin-uni': 20, 'vite-plugin-uni': 20,
'size-check': 1, 'size-check': 1,
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册