Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MuGuiLin
uni-app
提交
d01d365f
U
uni-app
项目概览
MuGuiLin
/
uni-app
与 Fork 源项目一致
Fork自
DCloud / uni-app
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-app
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d01d365f
编写于
1月 19, 2022
作者:
fxy060608
浏览文件
操作
浏览文件
下载
差异文件
chore: merge
上级
384f3c05
f3b62a6b
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
165 addition
and
9 deletion
+165
-9
packages/uni-cli-shared/src/vite/utils/url.ts
packages/uni-cli-shared/src/vite/utils/url.ts
+22
-1
packages/uni-components/lib/page-meta/page-meta.vue
packages/uni-components/lib/page-meta/page-meta.vue
+2
-0
packages/uni-h5-vite/src/plugin/configureServer/static.ts
packages/uni-h5-vite/src/plugin/configureServer/static.ts
+20
-7
packages/uni-mp-compiler/__tests__/wxs.spec.ts
packages/uni-mp-compiler/__tests__/wxs.spec.ts
+46
-0
packages/uni-mp-compiler/src/transform.ts
packages/uni-mp-compiler/src/transform.ts
+75
-1
未找到文件。
packages/uni-cli-shared/src/vite/utils/url.ts
浏览文件 @
d01d365f
...
...
@@ -32,9 +32,30 @@ export function parseVueRequest(id: string) {
}
}
const
importQueryRE
=
/
(\?
|&
)
import
(?:
&|$
)
/
const
importQueryRE
=
/
(\?
|&
)
import
=
?
(?:
&|$
)
/
export
const
isImportRequest
=
(
url
:
string
)
=>
importQueryRE
.
test
(
url
)
/**
* Prefix for resolved fs paths, since windows paths may not be valid as URLs.
*/
export
const
FS_PREFIX
=
`/@fs/`
/**
* Prefix for resolved Ids that are not valid browser import specifiers
*/
export
const
VALID_ID_PREFIX
=
`/@id/`
export
const
CLIENT_PUBLIC_PATH
=
`/@vite/client`
export
const
ENV_PUBLIC_PATH
=
`/@vite/env`
const
internalPrefixes
=
[
FS_PREFIX
,
VALID_ID_PREFIX
,
CLIENT_PUBLIC_PATH
,
ENV_PUBLIC_PATH
,
]
const
InternalPrefixRE
=
new
RegExp
(
`^(?:
${
internalPrefixes
.
join
(
'
|
'
)}
)`
)
export
const
isInternalRequest
=
(
url
:
string
):
boolean
=>
InternalPrefixRE
.
test
(
url
)
export
const
queryRE
=
/
\?
.*$/
export
const
hashRE
=
/#.*$/
...
...
packages/uni-components/lib/page-meta/page-meta.vue
浏览文件 @
d01d365f
...
...
@@ -5,7 +5,9 @@
</
template
>
<
script
>
import
{
onMounted
}
from
'
vue
'
// #ifndef H5
import
{
onResize
}
from
'
@dcloudio/uni-app
'
// #endif
// #ifdef H5
import
{
onWindowResize
}
from
'
@dcloudio/uni-h5
'
// #endif
...
...
packages/uni-h5-vite/src/plugin/configureServer/static.ts
浏览文件 @
d01d365f
import
fs
from
'
fs
'
import
path
from
'
path
'
import
debug
from
'
debug
'
import
type
{
ViteDevServer
}
from
'
vite
'
import
type
{
Connect
,
ViteDevServer
}
from
'
vite
'
import
{
createFilter
}
from
'
@rollup/pluginutils
'
import
{
isImportRequest
,
isInternalRequest
,
normalizePath
,
PUBLIC_DIR
,
}
from
'
@dcloudio/uni-cli-shared
'
...
...
@@ -34,13 +35,25 @@ export const initStatic = (server: ViteDevServer) => {
}
},
})
server
.
middlewares
.
use
((
req
,
res
,
next
)
=>
{
// skip import request
if
(
isImportRequest
(
req
.
url
!
))
{
return
next
()
const
viteServePublicMiddlewareIndex
=
server
.
middlewares
.
stack
.
findIndex
(
(
middleware
)
=>
{
return
(
(
middleware
.
handle
as
Function
).
name
===
'
viteServePublicMiddleware
'
)
}
return
serve
(
req
,
res
,
next
)
})
)
// 替换 vite 自带的 public middleware
if
(
viteServePublicMiddlewareIndex
>
-
1
)
{
server
.
middlewares
.
stack
.
splice
(
viteServePublicMiddlewareIndex
,
1
,
{
route
:
''
,
handle
:
((
req
,
res
,
next
)
=>
{
if
(
isImportRequest
(
req
.
url
!
)
||
isInternalRequest
(
req
.
url
!
))
{
return
next
()
}
return
serve
(
req
,
res
,
next
)
})
as
Connect
.
NextHandleFunction
,
})
}
}
export
function
createPublicFileFilter
(
base
:
string
=
'
/
'
)
{
...
...
packages/uni-mp-compiler/__tests__/wxs.spec.ts
浏览文件 @
d01d365f
...
...
@@ -27,4 +27,50 @@ describe('compiler: transform wxs', () => {
}
)
})
test
(
'
v-if
'
,
()
=>
{
assert
(
`<view v-if="test.aa()">123</view>`
,
`<view wx:if="{{test.aa()}}">123</view>`
,
`(_ctx, _cache) => {
return {}
}`
,
{
filters
:
[
'
test
'
],
}
)
assert
(
`<view v-if="test.aa()">{{msg}}</view>`
,
`<view wx:if="{{test.aa()}}">{{a}}</view>`
,
`(_ctx, _cache) => {
return { ...{ a: _t(_ctx.msg) } }
}`
,
{
filters
:
[
'
test
'
],
}
)
})
test
(
'
v-if + v-else
'
,
()
=>
{
assert
(
`<view v-if="test.aa()">{{foo}}</view><view v-else>{{bar}}</view>`
,
`<view wx:if="{{test.aa()}}">{{a}}</view><view wx:else>{{b}}</view>`
,
`(_ctx, _cache) => {
return { ...{ a: _t(_ctx.foo) }, ...{ b: _t(_ctx.bar) } }
}`
,
{
filters
:
[
'
test
'
],
}
)
})
test
(
'
v-if + v-else-if + v-else
'
,
()
=>
{
assert
(
`<view v-if="test.aa()">{{foo}}</view><view v-else-if="test.bb()">{{foo}}</view><view v-else>{{bar}}</view>`
,
`<view wx:if="{{test.aa()}}">{{a}}</view><view wx:elif="{{test.bb()}}">{{b}}</view><view wx:else>{{c}}</view>`
,
`(_ctx, _cache) => {
return { ...{ a: _t(_ctx.foo) }, ...{ ...{ b: _t(_ctx.foo) }, ...{ c: _t(_ctx.bar) } } }
}`
,
{
filters
:
[
'
test
'
],
}
)
})
})
packages/uni-mp-compiler/src/transform.ts
浏览文件 @
d01d365f
...
...
@@ -18,6 +18,7 @@ import {
isIdentifier
,
isSpreadElement
,
Identifier
,
spreadElement
,
}
from
'
@babel/types
'
import
{
DirectiveNode
,
...
...
@@ -50,6 +51,7 @@ import {
import
{
EXTEND
}
from
'
./runtimeHelpers
'
import
{
createObjectExpression
}
from
'
./ast
'
import
{
SCOPED_SLOT_IDENTIFIER
}
from
'
./transforms/utils
'
import
{
genBabelExpr
}
from
'
./codegen
'
export
interface
ImportItem
{
exp
:
string
|
ExpressionNode
...
...
@@ -550,7 +552,15 @@ function createRenderDataExpr(
context
:
TransformContext
)
{
const
objExpr
=
createObjectExpression
(
properties
)
if
(
context
.
renderDataSpread
||
!
hasSpreadElement
(
objExpr
))
{
if
(
!
hasSpreadElement
(
objExpr
))
{
return
objExpr
}
// filters: ['test']
// v-if="text.aa()"
if
(
context
.
filters
.
length
)
{
transformFilterObjectSpreadExpr
(
objExpr
,
context
)
}
if
(
context
.
renderDataSpread
)
{
return
objExpr
}
return
transformObjectSpreadExpr
(
objExpr
,
context
)
...
...
@@ -657,3 +667,67 @@ function transformConditionalExpression(
}
return
expr
}
function
transformFilterObjectSpreadExpr
(
objExpr
:
ObjectExpression
,
context
:
TransformContext
)
{
const
properties
=
objExpr
.
properties
as
(
ObjectProperty
|
SpreadElement
)[]
properties
.
forEach
((
prop
)
=>
{
if
(
isObjectProperty
(
prop
))
{
transformFilterObjectPropertyExpr
(
prop
,
context
)
}
else
{
prop
.
argument
=
transformFilterConditionalExpression
(
prop
.
argument
as
ConditionalExpression
,
context
)
}
})
}
function
transformFilterObjectPropertyExpr
(
prop
:
ObjectProperty
,
context
:
TransformContext
)
{
// vFor, withScopedSlot
const
returnStatement
=
parseReturnStatement
(
prop
)
if
(
returnStatement
)
{
const
objExpr
=
returnStatement
.
argument
as
ObjectExpression
if
(
hasSpreadElement
(
objExpr
))
{
transformFilterObjectSpreadExpr
(
objExpr
,
context
)
}
}
}
function
transformFilterConditionalExpression
(
expr
:
ConditionalExpression
,
context
:
TransformContext
)
{
const
{
test
,
consequent
,
alternate
}
=
expr
if
(
isObjectExpression
(
consequent
)
&&
hasSpreadElement
(
consequent
))
{
transformFilterObjectSpreadExpr
(
consequent
,
context
)
}
if
(
isObjectExpression
(
alternate
))
{
if
(
hasSpreadElement
(
alternate
))
{
transformFilterObjectSpreadExpr
(
alternate
,
context
)
}
}
else
if
(
isConditionalExpression
(
alternate
))
{
expr
.
alternate
=
transformFilterConditionalExpression
(
alternate
,
context
)
}
const
testCode
=
genBabelExpr
(
test
)
// filter test
if
(
context
.
filters
.
find
((
filter
)
=>
testCode
.
includes
(
filter
+
'
.
'
)))
{
// test.aa() ? {a:1} : {b:2} => {...{a:1},...{b:2}}
const
properties
:
SpreadElement
[]
=
[]
if
(
!
isObjectExpression
(
consequent
)
||
consequent
.
properties
.
length
)
{
properties
.
push
(
spreadElement
(
consequent
))
}
if
(
!
isObjectExpression
(
expr
.
alternate
)
||
expr
.
alternate
.
properties
.
length
)
{
properties
.
push
(
spreadElement
(
expr
.
alternate
))
}
return
objectExpression
(
properties
)
}
return
expr
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录