diff --git a/packages/uni-cli-shared/src/transforms/autoImport.ts b/packages/uni-cli-shared/src/easycom/autoImport.ts similarity index 63% rename from packages/uni-cli-shared/src/transforms/autoImport.ts rename to packages/uni-cli-shared/src/easycom/autoImport.ts index d5acec44eba035abd65b801111743b0e52e23787..b16ff7bc849fa44c31615f6224fe92f97e0c4b04 100644 --- a/packages/uni-cli-shared/src/transforms/autoImport.ts +++ b/packages/uni-cli-shared/src/easycom/autoImport.ts @@ -1,11 +1,6 @@ import { - ComponentNode, - ElementNode, - ElementTypes, ExpressionNode, - RootNode, SimpleExpressionNode, - TemplateChildNode, TransformContext } from '@vue/compiler-core' @@ -14,18 +9,10 @@ interface ImportItem { path: string } -const tags = new Set() - -export function isAutoImported(tag: string) { - return tags.has(tag) -} - export function addAutoImport( - tag: string, importItem: ImportItem, context: TransformContext ) { - tag && tags.add(tag) const importPath = importItem.path const importContent = (importItem.exp as SimpleExpressionNode).content const importsArray = Array.from(context.imports) @@ -40,8 +27,3 @@ export function addAutoImport( context.imports.add(importItem) return true } - -export const isComponentNode = ( - node: RootNode | TemplateChildNode -): node is ComponentNode => - (node as ElementNode).tagType === ElementTypes.COMPONENT diff --git a/packages/uni-cli-shared/src/easycom.ts b/packages/uni-cli-shared/src/easycom/index.ts similarity index 86% rename from packages/uni-cli-shared/src/easycom.ts rename to packages/uni-cli-shared/src/easycom/index.ts index 8699574433d29e71bd7a06fb3d39b1f0333d4559..915211a1ce0938ae21e5a753556501fa2c3310f7 100644 --- a/packages/uni-cli-shared/src/easycom.ts +++ b/packages/uni-cli-shared/src/easycom/index.ts @@ -1,6 +1,15 @@ import fs from 'fs' import path from 'path' import debug from 'debug' + +import { + RootNode, + ElementNode, + ElementTypes, + ComponentNode, + TemplateChildNode +} from '@vue/compiler-core' + interface EasycomOption { dirs?: string[] rootDir?: string @@ -15,6 +24,8 @@ interface EasycomCustom { [key: string]: string } +export * from './autoImport' + export const debugEasycom = debug('easycom') const easycoms: EasycomMatcher[] = [] @@ -26,10 +37,27 @@ let hasEasycom = false function clearEasycom() { easycoms.length = 0 + + tags.clear() easycomsCache.clear() easycomsInvalidCache.clear() } +const tags = new Set() + +export function isEasycomTag(tag: string) { + return tags.has(tag) +} + +export function addEasycomTag(tag: string) { + return tags.add(tag) +} + +export const isComponentNode = ( + node: RootNode | TemplateChildNode +): node is ComponentNode => + (node as ElementNode).tagType === ElementTypes.COMPONENT + export function initEasycom({ dirs, rootDir, diff --git a/packages/uni-cli-shared/src/index.ts b/packages/uni-cli-shared/src/index.ts index 5958a7c95872bcb28ff398bff6b75e89d4d75a5b..ded3ed958604b46d192eee8f71fe7673106cfee4 100644 --- a/packages/uni-cli-shared/src/index.ts +++ b/packages/uni-cli-shared/src/index.ts @@ -1,7 +1,6 @@ export * from './json' -export * from './easycom' +export * from './easycom/index' export * from './vueCompilerOptions' export * from './transforms/transformBuiltInComponent' export * from './transforms/transformBuiltInEasycom' export * from './transforms/transformEasycom' -export { isAutoImported } from './transforms/autoImport' diff --git a/packages/uni-cli-shared/src/transforms/transformBuiltInComponent.ts b/packages/uni-cli-shared/src/transforms/transformBuiltInComponent.ts index f5b6bc40ebcade0d00d56527207c5f32db5c9542..a67ddbbd26df98dfa2cb13d09a6cdcaee0ac41e2 100644 --- a/packages/uni-cli-shared/src/transforms/transformBuiltInComponent.ts +++ b/packages/uni-cli-shared/src/transforms/transformBuiltInComponent.ts @@ -10,7 +10,7 @@ import { import { COMPONENT_PREFIX, isBuiltInComponent } from '@dcloudio/uni-shared' -import { addAutoImport, isComponentNode } from './autoImport' +import { addAutoImport, isComponentNode } from '../easycom' const COMPONENTS_PATH = '@dcloudio/uni-h5/dist/uni-h5.esm.js' @@ -52,7 +52,7 @@ export const transformBuiltInComponent: NodeTransform = (node, context) => { return } node.tag = COMPONENT_PREFIX + tag - if (addAutoImport(node.tag, createComponentImportItem(tag, node), context)) { - addAutoImport('', createStyleImportItem(tag, node), context) + if (addAutoImport(createComponentImportItem(tag, node), context)) { + addAutoImport(createStyleImportItem(tag, node), context) } } diff --git a/packages/uni-cli-shared/src/transforms/transformBuiltInEasycom.ts b/packages/uni-cli-shared/src/transforms/transformBuiltInEasycom.ts index 176e369154c1ad982c1d2f151d8da50cfbd40861..2837770de5a5acf32b2a2e330779669a74a13953 100644 --- a/packages/uni-cli-shared/src/transforms/transformBuiltInEasycom.ts +++ b/packages/uni-cli-shared/src/transforms/transformBuiltInEasycom.ts @@ -1,5 +1,5 @@ import { NodeTransform } from '@vue/compiler-core' -import { isComponentNode } from './autoImport' +import { isComponentNode } from '../easycom/index' export const transformBuiltInEasycom: NodeTransform = node => { if (!isComponentNode(node)) { diff --git a/packages/uni-cli-shared/src/transforms/transformEasycom.ts b/packages/uni-cli-shared/src/transforms/transformEasycom.ts index 97a591593fba0c18ba2fa6e258ea93977f34818a..05e820512d99b463c587a6b84a7603c5b7022de0 100644 --- a/packages/uni-cli-shared/src/transforms/transformEasycom.ts +++ b/packages/uni-cli-shared/src/transforms/transformEasycom.ts @@ -10,9 +10,13 @@ import { import { COMPONENT_PREFIX } from '@dcloudio/uni-shared' -import { debugEasycom, matchEasycom } from '../easycom' - -import { addAutoImport, isComponentNode } from './autoImport' +import { + addEasycomTag, + debugEasycom, + matchEasycom, + addAutoImport, + isComponentNode +} from '../easycom' function createImportItem(path: string, node: ComponentNode) { const tag = node.tag @@ -60,5 +64,8 @@ export const transformEasycom: NodeTransform = (node, context) => { return debugEasycom(tag + ' is binding by setup') } const path = matchEasycom(tag) - path && addAutoImport(tag, createImportItem(path, node), context) + if (path) { + addEasycomTag(tag) + addAutoImport(createImportItem(path, node), context) + } } diff --git a/packages/uni-cli-shared/src/vueCompilerOptions.ts b/packages/uni-cli-shared/src/vueCompilerOptions.ts index 5a8e98efdcf19448689e0e54d9b05b63d54a7ab2..faf513ad341b63c1b8f73ad73d281d17e54d62a3 100644 --- a/packages/uni-cli-shared/src/vueCompilerOptions.ts +++ b/packages/uni-cli-shared/src/vueCompilerOptions.ts @@ -1,11 +1,15 @@ import { CompilerOptions } from '@vue/compiler-sfc' -import { isNativeTag } from '@dcloudio/uni-shared' +import { + COMPONENT_PREFIX, + isBuiltInComponent, + isNativeTag +} from '@dcloudio/uni-shared' -import { isAutoImported } from './transforms/autoImport' import { transformBuiltInComponent } from './transforms/transformBuiltInComponent' import { transformBuiltInEasycom } from './transforms/transformBuiltInEasycom' import { transformEasycom } from './transforms/transformEasycom' +import { isEasycomTag } from './easycom' interface CodegenContext { push: (code: string, node: any) => void @@ -15,6 +19,12 @@ interface VueCompilerOptions extends CompilerOptions { onContextCreated: (context: CodegenContext) => void } +function isAutoImported(tag: string) { + return ( + isEasycomTag(tag) || isBuiltInComponent(tag.replace(COMPONENT_PREFIX, '')) + ) +} + const resolveComponentRE = /_resolveComponent\("(.*)"\)/ export const vueCompilerOptions: VueCompilerOptions = { onContextCreated(context) { diff --git a/packages/vite-plugin-uni/package.json b/packages/vite-plugin-uni/package.json index 62536e6af3fc73e6c465fb10feb21c4d831caa3a..9c3e6db9c8b06f8d34d2e1b41548556c687bbe62 100644 --- a/packages/vite-plugin-uni/package.json +++ b/packages/vite-plugin-uni/package.json @@ -23,8 +23,7 @@ "dependencies": { "@rollup/pluginutils": "^4.1.0", "estree-walker": "^2.0.1", - "magic-string": "^0.25.7", - "slash": "^3.0.0" + "magic-string": "^0.25.7" }, "peerDependencies": { "@dcloudio/uni-cli-shared": "^3.0.0", diff --git a/packages/vite-plugin-uni/src/index.ts b/packages/vite-plugin-uni/src/index.ts index 9bf1a3a27237ba9a589d03fb86d268107c48701f..204579e735711e40d79884b509b5fc31c1d2c9c4 100644 --- a/packages/vite-plugin-uni/src/index.ts +++ b/packages/vite-plugin-uni/src/index.ts @@ -57,6 +57,14 @@ Object.assign(plugin, { '@dcloudio/uni-h5-vue', '@dcloudio/uni-shared' ] + }, + chokidarWatchOptions: { + ignored: [ + '**/node_modules/**', + '**/.git/**', + '**/uniCloud-aliyun/**', + '**/uniCloud-tcb/**' + ] } }) export default plugin diff --git a/packages/vite-plugin-uni/src/server/serverPluginEnv.ts b/packages/vite-plugin-uni/src/server/serverPluginEnv.ts index e6e5b8c281be7b4a3013b82dd71da23d882ae2ac..77fd79515e3fee4ded7ff5f93a370de1156aee7a 100644 --- a/packages/vite-plugin-uni/src/server/serverPluginEnv.ts +++ b/packages/vite-plugin-uni/src/server/serverPluginEnv.ts @@ -4,9 +4,19 @@ import { ServerPlugin } from 'vite' import { initEasycom } from '@dcloudio/uni-cli-shared' -export const serverPluginEnv: ServerPlugin = ({ root }) => { - if (process.env.UNI_INPUT_DIR) { - process.env.UNI_INPUT_DIR = path.resolve(root, 'src') - } - initEasycom({ dirs: ['components'], rootDir: path.resolve(root, 'src') }) +export const serverPluginEnv: ServerPlugin = ({ root, watcher }) => { + const rootDir = path.resolve(root, 'src') + const dirs = ['components'].map(dir => path.resolve(rootDir, dir)) + const easycomOptions = { dirs, rootDir: rootDir } + + initEasycom(easycomOptions) + + watcher.on('all', (eventName, path) => { + if (!['add', 'unlink'].includes(eventName)) { + return + } + if (dirs.find(dir => path.startsWith(dir))) { + initEasycom(easycomOptions) + } + }) }