This commit is contained in:
107
scripts/verify-arrival-navigation-build.cjs
Normal file
107
scripts/verify-arrival-navigation-build.cjs
Normal file
@@ -0,0 +1,107 @@
|
||||
const fs = require('node:fs')
|
||||
const path = require('node:path')
|
||||
|
||||
const projectRoot = path.resolve(__dirname, '..')
|
||||
const h5Root = path.resolve(projectRoot, process.argv[2] || path.join('dist', 'build', 'h5'))
|
||||
const mpRoot = path.resolve(projectRoot, process.argv[3] || path.join('dist', 'build', 'mp-weixin'))
|
||||
|
||||
const readText = (filePath) => fs.readFileSync(filePath, 'utf8')
|
||||
|
||||
const assertContains = (source, value, label) => {
|
||||
if (!source.includes(value)) {
|
||||
throw new Error(`${label} 缺少:${value}`)
|
||||
}
|
||||
}
|
||||
|
||||
const assertNotContains = (source, value, label) => {
|
||||
if (source.includes(value)) {
|
||||
throw new Error(`${label} 不应包含:${value}`)
|
||||
}
|
||||
}
|
||||
|
||||
const collectJavaScriptFiles = (root) => fs.readdirSync(root, { withFileTypes: true })
|
||||
.flatMap((entry) => {
|
||||
const entryPath = path.join(root, entry.name)
|
||||
if (entry.isDirectory()) return collectJavaScriptFiles(entryPath)
|
||||
return entry.isFile() && entry.name.endsWith('.js') ? [entryPath] : []
|
||||
})
|
||||
|
||||
const htmlPath = path.join(h5Root, 'index.html')
|
||||
const html = readText(htmlPath)
|
||||
const entryMatch = html.match(/<script[^>]+src="([^"]+\.js)"/)
|
||||
if (!entryMatch) throw new Error('H5 index.html 未找到入口 JS')
|
||||
|
||||
const entryPath = path.join(h5Root, entryMatch[1].replace(/^\//, ''))
|
||||
const entryCode = readText(entryPath)
|
||||
const pageChunkMatch = entryCode.match(/pages-index-index\.[A-Za-z0-9_-]+\.js/)
|
||||
if (!pageChunkMatch) throw new Error('H5 入口 JS 未找到首页页面 chunk')
|
||||
|
||||
const pageChunkPath = path.join(path.dirname(entryPath), pageChunkMatch[0])
|
||||
const pageChunkCode = readText(pageChunkPath)
|
||||
const h5JavaScriptFiles = collectJavaScriptFiles(h5Root)
|
||||
const h5JavaScriptCode = h5JavaScriptFiles
|
||||
.map((filePath) => readText(filePath))
|
||||
.join('\n')
|
||||
|
||||
for (const required of ['第三方导航', 'third-party-providers']) {
|
||||
assertContains(pageChunkCode, required, 'H5 首页 chunk')
|
||||
}
|
||||
|
||||
for (const forbidden of [
|
||||
'打开地图导航',
|
||||
'native-location',
|
||||
'jweixin',
|
||||
'wx.miniProgram',
|
||||
'宿主地图',
|
||||
'/pages/open-location/index'
|
||||
]) {
|
||||
assertNotContains(h5JavaScriptCode, forbidden, 'H5 全量 JS')
|
||||
}
|
||||
|
||||
if (h5JavaScriptFiles.some((filePath) => path.basename(filePath).includes('pages-open-location-index'))) {
|
||||
throw new Error('H5 构建不应生成 open-location 页面 chunk')
|
||||
}
|
||||
|
||||
const mpArrivalPanelPath = path.join(
|
||||
mpRoot,
|
||||
'components',
|
||||
'navigation',
|
||||
'ArrivalPanel.js'
|
||||
)
|
||||
const mpArrivalPanelCode = readText(mpArrivalPanelPath)
|
||||
const mpArrivalPanelTemplatePath = path.join(
|
||||
mpRoot,
|
||||
'components',
|
||||
'navigation',
|
||||
'ArrivalPanel.wxml'
|
||||
)
|
||||
const mpArrivalPanelTemplate = readText(mpArrivalPanelTemplatePath)
|
||||
assertContains(mpArrivalPanelCode, '打开地图导航', 'mp-weixin 来馆组件')
|
||||
assertContains(
|
||||
mpArrivalPanelCode,
|
||||
'../../services/WechatOpenLocationService.js',
|
||||
'mp-weixin 来馆组件'
|
||||
)
|
||||
assertNotContains(mpArrivalPanelCode, 'third-party-providers', 'mp-weixin 来馆组件')
|
||||
assertNotContains(mpArrivalPanelTemplate, 'provider-sheet', 'mp-weixin 来馆模板')
|
||||
assertNotContains(mpArrivalPanelTemplate, '第三方导航', 'mp-weixin 来馆模板')
|
||||
|
||||
const mpAppConfigPath = path.join(mpRoot, 'app.json')
|
||||
const mpAppConfig = JSON.parse(readText(mpAppConfigPath))
|
||||
if (!mpAppConfig.pages?.includes('pages/open-location/index')) {
|
||||
throw new Error('mp-weixin app.json 未注册 open-location 页面')
|
||||
}
|
||||
|
||||
console.log(JSON.stringify({
|
||||
h5: {
|
||||
html: path.relative(projectRoot, htmlPath),
|
||||
entry: path.relative(projectRoot, entryPath),
|
||||
pageChunk: path.relative(projectRoot, pageChunkPath),
|
||||
navigationMode: 'third-party-providers'
|
||||
},
|
||||
mpWeixin: {
|
||||
component: path.relative(projectRoot, mpArrivalPanelPath),
|
||||
template: path.relative(projectRoot, mpArrivalPanelTemplatePath),
|
||||
navigationMode: 'native-location'
|
||||
}
|
||||
}, null, 2))
|
||||
Reference in New Issue
Block a user