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

wip(mp): css

上级 81329b2e
...@@ -12,6 +12,7 @@ export const configResolved: Plugin['configResolved'] = (config) => { ...@@ -12,6 +12,7 @@ export const configResolved: Plugin['configResolved'] = (config) => {
removePlugins('vite:import-analysis', config) removePlugins('vite:import-analysis', config)
injectCssPlugin(config) injectCssPlugin(config)
injectCssPostPlugin(config, { injectCssPostPlugin(config, {
extname: '.css',
appCss: fs.readFileSync( appCss: fs.readFileSync(
require.resolve('@dcloudio/uni-app-plus/dist/style.css'), require.resolve('@dcloudio/uni-app-plus/dist/style.css'),
'utf8' 'utf8'
......
...@@ -49,3 +49,15 @@ export function removeExt(str: string, ext?: string) { ...@@ -49,3 +49,15 @@ export function removeExt(str: string, ext?: string) {
} }
return normalizePath(str.replace(/\.\w+$/g, '')) return normalizePath(str.replace(/\.\w+$/g, ''))
} }
const NODE_MODULES_REGEX = /(\.\.\/)?node_modules/g
export function normalizeNodeModules(str: string) {
str = normalizePath(str).replace(NODE_MODULES_REGEX, 'node-modules')
// HBuilderX 内置模块路径转换
str = str.replace(/.*\/plugins\/uniapp-cli\/node[-_]modules/, 'node-modules')
if (process.env.UNI_PLATFORM === 'mp-alipay') {
str = str.replace('node-modules/@', 'node-modules/npm-scope-')
}
return str
}
import type { Plugin } from 'vite' import type { Plugin } from 'vite'
import type { EmittedFile } from 'rollup'
import type { ParserOptions } from '@vue/compiler-core' import type { ParserOptions } from '@vue/compiler-core'
import type { CompilerOptions, TemplateCompiler } 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 {
/** /**
* 静态资源,配置的目录,在 uni_modules 中同样支持 * 静态资源,配置的目录,在 uni_modules 中同样支持
...@@ -13,6 +15,9 @@ export interface CopyOptions { ...@@ -13,6 +15,9 @@ export interface CopyOptions {
interface UniVitePluginUniOptions { interface UniVitePluginUniOptions {
compiler?: TemplateCompiler compiler?: TemplateCompiler
compilerOptions?: { compilerOptions?: {
miniProgram?: {
emitFile?: (emittedFile: EmittedFile) => string
}
isNativeTag: ParserOptions['isNativeTag'] isNativeTag: ParserOptions['isNativeTag']
isCustomElement: ParserOptions['isCustomElement'] isCustomElement: ParserOptions['isCustomElement']
directiveTransforms?: CompilerOptions['directiveTransforms'] directiveTransforms?: CompilerOptions['directiveTransforms']
......
...@@ -178,14 +178,14 @@ export function cssPlugin(config: ResolvedConfig): Plugin { ...@@ -178,14 +178,14 @@ export function cssPlugin(config: ResolvedConfig): Plugin {
} }
} }
function normalizeCssChunkFilename(id: string) { function normalizeCssChunkFilename(id: string, extname: string = '.css') {
return normalizePath( return normalizePath(
path.relative( path.relative(
process.env.UNI_INPUT_DIR, process.env.UNI_INPUT_DIR,
id id
.split('?')[0] .split('?')[0]
.replace(EXTNAME_VUE_RE, '.css') .replace(EXTNAME_VUE_RE, extname)
.replace(EXTNAME_JS_RE, '.css') .replace(EXTNAME_JS_RE, extname)
) )
) )
} }
...@@ -228,7 +228,7 @@ function findCssModuleIds( ...@@ -228,7 +228,7 @@ function findCssModuleIds(
*/ */
export function cssPostPlugin( export function cssPostPlugin(
config: ResolvedConfig, config: ResolvedConfig,
{ appCss }: { appCss?: string } { appCss, extname }: { appCss?: string; extname: string }
): Plugin { ): 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>()
...@@ -259,11 +259,11 @@ export function cssPostPlugin( ...@@ -259,11 +259,11 @@ export function cssPostPlugin(
moduleIds.forEach((id) => { moduleIds.forEach((id) => {
if (id === mainPath) { if (id === mainPath) {
// 全局样式 // 全局样式
cssChunks.set('app.css', findCssModuleIds.call(this, id)) cssChunks.set('app' + extname, findCssModuleIds.call(this, id))
} else if (id.includes('mpType=page')) { } else if (id.includes('mpType=page')) {
// 页面样式 // 页面样式
cssChunks.set( cssChunks.set(
normalizeCssChunkFilename(id), normalizeCssChunkFilename(id, extname),
findCssModuleIds.call(this, id) findCssModuleIds.call(this, id)
) )
} }
......
...@@ -19,9 +19,9 @@ export function injectCssPlugin(config: ResolvedConfig) { ...@@ -19,9 +19,9 @@ export function injectCssPlugin(config: ResolvedConfig) {
export function injectCssPostPlugin( export function injectCssPostPlugin(
config: ResolvedConfig, config: ResolvedConfig,
{ appCss }: { appCss?: string } { appCss, extname }: { appCss?: string; extname: string }
) { ) {
replacePlugins([cssPostPlugin(config, { appCss })], config) replacePlugins([cssPostPlugin(config, { appCss, extname })], config)
} }
export function replacePlugins(plugins: Plugin[], config: ResolvedConfig) { export function replacePlugins(plugins: Plugin[], config: ResolvedConfig) {
......
...@@ -48,8 +48,11 @@ export function baseCompile(template: string, options: CompilerOptions = {}) { ...@@ -48,8 +48,11 @@ export function baseCompile(template: string, options: CompilerOptions = {}) {
}) })
) )
const result = extend(generate(context.scope, options), { ast }) const result = extend(generate(context.scope, options), { ast })
if (options.filename && options.emitFile) { if (options.filename && options.miniProgram?.emitFile) {
genTemplate(ast, { filename: options.filename, emitFile: options.emitFile }) genTemplate(ast, {
filename: options.filename,
emitFile: options.miniProgram.emitFile,
})
} }
return result return result
......
...@@ -60,7 +60,9 @@ export interface CodegenOptions extends SharedTransformCodegenOptions { ...@@ -60,7 +60,9 @@ export interface CodegenOptions extends SharedTransformCodegenOptions {
scopeId?: string | null scopeId?: string | null
runtimeModuleName?: string runtimeModuleName?: string
runtimeGlobalName?: string runtimeGlobalName?: string
emitFile?: (emittedFile: EmittedFile) => string miniProgram?: {
emitFile?: (emittedFile: EmittedFile) => string
}
} }
export interface TemplateCodegenOptions { export interface TemplateCodegenOptions {
......
...@@ -3,6 +3,7 @@ import { uniMainJsPlugin } from './plugins/mainJs' ...@@ -3,6 +3,7 @@ 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'
import { uniVirtualPlugin } from './plugins/virtual' import { uniVirtualPlugin } from './plugins/virtual'
export { UniMiniProgramPluginOptions } from './plugin'
export default (options: UniMiniProgramPluginOptions) => { export default (options: UniMiniProgramPluginOptions) => {
return [ return [
uniMainJsPlugin(options), uniMainJsPlugin(options),
......
import fs from 'fs'
import path from 'path' import path from 'path'
import { UserConfig } from 'vite' import { UserConfig } from 'vite'
import { import {
emptyDir,
isCSSRequest, isCSSRequest,
normalizePath, normalizePath,
resolveMainPathOnce, resolveMainPathOnce,
...@@ -16,8 +18,14 @@ import { ...@@ -16,8 +18,14 @@ import {
export function buildOptions(): UserConfig['build'] { export function buildOptions(): UserConfig['build'] {
const inputDir = process.env.UNI_INPUT_DIR const inputDir = process.env.UNI_INPUT_DIR
const outputDir = process.env.UNI_OUTPUT_DIR
// 开始编译时,清空输出目录
if (fs.existsSync(outputDir)) {
emptyDir(outputDir)
}
return { return {
// sourcemap: 'inline', // TODO // sourcemap: 'inline', // TODO
emptyOutDir: false, // 不清空输出目录,否则会影响自定义的一些文件输出,比如wxml
assetsInlineLimit: 0, // TODO assetsInlineLimit: 0, // TODO
lib: { lib: {
entry: resolveMainPathOnce(inputDir), entry: resolveMainPathOnce(inputDir),
......
...@@ -6,12 +6,18 @@ import { ...@@ -6,12 +6,18 @@ import {
injectCssPlugin, injectCssPlugin,
injectCssPostPlugin, injectCssPostPlugin,
} from '@dcloudio/uni-cli-shared' } from '@dcloudio/uni-cli-shared'
import { UniMiniProgramPluginOptions } from '.'
export const configResolved: Plugin['configResolved'] = (config) => { export function createConfigResolved({
removePlugins('vite:import-analysis', config) style: { extname },
injectCssPlugin(config) }: UniMiniProgramPluginOptions): Plugin['configResolved'] {
injectCssPostPlugin(config, { return (config) => {
appCss: '', removePlugins('vite:import-analysis', config)
}) injectCssPlugin(config)
injectAssetPlugin(config) injectCssPostPlugin(config, {
extname,
appCss: '',
})
injectAssetPlugin(config)
}
} }
import path from 'path'
import debug from 'debug'
import fs from 'fs-extra'
import { AliasOptions } from 'vite' import { AliasOptions } from 'vite'
import { resolveBuiltIn, UniVitePlugin } from '@dcloudio/uni-cli-shared' import {
EXTNAME_VUE_RE,
normalizeNodeModules,
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 { createConfigResolved } from './configResolved'
import { EmittedFile } from 'rollup'
const debugMp = debug('vite:uni:mp')
export interface UniMiniProgramPluginOptions { export interface UniMiniProgramPluginOptions {
vite: {
alias: AliasOptions
}
global: string global: string
alias?: AliasOptions app: {
darkmode: boolean
subpackages: boolean
}
project: {
filename: string
}
template: {
extname: string
}
style: {
extname: string
cssVars: {
'--status-bar-height': string
'--window-top': string
'--window-bottom': string
'--window-left': string
'--window-right': string
}
}
filter?: {
extname: string
tag: string
}
} }
export function uniMiniProgramPlugin({ export function uniMiniProgramPlugin(
alias, options: UniMiniProgramPluginOptions
}: UniMiniProgramPluginOptions): UniVitePlugin { ): UniVitePlugin {
const {
vite: { alias },
template,
} = 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.outputFileSync(outputFilename, emittedFile.source!)
return outputFilename
}
return ''
}
return { return {
name: 'vite:uni-mp', name: 'vite:uni-mp',
uni: uniOptions(), uni: uniOptions({ emitFile }),
config() { config() {
return { return {
resolve: { resolve: {
...@@ -27,6 +82,6 @@ export function uniMiniProgramPlugin({ ...@@ -27,6 +82,6 @@ export function uniMiniProgramPlugin({
build: buildOptions(), build: buildOptions(),
} }
}, },
configResolved, configResolved: createConfigResolved(options),
} }
} }
...@@ -2,15 +2,19 @@ import { ...@@ -2,15 +2,19 @@ import {
isServiceNativeTag, isServiceNativeTag,
isServiceCustomElement, isServiceCustomElement,
} from '@dcloudio/uni-shared' } from '@dcloudio/uni-shared'
import { EmittedFile } from 'rollup'
import { UniVitePlugin } from '@dcloudio/uni-cli-shared' import { UniVitePlugin } from '@dcloudio/uni-cli-shared'
import { TemplateCompiler } from '@vue/compiler-sfc' import { TemplateCompiler } from '@vue/compiler-sfc'
import * as compiler from '@dcloudio/uni-mp-compiler' import * as compiler from '@dcloudio/uni-mp-compiler'
export function uniOptions(): UniVitePlugin['uni'] { export function uniOptions(miniProgram: {
emitFile?: (emittedFile: EmittedFile) => string
}): UniVitePlugin['uni'] {
return { return {
compiler: compiler as TemplateCompiler, compiler: compiler as TemplateCompiler,
compilerOptions: { compilerOptions: {
miniProgram,
isNativeTag: isServiceNativeTag, isNativeTag: isServiceNativeTag,
isCustomElement: isServiceCustomElement, isCustomElement: isServiceCustomElement,
}, },
......
...@@ -17,14 +17,38 @@ const uniMiniProgramWeixinPlugin = { ...@@ -17,14 +17,38 @@ const uniMiniProgramWeixinPlugin = {
}; };
}, },
}; };
var index = [ const options = {
uniMiniProgramWeixinPlugin, vite: {
...initMiniProgramPlugin__default["default"]({
global: 'wx',
alias: { alias: {
'uni-mp-runtime': uniCliShared.resolveBuiltIn('@dcloudio/uni-mp-weixin/dist/uni.mp.esm.js'), 'uni-mp-runtime': uniCliShared.resolveBuiltIn('@dcloudio/uni-mp-weixin/dist/uni.mp.esm.js'),
}, },
}), },
]; global: 'wx',
app: {
darkmode: true,
subpackages: true,
},
project: {
filename: 'project.config.json',
},
template: {
extname: '.wxml',
},
style: {
extname: '.wxss',
cssVars: {
'--status-bar-height': '25px',
'--window-top': '0px',
'--window-bottom': '0px',
'--window-left': '0px',
'--window-right': '0px',
},
},
filter: {
extname: '.wxs',
tag: 'wxs',
},
};
var index = [uniMiniProgramWeixinPlugin, ...initMiniProgramPlugin__default["default"](options)];
module.exports = index; module.exports = index;
import { Plugin } from 'vite' import { Plugin } from 'vite'
import { resolveBuiltIn } from '@dcloudio/uni-cli-shared' import { resolveBuiltIn } from '@dcloudio/uni-cli-shared'
import initMiniProgramPlugin from '@dcloudio/uni-mp-vite' import initMiniProgramPlugin, {
UniMiniProgramPluginOptions,
} from '@dcloudio/uni-mp-vite'
const uniMiniProgramWeixinPlugin: Plugin = { const uniMiniProgramWeixinPlugin: Plugin = {
name: 'vite:uni-mp-weixin', name: 'vite:uni-mp-weixin',
...@@ -13,14 +15,39 @@ const uniMiniProgramWeixinPlugin: Plugin = { ...@@ -13,14 +15,39 @@ const uniMiniProgramWeixinPlugin: Plugin = {
}, },
} }
export default [ const options: UniMiniProgramPluginOptions = {
uniMiniProgramWeixinPlugin, vite: {
...initMiniProgramPlugin({
global: 'wx',
alias: { alias: {
'uni-mp-runtime': resolveBuiltIn( 'uni-mp-runtime': resolveBuiltIn(
'@dcloudio/uni-mp-weixin/dist/uni.mp.esm.js' '@dcloudio/uni-mp-weixin/dist/uni.mp.esm.js'
), ),
}, },
}), },
] global: 'wx',
app: {
darkmode: true,
subpackages: true,
},
project: {
filename: 'project.config.json',
},
template: {
extname: '.wxml',
},
style: {
extname: '.wxss',
cssVars: {
'--status-bar-height': '25px',
'--window-top': '0px',
'--window-bottom': '0px',
'--window-left': '0px',
'--window-right': '0px',
},
},
filter: {
extname: '.wxs',
tag: 'wxs',
},
}
export default [uniMiniProgramWeixinPlugin, ...initMiniProgramPlugin(options)]
...@@ -39,16 +39,7 @@ export function initPluginUniOptions(UniVitePlugins: UniVitePlugin[]) { ...@@ -39,16 +39,7 @@ export function initPluginUniOptions(UniVitePlugins: UniVitePlugin[]) {
compiler = pluginTemplateCompiler compiler = pluginTemplateCompiler
} }
if (pluginCompilerOptions) { if (pluginCompilerOptions) {
if (pluginCompilerOptions.isNativeTag) { extend(compilerOptions, pluginCompilerOptions)
compilerOptions.isNativeTag = pluginCompilerOptions.isNativeTag
}
if (pluginCompilerOptions.isCustomElement) {
compilerOptions.isCustomElement = pluginCompilerOptions.isCustomElement
}
if (pluginCompilerOptions.directiveTransforms) {
compilerOptions.directiveTransforms =
pluginCompilerOptions.directiveTransforms
}
} }
if (pluginTransformEvent) { if (pluginTransformEvent) {
extend(transformEvent, pluginTransformEvent) extend(transformEvent, pluginTransformEvent)
......
...@@ -72,6 +72,7 @@ export function initPluginVueOptions( ...@@ -72,6 +72,7 @@ export function initPluginVueOptions(
const { const {
compiler, compiler,
compilerOptions: { compilerOptions: {
miniProgram,
isNativeTag, isNativeTag,
isCustomElement, isCustomElement,
nodeTransforms, nodeTransforms,
...@@ -81,6 +82,9 @@ export function initPluginVueOptions( ...@@ -81,6 +82,9 @@ export function initPluginVueOptions(
if (compiler) { if (compiler) {
templateOptions.compiler = compiler templateOptions.compiler = compiler
} }
if (miniProgram) {
;(compilerOptions as any).miniProgram = miniProgram
}
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.
先完成此消息的编辑!
想要评论请 注册