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

feat(easycom): add watch

上级 aae1338f
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<string>()
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
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<string>()
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,
......
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'
......@@ -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)
}
}
import { NodeTransform } from '@vue/compiler-core'
import { isComponentNode } from './autoImport'
import { isComponentNode } from '../easycom/index'
export const transformBuiltInEasycom: NodeTransform = node => {
if (!isComponentNode(node)) {
......
......@@ -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)
}
}
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) {
......
......@@ -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",
......
......@@ -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
......@@ -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)
}
})
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册