Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
genary
uni-app
提交
260b8163
U
uni-app
项目概览
genary
/
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,发现更多精彩内容 >>
提交
260b8163
编写于
11月 29, 2021
作者:
fxy060608
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor(h5): inject uni.css
上级
7e3ce112
变更
4
展开全部
隐藏空白更改
内联
并排
Showing
4 changed file
with
149 addition
and
29 deletion
+149
-29
packages/uni-app-plus/dist/uni-app-view.umd.js
packages/uni-app-plus/dist/uni-app-view.umd.js
+3
-3
packages/uni-cli-shared/src/vite/plugins/index.ts
packages/uni-cli-shared/src/vite/plugins/index.ts
+7
-2
packages/uni-cli-shared/src/vite/plugins/vitejs/plugins/css.ts
...ges/uni-cli-shared/src/vite/plugins/vitejs/plugins/css.ts
+1
-1
packages/uni-h5-vite/src/plugins/css.ts
packages/uni-h5-vite/src/plugins/css.ts
+138
-23
未找到文件。
packages/uni-app-plus/dist/uni-app-view.umd.js
浏览文件 @
260b8163
此差异已折叠。
点击以展开。
packages/uni-cli-shared/src/vite/plugins/index.ts
浏览文件 @
260b8163
...
...
@@ -5,5 +5,10 @@ export * from './mainJs'
export
*
from
'
./jsonJs
'
export
*
from
'
./console
'
export
{
assetPlugin
}
from
'
./vitejs/plugins/asset
'
export
{
isCSSRequest
,
cssPlugin
,
cssPostPlugin
}
from
'
./vitejs/plugins/css
'
export
{
assetPlugin
,
getAssetHash
}
from
'
./vitejs/plugins/asset
'
export
{
isCSSRequest
,
cssPlugin
,
cssPostPlugin
,
minifyCSS
,
}
from
'
./vitejs/plugins/css
'
packages/uni-cli-shared/src/vite/plugins/vitejs/plugins/css.ts
浏览文件 @
260b8163
...
...
@@ -706,7 +706,7 @@ async function doUrlReplace(
return
`url(
${
wrap
}${
await
replacer
(
rawUrl
)}${
wrap
}
)`
}
async
function
minifyCSS
(
css
:
string
,
config
:
ResolvedConfig
)
{
export
async
function
minifyCSS
(
css
:
string
,
config
:
ResolvedConfig
)
{
const
{
code
,
warnings
}
=
await
transform
(
css
,
{
loader
:
'
css
'
,
minify
:
true
,
...
...
packages/uni-h5-vite/src/plugins/css.ts
浏览文件 @
260b8163
import
fs
from
'
fs
'
import
{
OutputAsset
,
OutputChunk
}
from
'
rollup
'
import
type
{
Plugin
,
ResolvedConfig
}
from
'
vite
'
import
path
from
'
path
'
import
{
buildInCssSet
,
resolveBuiltIn
}
from
'
@dcloudio/uni-cli-shared
'
import
{
normalizePath
,
Plugin
,
ResolvedConfig
}
from
'
vite
'
import
{
buildInCssSet
,
minifyCSS
,
getAssetHash
,
resolveBuiltIn
,
isExternalUrl
,
}
from
'
@dcloudio/uni-cli-shared
'
import
{
OutputOptions
}
from
'
rollup
'
function
isCombineBuiltInCss
(
config
:
ResolvedConfig
)
{
return
config
.
command
===
'
build
'
&&
config
.
build
.
cssCodeSplit
...
...
@@ -10,41 +18,148 @@ function isCombineBuiltInCss(config: ResolvedConfig) {
export
function
uniCssPlugin
():
Plugin
{
let
resolvedConfig
:
ResolvedConfig
let
file
=
''
let
fileName
=
''
return
{
name
:
'
vite:uni-h5-css
'
,
apply
:
'
build
'
,
enforce
:
'
p
ost
'
,
enforce
:
'
p
re
'
,
configResolved
(
config
)
{
resolvedConfig
=
config
file
=
path
.
join
(
process
.
env
.
UNI_INPUT_DIR
,
'
uni.css
'
)
},
generateBundle
(
_opts
,
bundle
)
{
// 将内置组件样式,合并进入首页
async
generateBundle
()
{
if
(
!
isCombineBuiltInCss
(
resolvedConfig
)
||
!
buildInCssSet
.
size
)
{
return
}
const
chunks
=
Object
.
values
(
bundle
)
const
entryChunk
=
chunks
.
find
(
(
chunk
)
=>
chunk
.
type
===
'
chunk
'
&&
chunk
.
isEntry
)
as
OutputChunk
|
undefined
if
(
!
entryChunk
)
{
return
}
const
entryName
=
entryChunk
.
name
const
entryCssAsset
=
chunks
.
find
(
({
name
})
=>
name
===
entryName
+
'
.css
'
)
as
OutputAsset
if
(
entryCssAsset
)
{
entryCssAsset
.
source
=
generateBuiltInCssCode
([...
buildInCssSet
])
+
'
\n
'
+
entryCssAsset
.
source
}
// 生成框架css
const
content
=
await
minifyCSS
(
generateBuiltInCssCode
([...
buildInCssSet
]),
resolvedConfig
)
const
contentHash
=
getAssetHash
(
Buffer
.
from
(
content
,
'
utf-8
'
))
const
assetFileNames
=
path
.
posix
.
join
(
resolvedConfig
.
build
.
assetsDir
,
'
[name].[hash][extname]
'
)
fileName
=
assetFileNamesToFileName
(
assetFileNames
,
file
,
contentHash
,
content
)
const
name
=
normalizePath
(
path
.
relative
(
resolvedConfig
.
root
,
file
))
this
.
emitFile
({
name
,
fileName
,
type
:
'
asset
'
,
source
:
content
,
})
},
transformIndexHtml
:
{
enforce
:
'
post
'
,
transform
()
{
if
(
!
fileName
)
{
return
}
// 追加框架css
return
[
{
tag
:
'
link
'
,
attrs
:
{
rel
:
'
stylesheet
'
,
href
:
toPublicPath
(
fileName
,
resolvedConfig
),
},
injectTo
:
'
head-prepend
'
,
},
]
},
},
}
}
function
toPublicPath
(
filename
:
string
,
config
:
ResolvedConfig
)
{
return
isExternalUrl
(
filename
)
?
filename
:
config
.
base
+
filename
}
function
generateBuiltInCssCode
(
cssImports
:
string
[])
{
return
cssImports
.
map
((
cssImport
)
=>
fs
.
readFileSync
(
resolveBuiltIn
(
cssImport
),
'
utf8
'
))
.
join
(
'
\n
'
)
}
/**
* converts the source filepath of the asset to the output filename based on the assetFileNames option. \
* this function imitates the behavior of rollup.js. \
* https://rollupjs.org/guide/en/#outputassetfilenames
*
* @example
* ```ts
* const content = Buffer.from('text');
* const fileName = assetFileNamesToFileName(
* 'assets/[name].[hash][extname]',
* '/path/to/file.txt',
* getAssetHash(content),
* content
* )
* // fileName: 'assets/file.982d9e3e.txt'
* ```
*
* @param assetFileNames filename pattern. e.g. `'assets/[name].[hash][extname]'`
* @param file filepath of the asset
* @param contentHash hash of the asset. used for `'[hash]'` placeholder
* @param content content of the asset. passed to `assetFileNames` if `assetFileNames` is a function
* @returns output filename
*/
export
function
assetFileNamesToFileName
(
assetFileNames
:
Exclude
<
OutputOptions
[
'
assetFileNames
'
],
undefined
>
,
file
:
string
,
contentHash
:
string
,
content
:
string
|
Buffer
):
string
{
const
basename
=
path
.
basename
(
file
)
// placeholders for `assetFileNames`
// `hash` is slightly different from the rollup's one
const
extname
=
path
.
extname
(
basename
)
const
ext
=
extname
.
substr
(
1
)
const
name
=
basename
.
slice
(
0
,
-
extname
.
length
)
const
hash
=
contentHash
if
(
typeof
assetFileNames
===
'
function
'
)
{
assetFileNames
=
assetFileNames
({
name
:
file
,
source
:
content
,
type
:
'
asset
'
,
})
if
(
typeof
assetFileNames
!==
'
string
'
)
{
throw
new
TypeError
(
'
assetFileNames must return a string
'
)
}
}
else
if
(
typeof
assetFileNames
!==
'
string
'
)
{
throw
new
TypeError
(
'
assetFileNames must be a string or a function
'
)
}
const
fileName
=
assetFileNames
.
replace
(
/
\[\w
+
\]
/g
,
(
placeholder
:
string
):
string
=>
{
switch
(
placeholder
)
{
case
'
[ext]
'
:
return
ext
case
'
[extname]
'
:
return
extname
case
'
[hash]
'
:
return
hash
case
'
[name]
'
:
return
name
}
throw
new
Error
(
`invalid placeholder
${
placeholder
}
in assetFileNames "
${
assetFileNames
}
"`
)
}
)
return
fileName
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录