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

wip(mp): pages.json

上级 5485f47f
import fs from 'fs'
import { Plugin } from 'vite' import { Plugin } from 'vite'
import { import {
...@@ -10,6 +11,11 @@ import { ...@@ -10,6 +11,11 @@ import {
export const configResolved: Plugin['configResolved'] = (config) => { export const configResolved: Plugin['configResolved'] = (config) => {
removePlugins('vite:import-analysis', config) removePlugins('vite:import-analysis', config)
injectCssPlugin(config) injectCssPlugin(config)
injectCssPostPlugin(config) injectCssPostPlugin(config, {
appCss: fs.readFileSync(
require.resolve('@dcloudio/uni-app-plus/dist/style.css'),
'utf8'
),
})
injectAssetPlugin(config) injectAssetPlugin(config)
} }
import fs from 'fs' import fs from 'fs-extra'
import os from 'os' import os from 'os'
import path from 'path' import path from 'path'
import debug from 'debug' import debug from 'debug'
...@@ -10,7 +10,7 @@ import { hasOwn, isString, isPlainObject } from '@vue/shared' ...@@ -10,7 +10,7 @@ import { hasOwn, isString, isPlainObject } from '@vue/shared'
import { parseManifestJsonOnce } from './json' import { parseManifestJsonOnce } from './json'
import { isInHBuilderX } from './hbx' import { isInHBuilderX } from './hbx'
const debugCheckUpdate = debug('uni:check-update') const debugCheckUpdate = debug('vite:uni:check-update')
interface CheckUpdateOptions { interface CheckUpdateOptions {
inputDir: string inputDir: string
...@@ -63,6 +63,7 @@ export async function checkUpdate(options: CheckUpdateOptions) { ...@@ -63,6 +63,7 @@ export async function checkUpdate(options: CheckUpdateOptions) {
} }
const { inputDir, compilerVersion } = options const { inputDir, compilerVersion } = options
const updateCache = readCheckUpdateCache(inputDir) const updateCache = readCheckUpdateCache(inputDir)
debugCheckUpdate('read.cache', updateCache)
const res = checkLocalCache(updateCache, compilerVersion) const res = checkLocalCache(updateCache, compilerVersion)
if (res) { if (res) {
if (isString(res)) { if (isString(res)) {
...@@ -104,10 +105,12 @@ function normalizeUpdateCache( ...@@ -104,10 +105,12 @@ function normalizeUpdateCache(
} }
function statUpdateCache(updateCache: CheckUpdateCache) { function statUpdateCache(updateCache: CheckUpdateCache) {
debugCheckUpdate('stat.before', updateCache)
const platform = process.env.UNI_PLATFORM const platform = process.env.UNI_PLATFORM
const type = process.env.NODE_ENV === 'production' ? 'build' : 'dev' const type = process.env.NODE_ENV === 'production' ? 'build' : 'dev'
const platformOptions = updateCache[platform] as CheckUpdatePlatform const platformOptions = updateCache[platform] as CheckUpdatePlatform
platformOptions[type] = (platformOptions[type] || 0) + 1 platformOptions[type] = (platformOptions[type] || 0) + 1
debugCheckUpdate('stat.after', updateCache)
return updateCache return updateCache
} }
...@@ -140,7 +143,9 @@ function readCheckUpdateCache(inputDir: string) { ...@@ -140,7 +143,9 @@ function readCheckUpdateCache(inputDir: string) {
if (fs.existsSync(updateFilepath)) { if (fs.existsSync(updateFilepath)) {
try { try {
return require(updateFilepath) as CheckUpdateCache return require(updateFilepath) as CheckUpdateCache
} catch (e) {} } catch (e) {
debugCheckUpdate('read.error', e)
}
} }
return createCheckUpdateCache() return createCheckUpdateCache()
} }
...@@ -182,8 +187,10 @@ function writeCheckUpdateCache( ...@@ -182,8 +187,10 @@ function writeCheckUpdateCache(
const filepath = getCheckUpdateFilepath(inputDir) const filepath = getCheckUpdateFilepath(inputDir)
debugCheckUpdate('write:', filepath, updateCache) debugCheckUpdate('write:', filepath, updateCache)
try { try {
fs.writeFileSync(filepath, JSON.stringify(updateCache)) fs.outputFileSync(filepath, JSON.stringify(updateCache))
} catch (e) {} } catch (e: any) {
debugCheckUpdate('write.error', e)
}
} }
export function md5(str: string) { export function md5(str: string) {
...@@ -265,37 +272,49 @@ function checkVersion( ...@@ -265,37 +272,49 @@ function checkVersion(
options: CheckUpdateOptions, options: CheckUpdateOptions,
updateCache: CheckUpdateCache updateCache: CheckUpdateCache
) { ) {
const postData = createPostData( return new Promise((resolve) => {
options, const postData = JSON.stringify({
parseManifestJsonOnce(options.inputDir), id: createPostData(
updateCache options,
) parseManifestJsonOnce(options.inputDir),
let responseData = '' updateCache
const req = request( ),
{ })
hostname: HOSTNAME, let responseData = ''
path: PATH, const req = request(
port: 443, {
method: 'POST', hostname: HOSTNAME,
headers: { path: PATH,
'Content-Type': 'application/json', port: 443,
'Content-Length': postData.length, method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': postData.length,
},
}, },
}, (res) => {
(res) => { res.setEncoding('utf8')
res.setEncoding('utf8') res.on('data', (chunk) => {
res.on('data', (chunk) => { responseData += chunk
responseData += chunk })
}) res.on('end', () => {
res.on('end', () => { debugCheckUpdate('response: ', responseData)
debugCheckUpdate('response: ', responseData) try {
try { handleCheckVersion(JSON.parse(responseData), updateCache)
handleCheckVersion(JSON.parse(responseData), updateCache) } catch (e) {}
} catch (e) {} resolve(true)
}) })
} res.on('error', (e) => {
) debugCheckUpdate('response.error:', e)
debugCheckUpdate('request: ', postData) resolve(false)
req.write(postData) })
req.end() }
).on('error', (e) => {
debugCheckUpdate('request.error:', e)
resolve(false)
})
debugCheckUpdate('request: ', postData)
req.write(postData)
req.end()
})
} }
import type { Plugin } from 'vite' import type { Plugin } from 'vite'
import type { ParserOptions } from '@vue/compiler-core' import type { ParserOptions } from '@vue/compiler-core'
import type { CompilerOptions } from '@vue/compiler-sfc' import type { CompilerOptions, TemplateCompiler } from '@vue/compiler-sfc'
import { UniViteCopyPluginOptions } from './plugins/copy' import { UniViteCopyPluginOptions } from './plugins/copy'
export interface CopyOptions { export interface CopyOptions {
/** /**
...@@ -11,6 +11,7 @@ export interface CopyOptions { ...@@ -11,6 +11,7 @@ export interface CopyOptions {
} }
interface UniVitePluginUniOptions { interface UniVitePluginUniOptions {
compiler?: TemplateCompiler
compilerOptions?: { compilerOptions?: {
isNativeTag: ParserOptions['isNativeTag'] isNativeTag: ParserOptions['isNativeTag']
isCustomElement: ParserOptions['isCustomElement'] isCustomElement: ParserOptions['isCustomElement']
......
import path from 'path'
import debug from 'debug'
import { Plugin } from 'vite'
import { normalizePath, resolveMainPathOnce } from '../../utils'
import { EXTNAME_VUE_RE } from '../../constants'
const cssLangs = `\\.(css|less|sass|scss|styl|stylus|pcss|postcss)($|\\?)`
const cssLangRE = new RegExp(cssLangs)
// const cssModuleRE = new RegExp(`\\.module${cssLangs}`)
// const directRequestRE = /(\?|&)direct\b/
const commonjsProxyRE = /\?commonjs-proxy/
const debugCss = debug('vite:uni:css')
// const isCSSRequest = (request: string): boolean =>
// cssLangRE.test(request) && !directRequestRE.test(request)
const isCss = (id: string): boolean =>
cssLangRE.test(id) && !commonjsProxyRE.test(id)
function normalizeCssChunkFilename(id: string) {
return normalizePath(
path.relative(
process.env.UNI_INPUT_DIR,
id.split('?')[0].replace(EXTNAME_VUE_RE, '.css')
)
)
}
interface UniCssPluginOptions {
/**
* 额外的全局样式
*/
app: string
}
export function uniCssPlugin({ app }: UniCssPluginOptions): Plugin {
const styles: Map<string, string> = new Map<string, string>()
let cssChunks: Map<string, Set<string>>
return {
name: 'vite:uni-app-css',
buildStart() {
cssChunks = new Map<string, Set<string>>()
},
transform(css, id) {
if (!isCss(id)) {
return
}
debugCss(id)
styles.set(id, css)
return {
code: '',
map: { mappings: '' },
moduleSideEffects: 'no-treeshake',
}
},
async generateBundle() {
const findCssModuleIds = (
moduleId: string,
cssModuleIds?: Set<string>
) => {
if (!cssModuleIds) {
cssModuleIds = new Set<string>()
}
const moduleInfo = this.getModuleInfo(moduleId)
if (moduleInfo) {
moduleInfo.importedIds.forEach((id) => {
if (id.includes('pages.json.js')) {
// 查询main.js时,需要忽略pages.json.js,否则会把所有页面样式加进来
return
}
if (isCss(id)) {
cssModuleIds!.add(id)
} else {
findCssModuleIds(id, cssModuleIds)
}
})
}
return cssModuleIds
}
const moduleIds = Array.from(this.getModuleIds())
const mainPath = resolveMainPathOnce(process.env.UNI_INPUT_DIR)
moduleIds.forEach((id) => {
if (id === mainPath) {
// 全局样式
cssChunks.set('app.css', findCssModuleIds(id))
} else if (id.includes('mpType=page')) {
// 页面样式
cssChunks.set(normalizeCssChunkFilename(id), findCssModuleIds(id))
}
})
if (!cssChunks.size) {
return
}
const genCssCode = (fileName: string) => {
return [...cssChunks.get(fileName)!]
.map((id) => styles.get(id) || '')
.join('\n')
}
for (const fileName of cssChunks.keys()) {
let source =
(fileName === 'app.css' ? app + '\n' : '') + genCssCode(fileName)
// if (resolvedConfig.build.minify) {
// source = await minifyCSS(source, resolvedConfig)
// }
this.emitFile({
fileName,
type: 'asset',
source,
})
}
},
}
}
export * from './css'
export * from './cssScoped' export * from './cssScoped'
export * from './copy' export * from './copy'
export * from './inject' export * from './inject'
...@@ -7,4 +6,4 @@ export * from './jsonJs' ...@@ -7,4 +6,4 @@ export * from './jsonJs'
export * from './console' export * from './console'
export { assetPlugin } from './vitejs/plugins/asset' export { assetPlugin } from './vitejs/plugins/asset'
export { cssPlugin, cssPostPlugin } from './vitejs/plugins/css' export { isCSSRequest, cssPlugin, cssPostPlugin } from './vitejs/plugins/css'
...@@ -226,14 +226,13 @@ function findCssModuleIds( ...@@ -226,14 +226,13 @@ function findCssModuleIds(
/** /**
* Plugin applied after user plugins * Plugin applied after user plugins
*/ */
export function cssPostPlugin(config: ResolvedConfig): Plugin { export function cssPostPlugin(
config: ResolvedConfig,
{ appCss }: { appCss?: string }
): Plugin {
// styles initialization in buildStart causes a styling loss in watch // styles initialization in buildStart causes a styling loss in watch
const styles: Map<string, string> = new Map<string, string>() const styles: Map<string, string> = new Map<string, string>()
let cssChunks: Map<string, Set<string>> let cssChunks: Map<string, Set<string>>
const viewCssCode = fs.readFileSync(
require.resolve('@dcloudio/uni-app-plus/dist/style.css'),
'utf8'
)
return { return {
name: 'vite:css-post', name: 'vite:css-post',
buildStart() { buildStart() {
...@@ -305,7 +304,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin { ...@@ -305,7 +304,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
} }
for (const filename of cssChunks.keys()) { for (const filename of cssChunks.keys()) {
let source = await processChunkCSS( let source = await processChunkCSS(
(filename === 'app.css' ? viewCssCode + '\n' : '') + (filename === 'app.css' ? (appCss || '') + '\n' : '') +
genCssCode(filename), genCssCode(filename),
{ dirname: path.dirname(filename), inlined: false, minify: true } { dirname: path.dirname(filename), inlined: false, minify: true }
) )
......
...@@ -17,8 +17,11 @@ export function injectCssPlugin(config: ResolvedConfig) { ...@@ -17,8 +17,11 @@ export function injectCssPlugin(config: ResolvedConfig) {
replacePlugins([cssPlugin(config)], config) replacePlugins([cssPlugin(config)], config)
} }
export function injectCssPostPlugin(config: ResolvedConfig) { export function injectCssPostPlugin(
replacePlugins([cssPostPlugin(config)], config) config: ResolvedConfig,
{ appCss }: { appCss?: string }
) {
replacePlugins([cssPostPlugin(config, { appCss })], config)
} }
export function replacePlugins(plugins: Plugin[], config: ResolvedConfig) { export function replacePlugins(plugins: Plugin[], config: ResolvedConfig) {
......
...@@ -32,7 +32,7 @@ export function generate( ...@@ -32,7 +32,7 @@ export function generate(
if (isSetupInlined) { if (isSetupInlined) {
codes.push(`(${signature}) => {`) codes.push(`(${signature}) => {`)
} else { } else {
codes.push(`function ${functionName}(${signature}) {`) codes.push(`\nexport function ${functionName}(${signature}) {`)
} }
codes.push( codes.push(
`return ` + `return ` +
......
...@@ -17,11 +17,6 @@ ...@@ -17,11 +17,6 @@
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"uni-app": {
"name": "uni-mp",
"apply": "^mp-",
"main": "dist/index.js"
},
"license": "Apache-2.0", "license": "Apache-2.0",
"gitHead": "453a3e6ead807864087692f4339ea3d667045fe7" "gitHead": "453a3e6ead807864087692f4339ea3d667045fe7"
} }
import { UniMpPlugin } from './plugin' import { uniMiniProgramPlugin, UniMiniProgramPluginOptions } from './plugin'
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'
export default [ import { uniVirtualPlugin } from './plugins/virtual'
uniMainJsPlugin(), export default (options: UniMiniProgramPluginOptions) => {
uniManifestJsonPlugin(), return [
uniPagesJsonPlugin(), uniMainJsPlugin(),
UniMpPlugin, uniManifestJsonPlugin(),
] uniPagesJsonPlugin(),
uniVirtualPlugin(options),
uniMiniProgramPlugin(options),
]
}
import path from 'path' import path from 'path'
import { UserConfig } from 'vite' import { UserConfig } from 'vite'
import { normalizePath, resolveMainPathOnce } from '@dcloudio/uni-cli-shared' import {
isCSSRequest,
normalizePath,
resolveMainPathOnce,
} from '@dcloudio/uni-cli-shared'
import { GetManualChunk, GetModuleInfo } from 'rollup'
import {
isUniComponentUrl,
isUniPageUrl,
parseVirtualComponentPath,
parseVirtualPagePath,
} from '../plugins/virtual'
export function buildOptions(): UserConfig['build'] { export function buildOptions(): UserConfig['build'] {
const inputDir = process.env.UNI_INPUT_DIR
return { return {
// sourcemap: 'inline', // TODO // sourcemap: 'inline', // TODO
assetsInlineLimit: 0, // TODO assetsInlineLimit: 0, // TODO
lib: {
entry: resolveMainPathOnce(inputDir),
formats: ['cjs'],
},
rollupOptions: { rollupOptions: {
input: resolveMainPathOnce(process.env.UNI_INPUT_DIR),
output: { output: {
format: 'cjs', entryFileNames: 'app.js',
entryFileNames: 'main.js', manualChunks: createMoveToVendorChunkFn(),
chunkFileNames(chunk) { chunkFileNames(chunk) {
if (chunk.isDynamicEntry && chunk.facadeModuleId) { if (chunk.isDynamicEntry && chunk.facadeModuleId) {
const filepath = path.relative( let id = chunk.facadeModuleId
process.env.UNI_INPUT_DIR, if (isUniPageUrl(id)) {
chunk.facadeModuleId id = path.resolve(
) process.env.UNI_INPUT_DIR,
parseVirtualPagePath(id)
)
} else if (isUniComponentUrl(id)) {
id = path.resolve(
process.env.UNI_INPUT_DIR,
parseVirtualComponentPath(id)
)
}
const filepath = path.relative(inputDir, id)
return normalizePath( return normalizePath(
filepath.replace(path.extname(filepath), '.js') filepath.replace(path.extname(filepath), '.js')
) )
...@@ -29,3 +53,53 @@ export function buildOptions(): UserConfig['build'] { ...@@ -29,3 +53,53 @@ export function buildOptions(): UserConfig['build'] {
}, },
} }
} }
function createMoveToVendorChunkFn(): GetManualChunk {
const cache = new Map<string, boolean>()
return (id, { getModuleInfo }) => {
if (
(id.includes('node_modules') ||
id.includes('plugin-vue:export-helper')) &&
!isCSSRequest(id) &&
staticImportedByEntry(id, getModuleInfo, cache)
) {
return 'vendor'
}
}
}
function staticImportedByEntry(
id: string,
getModuleInfo: GetModuleInfo,
cache: Map<string, boolean>,
importStack: string[] = []
): boolean {
if (cache.has(id)) {
return cache.get(id) as boolean
}
if (importStack.includes(id)) {
// circular deps!
cache.set(id, false)
return false
}
const mod = getModuleInfo(id)
if (!mod) {
cache.set(id, false)
return false
}
if (mod.isEntry) {
cache.set(id, true)
return true
}
const someImporterIs = mod.importers.some((importer) =>
staticImportedByEntry(
importer,
getModuleInfo,
cache,
importStack.concat(id)
)
)
cache.set(id, someImporterIs)
return someImporterIs
}
...@@ -10,6 +10,8 @@ import { ...@@ -10,6 +10,8 @@ import {
export const configResolved: Plugin['configResolved'] = (config) => { export const configResolved: Plugin['configResolved'] = (config) => {
removePlugins('vite:import-analysis', config) removePlugins('vite:import-analysis', config)
injectCssPlugin(config) injectCssPlugin(config)
injectCssPostPlugin(config) injectCssPostPlugin(config, {
appCss: '',
})
injectAssetPlugin(config) injectAssetPlugin(config)
} }
import { AliasOptions } from 'vite'
import { resolveBuiltIn, UniVitePlugin } from '@dcloudio/uni-cli-shared' import { resolveBuiltIn, UniVitePlugin } from '@dcloudio/uni-cli-shared'
import { uniOptions } from './uni' import { uniOptions } from './uni'
import { buildOptions } from './build' import { buildOptions } from './build'
import { configResolved } from './configResolved' import { configResolved } from './configResolved'
export const UniMpPlugin: UniVitePlugin = { export interface UniMiniProgramPluginOptions {
name: 'vite:uni-mp', global: string
uni: uniOptions(), alias?: AliasOptions
config() { }
return {
resolve: { export function uniMiniProgramPlugin({
alias: { alias,
vue: resolveBuiltIn('@dcloudio/uni-mp-vue'), }: UniMiniProgramPluginOptions): UniVitePlugin {
return {
name: 'vite:uni-mp',
uni: uniOptions(),
config() {
return {
resolve: {
alias: {
vue: resolveBuiltIn('@dcloudio/uni-mp-vue'),
...alias,
},
}, },
}, build: buildOptions(),
build: buildOptions(), }
} },
}, configResolved,
configResolved, }
} }
...@@ -3,9 +3,13 @@ import { ...@@ -3,9 +3,13 @@ import {
isServiceCustomElement, isServiceCustomElement,
} from '@dcloudio/uni-shared' } from '@dcloudio/uni-shared'
import { UniVitePlugin } from '@dcloudio/uni-cli-shared' import { UniVitePlugin } from '@dcloudio/uni-cli-shared'
import { TemplateCompiler } from '@vue/compiler-sfc'
import * as compiler from '@dcloudio/uni-mp-compiler'
export function uniOptions(): UniVitePlugin['uni'] { export function uniOptions(): UniVitePlugin['uni'] {
return { return {
compiler: compiler as TemplateCompiler,
compilerOptions: { compilerOptions: {
isNativeTag: isServiceNativeTag, isNativeTag: isServiceNativeTag,
isCustomElement: isServiceCustomElement, isCustomElement: isServiceCustomElement,
......
...@@ -11,7 +11,9 @@ export function uniMainJsPlugin() { ...@@ -11,7 +11,9 @@ export function uniMainJsPlugin() {
? createApp(code) ? createApp(code)
: createLegacyApp(code) : createLegacyApp(code)
return { return {
code: `import './pages.json.js';` + code, code:
`import 'plugin-vue:export-helper';import 'uni-mp-runtime';import './pages.json.js';` +
code,
map: this.getCombinedSourcemap(), map: this.getCombinedSourcemap(),
} }
} }
......
...@@ -3,12 +3,11 @@ import { Plugin } from 'vite' ...@@ -3,12 +3,11 @@ import { Plugin } from 'vite'
import { import {
defineUniPagesJsonPlugin, defineUniPagesJsonPlugin,
normalizeAppPagesJson,
// normalizeAppConfigService,
normalizePagesJson, normalizePagesJson,
// parseManifestJsonOnce,
getLocaleFiles, getLocaleFiles,
normalizePagePath,
} from '@dcloudio/uni-cli-shared' } from '@dcloudio/uni-cli-shared'
import { virtualPagePath } from './virtual'
export function uniPagesJsonPlugin(): Plugin { export function uniPagesJsonPlugin(): Plugin {
let pagesJson: UniApp.PagesJson let pagesJson: UniApp.PagesJson
...@@ -35,7 +34,8 @@ export function uniPagesJsonPlugin(): Plugin { ...@@ -35,7 +34,8 @@ export function uniPagesJsonPlugin(): Plugin {
}) })
return { return {
code: code:
`import './manifest.json.js'\n` + normalizeAppPagesJson(pagesJson), `import './manifest.json.js'\n` +
normalizeMiniProgramPagesJson(pagesJson),
map: this.getCombinedSourcemap(), map: this.getCombinedSourcemap(),
} }
}, },
...@@ -52,3 +52,17 @@ export function uniPagesJsonPlugin(): Plugin { ...@@ -52,3 +52,17 @@ export function uniPagesJsonPlugin(): Plugin {
} }
}) })
} }
function normalizeMiniProgramPagesJson(pagesJson: Record<string, any>) {
const importPagesCode: string[] = []
pagesJson.pages.forEach((page: UniApp.PagesJsonPageOptions) => {
const pagePath = page.path
const pagePathWithExtname = normalizePagePath(pagePath, 'app')
if (pagePathWithExtname) {
importPagesCode.push(`import('${virtualPagePath(pagePathWithExtname)}')`)
}
})
return `if(!Math){
${importPagesCode.join('\n')}
}`
}
import path from 'path'
import { normalizePath } from '@dcloudio/uni-cli-shared'
import { Plugin } from 'vite'
import { UniMiniProgramPluginOptions } from '../plugin'
function encode(str: string) {
return Buffer.from(str).toString('base64url')
}
function decode(str: string) {
return Buffer.from(str, 'base64url').toString()
}
const uniPagePrefix = 'uniPage://'
const uniComponentPrefix = 'uniComponent://'
export function virtualPagePath(filepath: string) {
return uniPagePrefix + encode(filepath)
}
export function virtualComponentPath(filepath: string) {
return uniComponentPrefix + encode(filepath)
}
export function parseVirtualPagePath(uniPageUrl: string) {
return decode(uniPageUrl.replace(uniPagePrefix, ''))
}
export function parseVirtualComponentPath(uniComponentUrl: string) {
return decode(uniComponentUrl.replace(uniComponentPrefix, ''))
}
export function isUniPageUrl(id: string) {
return id.startsWith(uniPagePrefix)
}
export function isUniComponentUrl(id: string) {
return id.startsWith(uniComponentPrefix)
}
export function uniVirtualPlugin({
global,
}: UniMiniProgramPluginOptions): Plugin {
const inputDir = process.env.UNI_INPUT_DIR
return {
name: 'vite:uni-virtual',
enforce: 'pre',
resolveId(id) {
if (isUniPageUrl(id) || isUniComponentUrl(id)) {
return id
}
},
load(id) {
if (isUniPageUrl(id)) {
const filepath = normalizePath(
path.resolve(inputDir, parseVirtualPagePath(id))
)
return {
code: `import Page from '${filepath}?mpType=page'
${global}.createPage(Page)`,
}
} else if (isUniComponentUrl(id)) {
const filepath = normalizePath(
path.resolve(inputDir, parseVirtualComponentPath(id))
)
return {
code: `import Component from '${filepath}'
${global}.createComponent(Component)`,
}
}
},
}
}
{ [
"input": { {
"src/runtime/index.ts": "dist/uni.mp.esm.js", "input": {
"src/api/index.ts": "dist/uni.api.esm.js" "src/plugin/index.ts": "dist/uni.compiler.js"
},
"output": {
"format": "cjs"
},
"external": ["@dcloudio/uni-cli-shared", "@dcloudio/uni-mp-vite"]
}, },
"alias": { {
"entries": [ "input": {
{ "src/runtime/index.ts": "dist/uni.mp.esm.js",
"find": "@dcloudio/uni-platform", "src/api/index.ts": "dist/uni.api.esm.js"
"replacement": "packages/uni-mp-weixin/src/platform/index.ts" },
}, "alias": {
{ "entries": [
"find": "@dcloudio/uni-mp-platform", {
"replacement": "packages/uni-mp-core/src/platform/index.ts" "find": "@dcloudio/uni-platform",
} "replacement": "packages/uni-mp-weixin/src/platform/index.ts"
] },
}, {
"replacements": { "find": "@dcloudio/uni-mp-platform",
"global": "global", "replacement": "packages/uni-mp-core/src/platform/index.ts"
"__GLOBAL__": "wx", }
"__PLATFORM__": "\"mp-weixin\"", ]
"__PLATFORM_TITLE__": "微信小程序" },
}, "replacements": {
"external": ["@dcloudio/uni-i18n", "@vue/shared", "vue"] "global": "global",
} "__GLOBAL__": "wx",
"__PLATFORM__": "\"mp-weixin\"",
"__PLATFORM_TITLE__": "微信小程序"
},
"external": ["@dcloudio/uni-i18n", "@vue/shared", "vue"]
}
]
'use strict';
var uniCliShared = require('@dcloudio/uni-cli-shared');
var initMiniProgramPlugin = require('@dcloudio/uni-mp-vite');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var initMiniProgramPlugin__default = /*#__PURE__*/_interopDefaultLegacy(initMiniProgramPlugin);
var index = initMiniProgramPlugin__default["default"]({
global: 'wx',
alias: {
'uni-mp-runtime': uniCliShared.resolveBuiltIn('@dcloudio/uni-mp-weixin/dist/uni.mp.esm.js'),
},
});
module.exports = index;
...@@ -18,7 +18,9 @@ ...@@ -18,7 +18,9 @@
"license": "Apache-2.0", "license": "Apache-2.0",
"uni-app": { "uni-app": {
"name": "mp-weixin", "name": "mp-weixin",
"title": "微信小程序" "title": "微信小程序",
"apply": "mp-weixin",
"main": "dist/uni.compiler.js"
}, },
"gitHead": "453a3e6ead807864087692f4339ea3d667045fe7" "gitHead": "453a3e6ead807864087692f4339ea3d667045fe7"
} }
import { resolveBuiltIn } from '@dcloudio/uni-cli-shared'
import initMiniProgramPlugin from '@dcloudio/uni-mp-vite'
export default initMiniProgramPlugin({
global: 'wx',
alias: {
'uni-mp-runtime': resolveBuiltIn(
'@dcloudio/uni-mp-weixin/dist/uni.mp.esm.js'
),
},
})
...@@ -7,6 +7,7 @@ import type { ...@@ -7,6 +7,7 @@ import type {
UniViteCopyPluginTarget, UniViteCopyPluginTarget,
UniVitePlugin, UniVitePlugin,
} from '@dcloudio/uni-cli-shared' } from '@dcloudio/uni-cli-shared'
import { TemplateCompiler } from '@vue/compiler-sfc'
interface PluginConfig { interface PluginConfig {
id: string id: string
...@@ -26,12 +27,17 @@ export function initPluginUniOptions(UniVitePlugins: UniVitePlugin[]) { ...@@ -26,12 +27,17 @@ export function initPluginUniOptions(UniVitePlugins: UniVitePlugin[]) {
isNativeTag, isNativeTag,
isCustomElement, isCustomElement,
} }
let compiler: TemplateCompiler | undefined
UniVitePlugins.forEach((plugin) => { UniVitePlugins.forEach((plugin) => {
const { const {
compiler: pluginTemplateCompiler,
copyOptions: pluginCopyOptions, copyOptions: pluginCopyOptions,
compilerOptions: pluginCompilerOptions, compilerOptions: pluginCompilerOptions,
transformEvent: pluginTransformEvent, transformEvent: pluginTransformEvent,
} = plugin.uni || {} } = plugin.uni || {}
if (pluginTemplateCompiler) {
compiler = pluginTemplateCompiler
}
if (pluginCompilerOptions) { if (pluginCompilerOptions) {
if (pluginCompilerOptions.isNativeTag) { if (pluginCompilerOptions.isNativeTag) {
compilerOptions.isNativeTag = pluginCompilerOptions.isNativeTag compilerOptions.isNativeTag = pluginCompilerOptions.isNativeTag
...@@ -61,6 +67,7 @@ export function initPluginUniOptions(UniVitePlugins: UniVitePlugin[]) { ...@@ -61,6 +67,7 @@ export function initPluginUniOptions(UniVitePlugins: UniVitePlugin[]) {
} }
}) })
return { return {
compiler,
copyOptions: { copyOptions: {
assets, assets,
targets, targets,
......
import { extend, hasOwn, isArray, isPlainObject } from '@vue/shared' import { extend, hasOwn, isArray, isPlainObject } from '@vue/shared'
import { SFCTemplateCompileOptions } from '@vue/compiler-sfc' import { SFCTemplateCompileOptions, TemplateCompiler } from '@vue/compiler-sfc'
import { isCustomElement } from '@dcloudio/uni-shared' import { isCustomElement } from '@dcloudio/uni-shared'
import { import {
EXTNAME_VUE_RE, EXTNAME_VUE_RE,
...@@ -38,7 +38,11 @@ function createUniVueTransformAssetUrls( ...@@ -38,7 +38,11 @@ function createUniVueTransformAssetUrls(
export function initPluginVueOptions( export function initPluginVueOptions(
options: VitePluginUniResolvedOptions, options: VitePluginUniResolvedOptions,
UniVitePlugins: UniVitePlugin[], UniVitePlugins: UniVitePlugin[],
uniPluginOptions: Required<Required<UniVitePlugin>['uni']> uniPluginOptions: Required<
Omit<Required<UniVitePlugin>['uni'], 'compiler'>
> & {
compiler?: TemplateCompiler
}
) { ) {
const vueOptions = options.vueOptions || (options.vueOptions = {}) const vueOptions = options.vueOptions || (options.vueOptions = {})
if (!vueOptions.include) { if (!vueOptions.include) {
...@@ -66,6 +70,7 @@ export function initPluginVueOptions( ...@@ -66,6 +70,7 @@ export function initPluginVueOptions(
templateOptions.compilerOptions || (templateOptions.compilerOptions = {}) templateOptions.compilerOptions || (templateOptions.compilerOptions = {})
const { const {
compiler,
compilerOptions: { compilerOptions: {
isNativeTag, isNativeTag,
isCustomElement, isCustomElement,
...@@ -73,6 +78,9 @@ export function initPluginVueOptions( ...@@ -73,6 +78,9 @@ export function initPluginVueOptions(
directiveTransforms, directiveTransforms,
}, },
} = uniPluginOptions } = uniPluginOptions
if (compiler) {
templateOptions.compiler = compiler
}
compilerOptions.isNativeTag = isNativeTag compilerOptions.isNativeTag = isNativeTag
compilerOptions.isCustomElement = isCustomElement compilerOptions.isCustomElement = isCustomElement
if (directiveTransforms) { if (directiveTransforms) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册