Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
uni-app
提交
a562d744
U
uni-app
项目概览
DCloud
/
uni-app
3 个月 前同步成功
通知
718
Star
38705
Fork
3642
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
7
列表
看板
标记
里程碑
合并请求
1
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-app
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
7
Issue
7
列表
看板
标记
里程碑
合并请求
1
合并请求
1
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a562d744
编写于
11月 08, 2022
作者:
Q
qiang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(mp): webpack5 asset API
上级
947050b6
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
313 addition
and
326 deletion
+313
-326
packages/webpack-uni-mp-loader/lib/plugin/add-empty-component.js
...s/webpack-uni-mp-loader/lib/plugin/add-empty-component.js
+38
-0
packages/webpack-uni-mp-loader/lib/plugin/add-plugin-wrapper.js
...es/webpack-uni-mp-loader/lib/plugin/add-plugin-wrapper.js
+38
-0
packages/webpack-uni-mp-loader/lib/plugin/clear-style-file.js
...ages/webpack-uni-mp-loader/lib/plugin/clear-style-file.js
+33
-0
packages/webpack-uni-mp-loader/lib/plugin/generate-app.js
packages/webpack-uni-mp-loader/lib/plugin/generate-app.js
+13
-28
packages/webpack-uni-mp-loader/lib/plugin/generate-component.js
...es/webpack-uni-mp-loader/lib/plugin/generate-component.js
+22
-201
packages/webpack-uni-mp-loader/lib/plugin/generate-json.js
packages/webpack-uni-mp-loader/lib/plugin/generate-json.js
+9
-31
packages/webpack-uni-mp-loader/lib/plugin/index-new.js
packages/webpack-uni-mp-loader/lib/plugin/index-new.js
+47
-52
packages/webpack-uni-mp-loader/lib/plugin/mock-generic-component.js
...ebpack-uni-mp-loader/lib/plugin/mock-generic-component.js
+61
-0
packages/webpack-uni-mp-loader/lib/script-new.js
packages/webpack-uni-mp-loader/lib/script-new.js
+14
-8
packages/webpack-uni-mp-loader/lib/shared.js
packages/webpack-uni-mp-loader/lib/shared.js
+38
-6
未找到文件。
packages/webpack-uni-mp-loader/lib/plugin/add-empty-component.js
0 → 100644
浏览文件 @
a562d744
const
{
createSource
}
=
require
(
'
../shared
'
)
module
.
exports
=
function
(
compilation
)
{
if
(
process
.
env
.
UNI_PLATFORM
!==
'
mp-qq
'
)
{
return
}
// fix mp-qq https://github.com/dcloudio/uni-app/issues/2648
const
appJsonName
=
'
app.json
'
const
appJsonFile
=
compilation
.
getAsset
(
appJsonName
)
if
(
appJsonFile
)
{
const
componentName
=
'
fix-2648
'
const
obj
=
JSON
.
parse
(
appJsonFile
.
source
.
source
())
obj
.
usingComponents
=
obj
.
usingComponents
||
{}
if
(
!
(
componentName
in
obj
.
usingComponents
))
{
obj
.
usingComponents
[
componentName
]
=
`/
${
componentName
}
`
const
source
=
JSON
.
stringify
(
obj
,
null
,
2
)
const
newSource
=
createSource
(
source
)
compilation
.
updateAsset
(
appJsonName
,
newSource
)
const
files
=
[
{
ext
:
'
qml
'
,
source
:
'
<!-- https://github.com/dcloudio/uni-app/issues/2648 -->
'
},
{
ext
:
'
js
'
,
source
:
'
Component({})
'
},
{
ext
:
'
json
'
,
source
:
'
{"component":true}
'
}
]
files
.
forEach
(({
ext
,
source
})
=>
{
compilation
.
emitAsset
(
`
${
componentName
}
.
${
ext
}
`
,
createSource
(
source
))
})
}
}
}
packages/webpack-uni-mp-loader/lib/plugin/add-plugin-wrapper.js
0 → 100644
浏览文件 @
a562d744
const
{
createSource
}
=
require
(
'
../shared
'
)
module
.
exports
=
function
(
compilation
)
{
if
(
process
.
env
.
UNI_PLATFORM
!==
'
mp-alipay
'
)
{
return
}
// fix mp-alipay plugin
const
appJsonName
=
'
app.json
'
const
appJsonFile
=
compilation
.
getAsset
(
appJsonName
)
if
(
appJsonFile
)
{
const
componentName
=
'
plugin-wrapper
'
const
obj
=
JSON
.
parse
(
appJsonFile
.
source
.
source
())
obj
.
usingComponents
=
obj
.
usingComponents
||
{}
if
(
!
(
componentName
in
obj
.
usingComponents
))
{
obj
.
usingComponents
[
componentName
]
=
`/
${
componentName
}
`
const
source
=
JSON
.
stringify
(
obj
,
null
,
2
)
const
newSource
=
createSource
(
source
)
compilation
.
updateAsset
(
appJsonName
,
newSource
)
const
files
=
[
{
ext
:
'
axml
'
,
source
:
'
<slot></slot>
'
},
{
ext
:
'
js
'
,
source
:
'
Component({onInit(){this.props.onPluginWrap(this)},didUnmount(){this.props.onPluginWrap(this,true)}})
'
},
{
ext
:
'
json
'
,
source
:
'
{"component":true}
'
}
]
files
.
forEach
(({
ext
,
source
})
=>
{
compilation
.
emitAsset
(
`
${
componentName
}
.
${
ext
}
`
,
createSource
(
source
))
})
}
}
}
packages/webpack-uni-mp-loader/lib/plugin/clear-style-file.js
0 → 100644
浏览文件 @
a562d744
const
path
=
require
(
'
path
'
)
const
{
normalizePath
,
getPlatformExts
}
=
require
(
'
@dcloudio/uni-cli-shared
'
)
const
{
deleteAsset
}
=
require
(
'
../shared
'
)
module
.
exports
=
function
(
compilation
)
{
// 移除部分含有错误引用的 wxss 文件
const
styleImports
=
{}
compilation
.
getAssets
().
forEach
((
asset
)
=>
{
const
name
=
asset
.
name
const
styleExtname
=
getPlatformExts
().
style
if
(
name
.
endsWith
(
styleExtname
))
{
let
origSource
=
asset
.
source
.
source
()
origSource
=
origSource
.
trim
?
origSource
.
trim
()
:
''
const
result
=
origSource
.
match
(
/^@import
[
"'
](
.+
?)[
"'
]
$/
)
if
(
result
)
{
const
stylePath
=
normalizePath
(
path
.
join
(
path
.
dirname
(
name
),
result
[
1
]))
if
(
compilation
.
getAsset
(
stylePath
))
{
styleImports
[
stylePath
]
=
styleImports
[
stylePath
]
||
[]
styleImports
[
stylePath
].
push
(
name
)
}
else
{
if
(
styleImports
[
name
])
{
styleImports
[
name
].
forEach
(
name
=>
deleteAsset
(
compilation
,
name
))
delete
styleImports
[
name
]
}
deleteAsset
(
compilation
,
name
)
}
}
}
})
}
packages/webpack-uni-mp-loader/lib/plugin/generate-app.js
浏览文件 @
a562d744
const
{
getPlatformExts
getPlatformExts
,
createSource
}
=
require
(
'
../shared
'
)
const
{
...
...
@@ -22,26 +23,12 @@ module.exports = function generateApp (compilation) {
process
.
env
.
UNI_PLATFORM
!==
'
app-plus
'
)
{
const
targetCssName
=
`common/main
${
ext
}
`
if
(
!
compilation
.
assets
[
targetCssName
])
{
compilation
.
assets
[
targetCssName
]
=
{
size
()
{
return
Buffer
.
byteLength
(
getShadowCss
(),
'
utf8
'
)
},
source
()
{
return
getShadowCss
()
}
}
const
asset
=
compilation
.
getAsset
(
targetCssName
)
if
(
!
asset
)
{
compilation
.
emitAsset
(
targetCssName
,
createSource
(
getShadowCss
()))
}
else
{
const
source
=
compilation
.
assets
[
targetCssName
].
source
()
+
getShadowCss
()
compilation
.
assets
[
targetCssName
]
=
{
size
()
{
return
Buffer
.
byteLength
(
source
,
'
utf8
'
)
},
source
()
{
return
source
}
}
const
source
=
asset
.
source
.
source
()
+
getShadowCss
()
compilation
.
updateAsset
(
targetCssName
,
createSource
(
source
))
}
}
...
...
@@ -50,17 +37,17 @@ module.exports = function generateApp (compilation) {
const
platforms
=
[
'
mp-weixin
'
,
'
mp-qq
'
,
'
mp-jd
'
,
'
mp-xhs
'
,
'
mp-toutiao
'
,
'
mp-lark
'
]
const
presetStyle
=
platforms
.
includes
(
process
.
env
.
UNI_PLATFORM
)
?
'
[data-custom-hidden="true"],[bind-data-custom-hidden="true"]{display: none !important;}
'
:
''
if
(
compilation
.
assets
[
`common/main
${
ext
}
`
]
)
{
// 是否存在 main.css
if
(
compilation
.
getAsset
(
`common/main
${
ext
}
`
)
)
{
// 是否存在 main.css
importMainCss
=
`@import './common/main
${
ext
}
';`
}
if
(
compilation
.
assets
[
`common/vendor
${
ext
}
`
]
)
{
// 是否存在 vendor.css
if
(
compilation
.
getAsset
(
`common/vendor
${
ext
}
`
)
)
{
// 是否存在 vendor.css
importVendorCss
+=
`@import './common/vendor
${
ext
}
';`
}
const
runtimeJsPath
=
'
common/runtime.js
'
const
asset
=
compilation
.
assets
[
runtimeJsPath
]
const
asset
=
compilation
.
getAsset
(
runtimeJsPath
)
if
(
// app 和 baidu 不需要
process
.
env
.
UNI_PLATFORM
!==
'
app-plus
'
&&
process
.
env
.
UNI_PLATFORM
!==
'
mp-baidu
'
&&
...
...
@@ -70,13 +57,11 @@ module.exports = function generateApp (compilation) {
const
source
=
`
!function(){try{var a=Function("return this")();a&&!a.Math&&(Object.assign(a,{isFinite:isFinite,Array:Array,Date:Date,Error:Error,Function:Function,Math:Math,Object:Object,RegExp:RegExp,String:String,TypeError:TypeError,setTimeout:setTimeout,clearTimeout:clearTimeout,setInterval:setInterval,clearInterval:clearInterval}),"undefined"!=typeof Reflect&&(a.Reflect=Reflect))}catch(a){}}();
${
asset
.
source
()}
${
asset
.
source
.
source
()}
`
const
newSource
=
function
()
{
return
source
}
const
newSource
=
createSource
(
source
)
newSource
.
__$wrappered
=
true
compilation
.
assets
[
runtimeJsPath
].
source
=
newSource
compilation
.
updateAsset
(
runtimeJsPath
,
newSource
)
}
const
specialMethods
=
getSpecialMethods
()
...
...
packages/webpack-uni-mp-loader/lib/plugin/generate-component.js
浏览文件 @
a562d744
...
...
@@ -3,8 +3,7 @@ const path = require('path')
const
webpack
=
require
(
'
webpack
'
)
const
{
removeExt
,
normalizePath
,
getPlatformExts
normalizePath
}
=
require
(
'
@dcloudio/uni-cli-shared
'
)
const
{
getComponentSet
...
...
@@ -15,7 +14,9 @@ const {
}
=
require
(
'
@dcloudio/uni-cli-shared/lib/pages
'
)
const
{
restoreNodeModules
restoreNodeModules
,
createSource
,
getModuleId
}
=
require
(
'
../shared
'
)
const
EMPTY_COMPONENT_LEN
=
'
Component({})
'
.
length
...
...
@@ -41,21 +42,21 @@ function findModule (modules, resource, altResource) {
)
}
function
findModuleId
(
modules
,
resource
,
altResource
)
{
function
findModuleId
(
compilation
,
modules
,
resource
,
altResource
)
{
const
module
=
findModule
(
modules
,
resource
,
altResource
)
return
module
&&
module
.
id
return
module
&&
getModuleId
(
compilation
,
module
)
}
function
findModuleIdFromConcatenatedModules
(
modules
,
resource
,
altResource
)
{
function
findModuleIdFromConcatenatedModules
(
compilation
,
modules
,
resource
,
altResource
)
{
const
module
=
modules
.
find
(
module
=>
{
return
findModule
(
module
.
modules
,
resource
,
altResource
)
})
return
module
&&
module
.
id
return
module
&&
getModuleId
(
compilation
,
module
)
}
function
findComponentModuleId
(
modules
,
concatenatedModules
,
resource
,
altResource
)
{
return
findModuleId
(
modules
,
resource
,
altResource
)
||
findModuleIdFromConcatenatedModules
(
concatenatedModules
,
resource
,
altResource
)
||
function
findComponentModuleId
(
compilation
,
modules
,
concatenatedModules
,
resource
,
altResource
)
{
return
findModuleId
(
compilation
,
modules
,
resource
,
altResource
)
||
findModuleIdFromConcatenatedModules
(
co
mpilation
,
co
ncatenatedModules
,
resource
,
altResource
)
||
resource
}
...
...
@@ -66,20 +67,18 @@ module.exports = function generateComponent (compilation, jsonpFunction = 'webpa
const
componentChunkNameMap
=
{}
const
components
=
getComponentSet
()
if
(
components
.
size
)
{
const
assets
=
compilation
.
assets
const
modules
=
compilation
.
modules
const
modules
=
Array
.
from
(
compilation
.
modules
)
const
concatenatedModules
=
modules
.
filter
(
module
=>
module
.
modules
)
let
uniModule
=
modules
.
find
(
module
=>
module
.
resource
&&
normalizePath
(
module
.
resource
)
===
uniPath
)
if
(
!
uniModule
&&
webpack
.
version
[
0
]
>
4
)
{
uniModule
=
modules
.
find
(
module
=>
module
.
rootModule
&&
module
.
rootModule
.
resource
&&
normalizePath
(
module
.
rootModule
.
resource
)
===
uniPath
)
}
const
uniModuleId
=
uniModule
.
id
const
styleImports
=
{}
const
fixSlots
=
{}
const
uniModuleId
=
getModuleId
(
compilation
,
uniModule
)
const
vueOuterComponentSting
=
'
vueOuterComponents
'
Object
.
keys
(
assets
).
forEach
(
name
=>
{
compilation
.
getAssets
().
forEach
(
asset
=>
{
const
name
=
asset
.
name
// 判断是不是vue
const
isVueComponent
=
components
.
has
(
name
.
replace
(
'
.js
'
,
''
))
// 独立分包外面的组件,复制到独立分包内,在components中看不到,所以需要单独处理
...
...
@@ -87,7 +86,7 @@ module.exports = function generateComponent (compilation, jsonpFunction = 'webpa
if
(
isVueComponent
||
isVueOuterComponent
)
{
curComponents
.
push
(
name
.
replace
(
'
.js
'
,
''
))
if
(
asset
s
[
name
]
.
source
.
__$wrappered
)
{
if
(
asset
.
source
.
__$wrappered
)
{
return
}
...
...
@@ -103,13 +102,13 @@ module.exports = function generateComponent (compilation, jsonpFunction = 'webpa
resource
=
normalizePath
(
path
.
resolve
(
process
.
env
.
UNI_CLI_CONTEXT
,
modulePath
))
}
moduleId
=
findComponentModuleId
(
modules
,
concatenatedModules
,
resource
,
altResource
)
moduleId
=
findComponentModuleId
(
compilation
,
modules
,
concatenatedModules
,
resource
,
altResource
)
}
else
{
const
resource
=
removeExt
(
path
.
resolve
(
process
.
env
.
UNI_INPUT_DIR
,
name
))
moduleId
=
findComponentModuleId
(
modules
,
concatenatedModules
,
resource
)
moduleId
=
findComponentModuleId
(
compilation
,
modules
,
concatenatedModules
,
resource
)
}
const
origSource
=
asset
s
[
name
]
.
source
()
const
origSource
=
asset
.
source
.
source
()
if
(
isVueComponent
)
{
componentChunkNameMap
[
name
]
=
moduleId
...
...
@@ -148,191 +147,13 @@ module.exports = function generateComponent (compilation, jsonpFunction = 'webpa
]);
`
)
if
(
webpack
.
version
[
0
]
>
4
)
{
const
{
RawSource
}
=
webpack
.
sources
const
newSource
=
new
RawSource
(
source
)
compilation
.
updateAsset
(
name
,
newSource
)
}
else
{
const
newSource
=
function
()
{
return
source
}
newSource
.
__$wrappered
=
true
assets
[
name
].
source
=
newSource
}
}
}
const
styleExtname
=
getPlatformExts
().
style
if
(
name
.
endsWith
(
styleExtname
))
{
// 移除部分含有错误引用的 wxss 文件
let
origSource
=
assets
[
name
].
source
()
origSource
=
origSource
.
trim
?
origSource
.
trim
()
:
''
const
result
=
origSource
.
match
(
/^@import
[
"'
](
.+
?)[
"'
]
$/
)
if
(
result
)
{
const
stylePath
=
normalizePath
(
path
.
join
(
path
.
dirname
(
name
),
result
[
1
]))
if
(
Object
.
keys
(
assets
).
includes
(
stylePath
))
{
styleImports
[
stylePath
]
=
styleImports
[
stylePath
]
||
[]
styleImports
[
stylePath
].
push
(
name
)
}
else
{
if
(
styleImports
[
name
])
{
styleImports
[
name
].
forEach
(
name
=>
delete
assets
[
name
])
delete
styleImports
[
name
]
}
delete
assets
[
name
]
}
}
}
// 处理字节跳动|飞书小程序作用域插槽
const
fixExtname
=
'
.fix
'
if
(
name
.
endsWith
(
fixExtname
))
{
const
source
=
assets
[
name
].
source
()
const
[
ownerName
,
parentName
,
componentName
,
slotName
]
=
source
.
split
(
'
,
'
)
const
json
=
assets
[
ownerName
+
'
.json
'
]
const
jsonSource
=
json
&&
json
.
source
()
if
(
jsonSource
)
{
const
data
=
JSON
.
parse
(
jsonSource
)
const
usingComponents
=
data
.
usingComponents
||
{}
const
componentPath
=
normalizePath
(
path
.
relative
(
'
/
'
,
usingComponents
[
parentName
]))
const
slots
=
fixSlots
[
componentPath
]
=
fixSlots
[
componentPath
]
||
{}
const
slot
=
slots
[
slotName
]
=
slots
[
slotName
]
||
{}
slot
[
componentName
]
=
'
/
'
+
name
.
replace
(
fixExtname
,
''
)
delete
assets
[
name
]
const
jsonFile
=
assets
[
`
${
componentPath
}
.json`
]
if
(
jsonFile
)
{
const
oldSource
=
jsonFile
.
__$oldSource
||
jsonFile
.
source
()
const
sourceObj
=
JSON
.
parse
(
oldSource
)
Object
.
values
(
slots
).
forEach
(
components
=>
{
const
usingComponents
=
sourceObj
.
usingComponents
=
sourceObj
.
usingComponents
||
{}
Object
.
assign
(
usingComponents
,
components
)
})
delete
sourceObj
.
componentGenerics
const
source
=
JSON
.
stringify
(
sourceObj
,
null
,
2
)
if
(
webpack
.
version
[
0
]
>
4
)
{
const
{
RawSource
}
=
webpack
.
sources
const
newSource
=
new
RawSource
(
source
)
compilation
.
updateAsset
(
name
,
newSource
)
}
else
{
jsonFile
.
source
=
function
()
{
return
source
}
}
jsonFile
.
__$oldSource
=
oldSource
}
const
templateFile
=
assets
[
`
${
componentPath
}${
getPlatformExts
().
template
}
`
]
if
(
templateFile
)
{
const
oldSource
=
templateFile
.
__$oldSource
||
templateFile
.
source
()
let
templateSource
Object
.
keys
(
slots
).
forEach
(
name
=>
{
const
reg
=
new
RegExp
(
`<
${
name
}
(.+?)></
${
name
}
>`
)
templateSource
=
oldSource
.
replace
(
reg
,
string
=>
{
const
props
=
string
.
match
(
reg
)[
1
]
return
Object
.
keys
(
slots
[
name
]).
map
(
key
=>
{
return
`<block tt:if="{{generic['
${
name
.
replace
(
/^scoped-slots-/
,
''
)}
']==='
${
key
}
'}}"><
${
key
}
${
props
}
></
${
key
}
></block>`
}).
join
(
''
)
})
})
if
(
webpack
.
version
[
0
]
>
4
)
{
const
{
RawSource
}
=
webpack
.
sources
const
newSource
=
new
RawSource
(
templateSource
)
compilation
.
updateAsset
(
name
,
newSource
)
}
else
{
templateFile
.
source
=
function
()
{
return
templateSource
}
}
templateFile
.
__$oldSource
=
oldSource
}
const
newSource
=
createSource
(
source
)
newSource
.
__$wrappered
=
true
compilation
.
updateAsset
(
name
,
newSource
)
}
}
})
}
// fix mp-qq https://github.com/dcloudio/uni-app/issues/2648
const
appJsonName
=
'
app.json
'
const
appJsonFile
=
compilation
.
assets
[
appJsonName
]
if
(
process
.
env
.
UNI_PLATFORM
===
'
mp-qq
'
&&
appJsonFile
)
{
const
obj
=
JSON
.
parse
(
appJsonFile
.
source
())
if
(
obj
&&
obj
.
usingComponents
&&
!
Object
.
keys
(
obj
.
usingComponents
).
length
)
{
const
componentName
=
'
fix-2648
'
obj
.
usingComponents
[
componentName
]
=
`/
${
componentName
}
`
const
source
=
JSON
.
stringify
(
obj
,
null
,
2
)
if
(
webpack
.
version
[
0
]
>
4
)
{
const
{
RawSource
}
=
webpack
.
sources
const
newSource
=
new
RawSource
(
source
)
compilation
.
updateAsset
(
appJsonName
,
newSource
)
}
else
{
appJsonFile
.
source
=
function
()
{
return
source
}
}
const
files
=
[
{
ext
:
'
qml
'
,
source
:
'
<!-- https://github.com/dcloudio/uni-app/issues/2648 -->
'
},
{
ext
:
'
js
'
,
source
:
'
Component({})
'
},
{
ext
:
'
json
'
,
source
:
'
{"component":true}
'
}
]
files
.
forEach
(({
ext
,
source
})
=>
{
compilation
.
assets
[
`
${
componentName
}
.
${
ext
}
`
]
=
{
size
()
{
return
Buffer
.
byteLength
(
source
,
'
utf8
'
)
},
source
()
{
return
source
}
}
})
}
}
// fix mp-alipay plugin
if
(
process
.
env
.
UNI_PLATFORM
===
'
mp-alipay
'
&&
appJsonFile
)
{
const
obj
=
JSON
.
parse
(
appJsonFile
.
source
())
const
componentName
=
'
plugin-wrapper
'
if
(
obj
&&
obj
.
usingComponents
&&
!
(
componentName
in
obj
.
usingComponents
))
{
obj
.
usingComponents
[
componentName
]
=
`/
${
componentName
}
`
const
source
=
JSON
.
stringify
(
obj
,
null
,
2
)
if
(
webpack
.
version
[
0
]
>
4
)
{
const
{
RawSource
}
=
webpack
.
sources
const
newSource
=
new
RawSource
(
source
)
compilation
.
updateAsset
(
appJsonName
,
newSource
)
}
else
{
appJsonFile
.
source
=
function
()
{
return
source
}
}
const
files
=
[
{
ext
:
'
axml
'
,
source
:
'
<slot></slot>
'
},
{
ext
:
'
js
'
,
source
:
'
Component({onInit(){this.props.onPluginWrap(this)},didUnmount(){this.props.onPluginWrap(this,true)}})
'
},
{
ext
:
'
json
'
,
source
:
'
{"component":true}
'
}
]
files
.
forEach
(({
ext
,
source
})
=>
{
compilation
.
assets
[
`
${
componentName
}
.
${
ext
}
`
]
=
{
size
()
{
return
Buffer
.
byteLength
(
source
,
'
utf8
'
)
},
source
()
{
return
source
}
}
})
}
}
if
(
process
.
env
.
UNI_FEATURE_OBSOLETE
!==
'
false
'
)
{
if
(
lastComponents
.
length
)
{
for
(
const
name
of
lastComponents
)
{
...
...
packages/webpack-uni-mp-loader/lib/plugin/generate-json.js
浏览文件 @
a562d744
...
...
@@ -11,6 +11,8 @@ const {
supportGlobalUsingComponents
}
=
require
(
'
@dcloudio/uni-cli-shared/lib/cache
'
)
const
{
createSource
}
=
require
(
'
../shared
'
)
// 主要解决 extends 且未实际引用的组件
const
EMPTY_COMPONENT
=
'
Component({})
'
...
...
@@ -193,14 +195,7 @@ module.exports = function generateJson (compilation) {
const
scopedSlotComponentJsonSource
=
JSON
.
stringify
(
scopedSlotComponentJson
,
null
,
2
)
scopedSlotComponents
.
forEach
(
scopedSlotComponent
=>
{
compilation
.
assets
[
scopedSlotComponent
]
=
{
size
()
{
return
Buffer
.
byteLength
(
scopedSlotComponentJsonSource
,
'
utf8
'
)
},
source
()
{
return
scopedSlotComponentJsonSource
}
}
compilation
.
emitAsset
(
scopedSlotComponent
,
createSource
(
scopedSlotComponentJsonSource
))
})
}
...
...
@@ -225,9 +220,9 @@ module.exports = function generateJson (compilation) {
if
(
name
===
'
app.json
'
)
{
// 删除manifest.json携带的配置项
delete
jsonObj
.
insertAppCssToIndependent
delete
jsonObj
.
independent
delete
jsonObj
.
copyWxComponentsOnDemand
if
(
process
.
env
.
UNI_PLATFORM
===
'
mp-weixin
'
&&
process
.
env
.
USE_UNI_AD
)
{
require
(
'
./mp-weixin-uniad-app.json
'
)(
jsonObj
)
delete
jsonObj
.
copyWxComponentsOnDemand
if
(
process
.
env
.
UNI_PLATFORM
===
'
mp-weixin
'
&&
process
.
env
.
USE_UNI_AD
)
{
require
(
'
./mp-weixin-uniad-app.json
'
)(
jsonObj
)
}
}
else
{
// 删除用于临时记录的属性
delete
jsonObj
.
usingGlobalComponents
...
...
@@ -259,26 +254,9 @@ function emit (name, jsonObj, compilation) {
'
project.swan.js
'
].
includes
(
jsFile
)
&&
!
compilation
.
assets
[
jsFile
]
!
compilation
.
getAsset
(
jsFile
)
)
{
const
jsFileAsset
=
{
size
()
{
return
Buffer
.
byteLength
(
EMPTY_COMPONENT
,
'
utf8
'
)
},
source
()
{
return
EMPTY_COMPONENT
}
}
compilation
.
assets
[
jsFile
]
=
jsFileAsset
}
const
jsonAsset
=
{
size
()
{
return
Buffer
.
byteLength
(
source
,
'
utf8
'
)
},
source
()
{
return
source
}
compilation
.
emitAsset
(
jsFile
,
createSource
(
EMPTY_COMPONENT
))
}
compilation
.
assets
[
name
]
=
jsonAsset
compilation
.
emitAsset
(
name
,
createSource
(
source
))
}
packages/webpack-uni-mp-loader/lib/plugin/index-new.js
浏览文件 @
a562d744
...
...
@@ -2,7 +2,6 @@ const path = require('path')
const
webpack
=
require
(
'
webpack
'
)
const
{
md5
,
parseEntry
,
normalizePath
}
=
require
(
'
@dcloudio/uni-cli-shared
'
)
...
...
@@ -11,25 +10,18 @@ const {
pagesJsonJsFileName
}
=
require
(
'
@dcloudio/uni-cli-shared/lib/pages
'
)
const
{
createSource
}
=
require
(
'
../shared
'
)
const
generateApp
=
require
(
'
./generate-app
'
)
const
generateJson
=
require
(
'
./generate-json
'
)
const
generateComponent
=
require
(
'
./generate-component
'
)
const
emitFileCaches
=
{}
const
clearStyleFile
=
require
(
'
./clear-style-file
'
)
const
mockGenericComponent
=
require
(
'
./mock-generic-component
'
)
const
addEmptyComponent
=
require
(
'
./add-empty-component
'
)
const
addPluginWrapper
=
require
(
'
./add-plugin-wrapper
'
)
function
emitFile
(
filePath
,
source
,
compilation
)
{
const
emitFileMD5
=
md5
(
filePath
+
source
)
if
(
emitFileCaches
[
filePath
]
!==
emitFileMD5
)
{
emitFileCaches
[
filePath
]
=
emitFileMD5
compilation
.
assets
[
filePath
]
=
{
size
()
{
return
Buffer
.
byteLength
(
source
,
'
utf8
'
)
},
source
()
{
return
source
}
}
}
compilation
.
emitAsset
(
filePath
,
createSource
(
source
))
}
function
addSubPackagesRequire
(
compilation
)
{
...
...
@@ -52,16 +44,9 @@ function addSubPackagesRequire (compilation) {
if
(
!
relativePath
.
startsWith
(
'
.
'
))
{
relativePath
=
'
./
'
+
relativePath
}
const
source
=
`require('
${
relativePath
}
');`
+
compilation
.
assets
[
name
].
source
()
compilation
.
assets
[
name
]
=
{
size
()
{
return
Buffer
.
byteLength
(
source
,
'
utf8
'
)
},
source
()
{
return
source
}
}
const
source
=
`require('
${
relativePath
}
');`
+
compilation
.
getAsset
(
name
).
source
.
source
()
compilation
.
updateAsset
(
name
,
createSource
(
source
))
}
})
}
...
...
@@ -76,49 +61,59 @@ function addMPPluginRequire (compilation) {
assetsKeys
.
forEach
(
name
=>
{
const
needProcess
=
process
.
env
.
UNI_MP_PLUGIN
?
name
===
UNI_MP_PLUGIN_MAIN
:
UNI_MP_PLUGIN_EXPORT
.
includes
(
name
)
if
(
needProcess
)
{
const
modules
=
compilation
.
modules
const
orignalSource
=
compilation
.
assets
[
name
]
.
source
()
const
modules
=
Array
.
from
(
compilation
.
modules
)
const
orignalSource
=
compilation
.
getAsset
(
name
).
source
.
source
()
const
globalEnv
=
process
.
env
.
UNI_PLATFORM
===
'
mp-alipay
'
?
'
my
'
:
'
wx
'
const
filePath
=
normalizePath
(
path
.
resolve
(
process
.
env
.
UNI_INPUT_DIR
,
name
))
const
uniModuleId
=
modules
.
find
(
module
=>
module
.
resource
&&
normalizePath
(
module
.
resource
)
===
filePath
).
id
const
source
=
orignalSource
+
`\nmodule.exports =
${
globalEnv
}
.__webpack_require_UNI_MP_PLUGIN__('
${
uniModuleId
}
');\n`
compilation
.
assets
[
name
]
=
{
size
()
{
return
Buffer
.
byteLength
(
source
,
'
utf8
'
)
},
source
()
{
return
source
}
}
compilation
.
updateAsset
(
name
,
createSource
(
source
))
}
})
}
class
WebpackUniMPPlugin
{
a
pply
(
compiler
)
{
if
(
!
process
.
env
.
UNI_USING_NATIVE
&&
!
process
.
env
.
UNI_USING_V3_NATIVE
)
{
compiler
.
hooks
.
emit
.
tapPromise
(
'
webpack-uni-mp-emit
'
,
compilation
=>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
addSubPackagesRequire
(
compilation
)
function
processAssets
(
compiler
,
compilation
)
{
a
ddSubPackagesRequire
(
compilation
)
addMPPluginRequire
(
compilation
)
generateJson
(
compilation
)
addMPPluginRequire
(
compilation
)
// app.js,app.wxss
generateApp
(
compilation
)
.
forEach
(({
file
,
source
})
=>
emitFile
(
file
,
source
,
compilation
))
generateJson
(
compilation
)
generateComponent
(
compilation
,
compiler
.
options
.
output
[
webpack
.
version
[
0
]
>
4
?
'
chunkLoadingGlobal
'
:
'
jsonpFunction
'
]
)
// app.js,app.wxss
generateApp
(
compilation
)
.
forEach
(({
file
,
source
})
=>
emitFile
(
file
,
source
,
compilation
))
clearStyleFile
(
compilation
)
generateComponent
(
compilation
,
compiler
.
options
.
output
[
webpack
.
version
[
0
]
>
4
?
'
chunkLoadingGlobal
'
:
'
jsonpFunction
'
])
mockGenericComponent
(
compilation
)
addEmptyComponent
(
compilation
)
addPluginWrapper
(
compilation
)
}
resolve
()
class
WebpackUniMPPlugin
{
apply
(
compiler
)
{
if
(
!
process
.
env
.
UNI_USING_NATIVE
&&
!
process
.
env
.
UNI_USING_V3_NATIVE
)
{
if
(
webpack
.
version
[
0
]
>
4
)
{
compiler
.
hooks
.
compilation
.
tap
(
'
WebpackUniMPPlugin
'
,
compilation
=>
{
compilation
.
hooks
.
processAssets
.
tap
({
name
:
'
WebpackUniMPPlugin
'
,
stage
:
webpack
.
Compilation
.
PROCESS_ASSETS_STAGE_ADDITIONAL
},
(
_
)
=>
{
processAssets
(
compiler
,
compilation
)
})
})
})
}
else
{
compiler
.
hooks
.
emit
.
tap
(
'
webpack-uni-mp-emit
'
,
(
compilation
)
=>
processAssets
(
compiler
,
compilation
))
}
}
compiler
.
hooks
.
invalid
.
tap
(
'
webpack-uni-mp-invalid
'
,
(
fileName
,
changeTime
)
=>
{
if
(
...
...
packages/webpack-uni-mp-loader/lib/plugin/mock-generic-component.js
0 → 100644
浏览文件 @
a562d744
const
path
=
require
(
'
path
'
)
const
{
normalizePath
,
getPlatformExts
}
=
require
(
'
@dcloudio/uni-cli-shared
'
)
const
{
createSource
,
deleteAsset
}
=
require
(
'
../shared
'
)
module
.
exports
=
function
(
compilation
)
{
// 处理字节跳动|飞书小程序作用域插槽
const
fixExtname
=
'
.fix
'
const
fixSlots
=
{}
compilation
.
getAssets
().
forEach
((
asset
)
=>
{
const
name
=
asset
.
name
if
(
name
.
endsWith
(
fixExtname
))
{
const
source
=
asset
.
source
.
source
()
const
[
ownerName
,
parentName
,
componentName
,
slotName
]
=
source
.
split
(
'
,
'
)
const
json
=
compilation
.
getAsset
(
ownerName
+
'
.json
'
)
const
jsonSource
=
json
&&
json
.
source
.
source
()
if
(
jsonSource
)
{
const
data
=
JSON
.
parse
(
jsonSource
)
const
usingComponents
=
data
.
usingComponents
||
{}
const
componentPath
=
normalizePath
(
path
.
relative
(
'
/
'
,
usingComponents
[
parentName
]))
const
slots
=
fixSlots
[
componentPath
]
=
fixSlots
[
componentPath
]
||
{}
const
slot
=
slots
[
slotName
]
=
slots
[
slotName
]
||
{}
slot
[
componentName
]
=
'
/
'
+
name
.
replace
(
fixExtname
,
''
)
deleteAsset
(
compilation
,
name
)
const
jsonName
=
`
${
componentPath
}
.json`
const
jsonFile
=
compilation
.
getAsset
(
jsonName
)
if
(
jsonFile
)
{
const
oldSource
=
jsonFile
.
source
.
source
()
const
sourceObj
=
JSON
.
parse
(
oldSource
)
Object
.
values
(
slots
).
forEach
(
components
=>
{
const
usingComponents
=
sourceObj
.
usingComponents
=
sourceObj
.
usingComponents
||
{}
Object
.
assign
(
usingComponents
,
components
)
})
delete
sourceObj
.
componentGenerics
const
source
=
JSON
.
stringify
(
sourceObj
,
null
,
2
)
compilation
.
updateAsset
(
jsonName
,
createSource
(
source
))
}
const
templateName
=
`
${
componentPath
}${
getPlatformExts
().
template
}
`
const
templateFile
=
compilation
.
getAsset
(
templateName
)
if
(
templateFile
)
{
const
oldSource
=
templateFile
.
source
.
source
()
let
templateSource
=
oldSource
Object
.
keys
(
slots
).
forEach
(
name
=>
{
const
reg
=
new
RegExp
(
`<
${
name
}
(.+?)></
${
name
}
>`
)
templateSource
=
oldSource
.
replace
(
reg
,
string
=>
{
const
props
=
string
.
match
(
reg
)[
1
]
return
Object
.
keys
(
slots
[
name
]).
map
(
key
=>
{
return
`<block tt:if="{{generic['
${
name
.
replace
(
/^scoped-slots-/
,
''
)}
']==='
${
key
}
'}}"><
${
key
}
${
props
}
></
${
key
}
></block>`
}).
join
(
''
)
})
})
compilation
.
updateAsset
(
templateName
,
createSource
(
templateSource
))
}
}
}
})
}
packages/webpack-uni-mp-loader/lib/script-new.js
浏览文件 @
a562d744
...
...
@@ -28,7 +28,8 @@ const traverse = require('./babel/scoped-component-traverse')
const
{
resolve
,
normalizeNodeModules
normalizeNodeModules
,
getIssuer
}
=
require
(
'
./shared
'
)
const
{
...
...
@@ -55,13 +56,18 @@ module.exports = function (content, map) {
type
=
'
Page
'
}
// <script src=""/>
if
(
!
type
&&
this
.
_module
.
issuer
&&
this
.
_module
.
issuer
.
issuer
)
{
resourcePath
=
normalizeNodeModules
(
removeExt
(
normalizePath
(
path
.
relative
(
process
.
env
.
UNI_INPUT_DIR
,
this
.
_module
.
issuer
.
issuer
.
resource
))))
if
(
resourcePath
===
'
App
'
)
{
type
=
'
App
'
}
else
if
(
process
.
UNI_ENTRY
[
resourcePath
])
{
type
=
'
Page
'
if
(
!
type
)
{
const
moduleIssuer
=
getIssuer
(
this
.
_compilation
,
this
.
_module
)
if
(
moduleIssuer
)
{
const
moduleIssuerIssuer
=
getIssuer
(
this
.
_compilation
,
moduleIssuer
)
if
(
moduleIssuerIssuer
)
{
resourcePath
=
normalizeNodeModules
(
removeExt
(
normalizePath
(
path
.
relative
(
process
.
env
.
UNI_INPUT_DIR
,
moduleIssuerIssuer
.
resource
))))
if
(
resourcePath
===
'
App
'
)
{
type
=
'
App
'
}
else
if
(
process
.
UNI_ENTRY
[
resourcePath
])
{
type
=
'
Page
'
}
}
}
}
...
...
packages/webpack-uni-mp-loader/lib/shared.js
浏览文件 @
a562d744
const
webpack
=
require
(
'
webpack
'
)
const
{
removeExt
,
getPlatformExts
,
getPlatformTarget
}
=
require
(
'
@dcloudio/uni-cli-shared
'
)
const
{
normalizeNodeModules
}
=
require
(
'
@dcloudio/uni-cli-shared/lib/platform
'
)
const
{
normalizeNodeModules
}
=
require
(
'
@dcloudio/uni-cli-shared/lib/platform
'
)
const
templates
=
{}
const
compilerOptions
=
{}
...
...
@@ -39,6 +40,33 @@ function restoreNodeModules (str) {
return
str
}
function
createSource
(
content
)
{
return
webpack
.
version
[
0
]
>
4
?
new
webpack
.
sources
.
RawSource
(
content
)
:
{
size
()
{
return
Buffer
.
byteLength
(
content
,
'
utf8
'
)
},
source
()
{
return
content
}
}
}
function
deleteAsset
(
compilation
,
name
)
{
if
(
'
deleteAsset
'
in
compilation
)
{
compilation
.
deleteAsset
(
name
)
}
else
{
delete
compilation
.
assets
[
name
]
}
}
function
getIssuer
(
compilation
,
module
)
{
return
webpack
.
version
[
0
]
>
4
?
compilation
.
moduleGraph
.
getIssuer
(
module
)
:
module
.
issuer
}
function
getModuleId
(
compilation
,
module
)
{
return
webpack
.
version
[
0
]
>
'
4
'
?
compilation
.
chunkGraph
.
getModuleId
(
module
)
:
module
.
id
}
module
.
exports
=
{
resolve
,
restoreNodeModules
,
...
...
@@ -100,5 +128,9 @@ module.exports = {
return
''
},
getPlatformExts
,
getPlatformTarget
}
getPlatformTarget
,
createSource
,
deleteAsset
,
getIssuer
,
getModuleId
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录