-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
112 lines (102 loc) · 3.13 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
const fs = require('fs')
const path = require('path')
const { parseComponent } = require('vue-template-compiler')
const {
generateHtmlCode,
generateLabelCode,
generateStyleCode,
getPagesMap,
initPages,
getRoute
} = require('./utils')
const injectCodeModuleSnippets = require('./utils/inject')
// 是否初始化过
let _init = false
// 是否需要做处理
let needHandle = false
// 路由和配置的映射关系
let pagesMap = {}
module.exports = function (content) {
if (!_init) {
_init = true
init(this)
}
// 配置无效不予处理
if (!needHandle) {
return content
}
// 获取当前文件的小程序路由
const route = getRoute(this.resourcePath)
// 根据路由并找到对应配置
const curPage = pagesMap[route]
if (curPage) {
// 解析sfc
let compiler = parseComponent(content)
const { injectCode, injectLabel } = curPage || {}
const isPageHasInjectCode = injectCode && injectCode.length
const isPageHasInjectLabel = injectLabel && injectLabel.length
// 插入代码
if (isPageHasInjectCode) {
for (const module of injectCode) {
// 获取公共组件路径
const projectRoot = path.resolve(__dirname, '../../../')
const modulePath = path.resolve(
projectRoot,
`src/components/${module}/${module}.vue`
)
const injectContent = fs.readFileSync(modulePath, 'utf8')
// 解析sfc - 最终插入到页面的代码
const injectCompiler = parseComponent(injectContent)
// 将 injectCompiler 和 compiler 进行合并
const result = injectCodeModuleSnippets({
sourceCompiler: compiler,
injectCompiler,
curPage
})
content = result.content
compiler = result.compiler
}
}
// 插入标签
if (isPageHasInjectLabel) {
// 生成标签代码
const labelCode = generateLabelCode(injectLabel || [])
// 匹配标签位置
// eslint-disable-next-line no-useless-escape
const insertReg = new RegExp(`(<\/${curPage.ele}>$)`)
// 在匹配的标签之前插入额外标签代码
const templateCode = generateHtmlCode(
compiler.template.content,
labelCode,
insertReg
)
// 重组style标签及内容
const style = generateStyleCode(compiler.styles || [])
content = `
<template>
${templateCode}
</template>
<script>
${compiler.script.content}
</script>
${style}
`
}
}
return content
}
function init(that) {
const platform = process.env.VUE_APP_PLATFORM
const { VUE_APP_PLATFORMS = [] } = that.query || {}
// 平台不一致不予处理
if (!VUE_APP_PLATFORMS.includes(platform)) {
return
}
// 允许的平台 app-plus mp-weixin mp-alipay mp-baidu mp-toutiao
const allowPlatform = [/mp-[\w]+/, /app-plus/]
const isLoader = allowPlatform.some((e) => e.test(platform))
// 首次需要对pages配置文件做解析,并判断是否为有效配置
needHandle = isLoader && initPages(that)
// 转换为路由和配置的映射对象
needHandle && (pagesMap = getPagesMap())
}