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

wip(mp): wxs

上级 f4cf5761
export * from './nvue' export * from './nvue'
export * from './event' export * from './event'
export * from './style' export * from './style'
export * from './template'
export { transformVueComponentImports } from './transformImports' export { transformVueComponentImports } from './transformImports'
import { LINEFEED } from '@dcloudio/uni-shared'
export interface MiniProgramFilterOptions {
id: string
type: 'wxs'
name: string
src?: string
code: string
}
type GenFilterFn = (filter: MiniProgramFilterOptions) => string | void
const templateFilesCache = new Map<string, string>()
const templateFiltersCache = new Map<string, Set<MiniProgramFilterOptions>>()
export function findMiniProgramTemplateFiles(genFilter?: GenFilterFn) {
const files: Record<string, string> = Object.create(null)
templateFilesCache.forEach((code, filename) => {
if (!genFilter) {
files[filename] = code
} else {
const filters = getMiniProgramTemplateFilters(filename)
if (filters.length) {
files[filename] =
filters.map((filter) => genFilter(filter)).join(LINEFEED) +
LINEFEED +
code
} else {
files[filename] = code
}
}
})
return files
}
export function clearMiniProgramTemplateFiles() {
templateFilesCache.clear()
}
export function addMiniProgramTemplateFile(filename: string, code: string) {
templateFilesCache.set(filename, code)
}
function getMiniProgramTemplateFilters(filename: string) {
return [...(templateFiltersCache.get(filename) || [])]
}
export function clearMiniProgramTemplateFilter(filename: string) {
templateFiltersCache.delete(filename)
}
export function addMiniProgramTemplateFilter(
filename: string,
filter: MiniProgramFilterOptions
) {
const filters = templateFiltersCache.get(filename)
if (filters) {
filters.add(filter)
} else {
templateFiltersCache.set(
filename,
new Set<MiniProgramFilterOptions>([filter])
)
}
}
import path from 'path' import { AliasOptions, ResolvedConfig } from 'vite'
import debug from 'debug'
import fs from 'fs-extra'
import { AliasOptions } from 'vite'
import { import {
CopyOptions, CopyOptions,
EXTNAME_VUE_RE,
normalizeNodeModules,
resolveBuiltIn, resolveBuiltIn,
UniVitePlugin, UniVitePlugin,
genNVueCssCode, genNVueCssCode,
parseManifestJsonOnce, parseManifestJsonOnce,
findMiniProgramTemplateFiles,
} from '@dcloudio/uni-cli-shared' } from '@dcloudio/uni-cli-shared'
import { uniOptions } from './uni' import { uniOptions } from './uni'
import { buildOptions } from './build' import { buildOptions } from './build'
import { createConfigResolved } from './configResolved' import { createConfigResolved } from './configResolved'
import { EmittedFile } from 'rollup' import { emitFile, getFilterFiles, getTemplateFiles } from './template'
const debugMp = debug('vite:uni:mp')
export interface UniMiniProgramPluginOptions { export interface UniMiniProgramPluginOptions {
vite: { vite: {
alias: AliasOptions alias: AliasOptions
...@@ -42,6 +37,11 @@ export interface UniMiniProgramPluginOptions { ...@@ -42,6 +37,11 @@ export interface UniMiniProgramPluginOptions {
// 是否支持fallback content // 是否支持fallback content
fallback: boolean fallback: boolean
} }
filter?: {
extname: string
tag: string
generate: Parameters<typeof findMiniProgramTemplateFiles>[0]
}
} }
style: { style: {
extname: string extname: string
...@@ -53,10 +53,6 @@ export interface UniMiniProgramPluginOptions { ...@@ -53,10 +53,6 @@ export interface UniMiniProgramPluginOptions {
'--window-right': string '--window-right': string
} }
} }
filter?: {
extname: string
tag: string
}
} }
export function uniMiniProgramPlugin( export function uniMiniProgramPlugin(
...@@ -67,22 +63,9 @@ export function uniMiniProgramPlugin( ...@@ -67,22 +63,9 @@ export function uniMiniProgramPlugin(
template, template,
style, style,
} = options } = options
const emitFile: (emittedFile: EmittedFile) => string = (emittedFile) => {
if (emittedFile.type === 'asset') {
const filename = emittedFile.fileName!
const outputFilename = normalizeNodeModules(
path.resolve(
process.env.UNI_OUTPUT_DIR,
path.relative(process.env.UNI_INPUT_DIR, filename)
)
).replace(EXTNAME_VUE_RE, template.extname)
debugMp(outputFilename)
fs.outputFile(outputFilename, emittedFile.source!)
return outputFilename
}
return ''
}
let isFirst = true let isFirst = true
let resolvedConfig: ResolvedConfig
return { return {
name: 'vite:uni-mp', name: 'vite:uni-mp',
uni: uniOptions({ uni: uniOptions({
...@@ -104,8 +87,30 @@ export function uniMiniProgramPlugin( ...@@ -104,8 +87,30 @@ export function uniMiniProgramPlugin(
build: buildOptions(), build: buildOptions(),
} }
}, },
configResolved: createConfigResolved(options), configResolved(config) {
resolvedConfig = config
return createConfigResolved(options)!(config)
},
generateBundle() { generateBundle() {
if (template.filter) {
const extname = template.filter.extname
const filterFiles = getFilterFiles(resolvedConfig, this.getModuleInfo)
Object.keys(filterFiles).forEach((filename) => {
this.emitFile({
type: 'asset',
fileName: filename + extname,
source: filterFiles[filename],
})
})
}
const templateFiles = getTemplateFiles(template)
Object.keys(templateFiles).forEach((filename) => {
this.emitFile({
type: 'asset',
fileName: filename + template.extname,
source: templateFiles[filename],
})
})
if (isFirst) { if (isFirst) {
// 仅生成一次 // 仅生成一次
isFirst = false isFirst = false
......
import path from 'path'
import debug from 'debug'
import { EmittedFile, GetModuleInfo } from 'rollup'
import { ResolvedConfig } from 'vite'
import {
addMiniProgramTemplateFile,
removeExt,
normalizeMiniProgramFilename,
MiniProgramFilterOptions,
findMiniProgramTemplateFiles,
addMiniProgramTemplateFilter,
clearMiniProgramTemplateFiles,
} from '@dcloudio/uni-cli-shared'
import { getFiltersCache } from '../plugins/renderjs'
import { UniMiniProgramPluginOptions } from '.'
const debugTemplate = debug('vite:uni:mp-template')
export function getFilterFiles(
resolvedConfig: ResolvedConfig,
getModuleInfo: GetModuleInfo
) {
const filters: Record<string, string> = Object.create(null)
const filtersCache = getFiltersCache(resolvedConfig)
if (!filtersCache.length) {
return filters
}
const inputDir = process.env.UNI_INPUT_DIR
function addFilter(id: string, filter: MiniProgramFilterOptions) {
const templateFilename = removeExt(
normalizeMiniProgramFilename(id, inputDir)
)
addMiniProgramTemplateFilter(templateFilename, filter)
const filterFilename = removeExt(
normalizeMiniProgramFilename(filter.id, inputDir)
)
if (templateFilename !== filterFilename) {
// 外链
filter.src = filterFilename
filters[filterFilename] = filter.code
}
}
filtersCache.forEach((filter) => {
const moduleInfo = getModuleInfo(filter.id)
if (!moduleInfo) {
return
}
const { importers } = moduleInfo
if (!importers.length) {
return
}
importers.forEach((importer) => addFilter(importer, filter))
})
return filters
}
export function getTemplateFiles(
template: UniMiniProgramPluginOptions['template']
) {
const files = findMiniProgramTemplateFiles(template.filter!.generate)
clearMiniProgramTemplateFiles()
return files
}
export const emitFile: (emittedFile: EmittedFile) => string = (emittedFile) => {
if (emittedFile.type === 'asset') {
const filename = emittedFile.fileName!
addMiniProgramTemplateFile(
removeExt(
normalizeMiniProgramFilename(
path.relative(process.env.UNI_INPUT_DIR, filename)
)
),
emittedFile.source!.toString()
)
debugTemplate(filename)
return filename
}
return ''
}
import debug from 'debug' import debug from 'debug'
import { Plugin } from 'vite' import { Plugin, ResolvedConfig } from 'vite'
import { missingModuleName, parseRenderjs } from '@dcloudio/uni-cli-shared' import {
MiniProgramFilterOptions,
missingModuleName,
parseRenderjs,
} from '@dcloudio/uni-cli-shared'
const debugRenderjs = debug('vite:uni:renderjs') const debugRenderjs = debug('vite:uni:renderjs')
const filtersCache = new Map<ResolvedConfig, MiniProgramFilterOptions[]>()
export function getFiltersCache(resolvedConfig: ResolvedConfig) {
return filtersCache.get(resolvedConfig) || []
}
export function uniRenderjsPlugin(): Plugin { export function uniRenderjsPlugin(): Plugin {
let resolvedConfig: ResolvedConfig
return { return {
name: 'vite:uni-mp-renderjs', name: 'vite:uni-mp-renderjs',
configResolved(config) {
resolvedConfig = config
},
buildStart() {
filtersCache.set(resolvedConfig, [])
},
transform(code, id) { transform(code, id) {
const { type, name } = parseRenderjs(id) const { type, name } = parseRenderjs(id)
if (!type) { if (!type) {
...@@ -18,12 +35,12 @@ export function uniRenderjsPlugin(): Plugin { ...@@ -18,12 +35,12 @@ export function uniRenderjsPlugin(): Plugin {
this.error(missingModuleName(type, code)) this.error(missingModuleName(type, code))
} }
if (type === 'wxs') { if (type === 'wxs') {
console.log('wxs', id, code) filtersCache.get(resolvedConfig)!.push({
// this.emitFile({ id,
// type: 'asset', type,
// fileName: '', name,
// source: code, code,
// }) })
} }
return { return {
code: 'export default {}', code: 'export default {}',
......
...@@ -107,6 +107,18 @@ const options = { ...@@ -107,6 +107,18 @@ const options = {
source, source,
}, },
template: { template: {
filter: {
extname: '.wxs',
tag: 'wxs',
generate(filter) {
if (filter.src) {
return `<wxs src="/${filter.src}.wxs" module="${filter.name}"/>`;
}
return `<wxs module="${filter.name}">
${filter.code}
</wxs>`;
},
},
slot: { slot: {
fallback: false, fallback: false,
}, },
...@@ -123,10 +135,6 @@ const options = { ...@@ -123,10 +135,6 @@ const options = {
'--window-right': '0px', '--window-right': '0px',
}, },
}, },
filter: {
extname: '.wxs',
tag: 'wxs',
},
}; };
var index = [uniMiniProgramWeixinPlugin, ...initMiniProgramPlugin__default["default"](options)]; var index = [uniMiniProgramWeixinPlugin, ...initMiniProgramPlugin__default["default"](options)];
......
...@@ -61,6 +61,18 @@ const options: UniMiniProgramPluginOptions = { ...@@ -61,6 +61,18 @@ const options: UniMiniProgramPluginOptions = {
source, source,
}, },
template: { template: {
filter: {
extname: '.wxs',
tag: 'wxs',
generate(filter) {
if (filter.src) {
return `<wxs src="/${filter.src}.wxs" module="${filter.name}"/>`
}
return `<wxs module="${filter.name}">
${filter.code}
</wxs>`
},
},
slot: { slot: {
fallback: false, fallback: false,
}, },
...@@ -77,10 +89,6 @@ const options: UniMiniProgramPluginOptions = { ...@@ -77,10 +89,6 @@ const options: UniMiniProgramPluginOptions = {
'--window-right': '0px', '--window-right': '0px',
}, },
}, },
filter: {
extname: '.wxs',
tag: 'wxs',
},
} }
export default [uniMiniProgramWeixinPlugin, ...initMiniProgramPlugin(options)] export default [uniMiniProgramWeixinPlugin, ...initMiniProgramPlugin(options)]
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册