Skip to content

Commit

Permalink
feat(experimental): shouldTransform for ref-transform
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed Aug 23, 2021
1 parent 0c2ea1c commit e565831
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 20 deletions.
21 changes: 3 additions & 18 deletions packages/compiler-core/src/babelUtils.ts
Expand Up @@ -142,24 +142,9 @@ export function walkFunctionParams(
onIdent: (id: Identifier) => void
) {
for (const p of node.params) {
;(walk as any)(p, {
enter(child: Node, parent: Node) {
if (
child.type === 'Identifier' &&
// do not record as scope variable if is a destructured key
!isStaticPropertyKey(child, parent) &&
// do not record if this is a default value
// assignment of a destructured variable
!(
parent &&
parent.type === 'AssignmentPattern' &&
parent.right === child
)
) {
onIdent(child)
}
}
})
for (const id of extractIdentifiers(p)) {
onIdent(id)
}
}
}

Expand Down
7 changes: 5 additions & 2 deletions packages/compiler-sfc/src/compileScript.ts
Expand Up @@ -51,7 +51,10 @@ import { compileTemplate, SFCTemplateCompileOptions } from './compileTemplate'
import { warnExperimental, warnOnce } from './warn'
import { rewriteDefault } from './rewriteDefault'
import { createCache } from './cache'
import { transformAST as transformWithRefSugar } from '@vue/ref-transform'
import {
shouldTransform,
transformAST as transformWithRefSugar
} from '@vue/ref-transform'

// Special compiler macros
const DEFINE_PROPS = 'defineProps'
Expand Down Expand Up @@ -855,7 +858,7 @@ export function compileScript(
}

// 3. Apply ref sugar transform
if (enableRefSugar) {
if (enableRefSugar && shouldTransform(source)) {
warnExperimental(
`ref sugar`,
`https://github.com/vuejs/rfcs/discussions/369`
Expand Down
13 changes: 13 additions & 0 deletions packages/ref-transform/README.md
Expand Up @@ -37,6 +37,17 @@ A few commonly used APIs have shorthands (which also removes the need to import

This package is the lower-level transform that can be used standalone. Higher-level tooling (e.g. `@vitejs/plugin-vue` and `vue-loader`) will provide integration via options.

### `shouldTransform`

Can be used to do a cheap check to determine whether full transform should be performed.

```js
import { shouldTransform } from '@vue/ref-transform'

shouldTransform(`let a = ref(0)`) // false
shouldTransform(`let a = $ref(0)`) // true
```

### `transform`

```js
Expand Down Expand Up @@ -66,6 +77,8 @@ interface RefTransformOptions {

### `transformAST`

Transform with an existing Babel AST + MagicString instance. This is used internally by `@vue/compiler-sfc` to avoid double parse/transform cost.

```js
import { transformAST } from '@vue/ref-transform'
import { parse } from '@babel/parser'
Expand Down
5 changes: 5 additions & 0 deletions packages/ref-transform/src/index.ts
Expand Up @@ -24,6 +24,11 @@ import { babelParserDefaultPlugins } from '@vue/shared'
const TO_VAR_SYMBOL = '$'
const TO_REF_SYMBOL = '$$'
const shorthands = ['ref', 'computed', 'shallowRef']
const transformCheckRE = /[^\w]\$(?:\$|ref|computed|shallowRef)?\(/

export function shouldTransform(src: string): boolean {
return transformCheckRE.test(src)
}

export interface ReactiveDeclarator {
node: VariableDeclarator
Expand Down

0 comments on commit e565831

Please sign in to comment.