刮刮前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

251 lines
6.7 KiB

const fs = require('fs')
const path = require('path')
const loaderUtils = require('loader-utils')
const {
parsePages,
normalizePath,
parsePagesJson,
parseManifestJson
} = require('@dcloudio/uni-cli-shared')
const {
updateAppJson,
updatePageJson,
updateProjectJson
} = require('@dcloudio/uni-cli-shared/lib/cache')
const {
initTheme,
parseTheme,
darkmode
} = require('@dcloudio/uni-cli-shared/lib/theme')
const {
// pagesJsonJsFileName,
initAutoImportComponents
} = require('@dcloudio/uni-cli-shared/lib/pages')
const uniI18n = require('@dcloudio/uni-cli-i18n')
const parseStyle = require('./util').parseStyle
const {
initI18nOptions
} = require('@dcloudio/uni-cli-shared/lib/i18n')
const {
parseI18nJson
} = require('@dcloudio/uni-i18n')
// 将开发者手动设置的 usingComponents 调整名称,方便与自动解析到的 usingComponents 做最后合并
function renameUsingComponents (jsonObj) {
if (jsonObj.usingComponents || jsonObj.usingSwanComponents) {
// 暂定 usingComponents 优先级高于 usingSwanComponents
jsonObj.customUsingComponents = Object.assign({}, jsonObj.usingSwanComponents, jsonObj.usingComponents)
delete jsonObj.usingComponents
delete jsonObj.usingSwanComponents
}
return jsonObj
}
module.exports = function (content, map) {
this.cacheable && this.cacheable()
let isAppView = false
if (this.resourceQuery) {
const params = loaderUtils.parseQuery(this.resourceQuery)
isAppView = params.type === 'view'
}
// const pagesJsonJsPath = path.resolve(process.env.UNI_INPUT_DIR, pagesJsonJsFileName)
const manifestJsonPath = path.resolve(
process.env.UNI_INPUT_DIR,
'manifest.json'
)
const manifestJson = parseManifestJson(
fs.readFileSync(manifestJsonPath, 'utf8')
)
initTheme(manifestJson)
// this.addDependency(pagesJsonJsPath)
const localePath = path.resolve(process.env.UNI_INPUT_DIR, 'locale')
// 路径不存在时会触发 webpack5 差量编译
if (fs.existsSync(localePath)) {
this.addContextDependency(localePath)
}
this.addDependency(manifestJsonPath)
const pagesJson = parsePagesJson(content, {
addDependency: file => {
(process.UNI_PAGES_DEPS || (process.UNI_PAGES_DEPS = new Set())).add(
normalizePath(file)
)
this.addDependency(file)
}
})
if (!pagesJson.pages || pagesJson.pages.length === 0) {
console.error(uniI18n.__('pagesLoader.pagesNodeCannotNull'))
process.exit(0)
}
if (this.resourceQuery) {
const queryParam = loaderUtils.parseQuery(this.resourceQuery)
if (queryParam) {
if (queryParam.type === 'origin-pages-json') {
return `export default ${JSON.stringify(pagesJson)}`
}
}
}
const platformManifestJson = manifestJson[process.env.UNI_PLATFORM] || {}
if (global.uniPlugin.defaultTheme) {
this.addDependency(
path.resolve(
process.env.UNI_INPUT_DIR,
platformManifestJson.themeLocation || 'theme.json'
)
)
}
// 组件自动导入配置
process.UNI_AUTO_SCAN_COMPONENTS = !(
pagesJson.easycom && pagesJson.easycom.autoscan === false
)
initAutoImportComponents(pagesJson.easycom)
// TODO 与 usingComponents 放在一块读取设置
if (manifestJson.transformPx === false) {
process.UNI_TRANSFORM_PX = false
} else {
process.UNI_TRANSFORM_PX = true
}
if (
(process.env.UNI_PLATFORM.indexOf('mp') !== -1 && !darkmode()) ||
process.env.VUE_APP_DARK_MODE !== 'true'
) {
const { pages, globalStyle, tabBar } = parseTheme(pagesJson)
Object.assign(pagesJson, JSON.parse(JSON.stringify({ pages, globalStyle, tabBar })))
}
if (process.env.UNI_PLATFORM === 'h5') {
return this.callback(
null,
require('./platforms/h5')(
pagesJson,
manifestJson,
this
),
map
)
}
if (process.env.UNI_PLATFORM === 'quickapp-native') {
return this.callback(
null,
require('./platforms/quickapp-native')(pagesJson, manifestJson, this),
map
)
}
// 仅限小程序
if (process.env.UNI_PLATFORM !== 'app-plus') {
const i18nOptions = initI18nOptions(
process.env.UNI_PLATFORM,
process.env.UNI_INPUT_DIR,
true,
true
)
if (i18nOptions) {
const {
locale,
locales,
delimiters
} = i18nOptions
parseI18nJson(pagesJson, locales[locale], delimiters)
}
}
if (!process.env.UNI_USING_V3) {
parsePages(
pagesJson,
function (page) {
updatePageJson(
page.path,
renameUsingComponents(parseStyle(page.style))
)
},
function (root, page) {
updatePageJson(
normalizePath(path.join(root, page.path)),
renameUsingComponents(parseStyle(page.style, root))
)
}
)
}
const jsonFiles = require('./platforms/' + process.env.UNI_PLATFORM)(
pagesJson,
manifestJson,
isAppView
)
if (jsonFiles && jsonFiles.length) {
if (process.env.UNI_USING_V3) {
let appConfigContent = ''
jsonFiles.forEach(jsonFile => {
if (jsonFile) {
if (!isAppView && jsonFile.name === 'manifest.json') {
const content = JSON.parse(jsonFile.content)
if (
!content.launch_path &&
content.plus['uni-app'].nvueLaunchMode === 'fast'
) {
console.log(
uniI18n.__('pagesLoader.nvueFirstPageStartModeIsFast', {
0: 'https://ask.dcloud.net.cn/article/36749'
})
)
}
}
if (jsonFile.name === 'define-pages.js') {
appConfigContent = jsonFile.content
} else {
// app-view 不需要生成 app-config-service.js,manifest.json
!isAppView && this.emitFile(jsonFile.name, jsonFile.content)
}
}
})
return this.callback(null, appConfigContent, map)
}
if (process.env.UNI_USING_NATIVE || process.env.UNI_USING_V3_NATIVE) {
let appConfigContent = ''
jsonFiles.forEach(jsonFile => {
if (jsonFile) {
if (
jsonFile.name === 'app-config.js' ||
jsonFile.name === 'define-pages.js'
) {
appConfigContent = jsonFile.content
} else {
this.emitFile(jsonFile.name, jsonFile.content)
}
}
})
return this.callback(null, appConfigContent, map)
}
jsonFiles.forEach(jsonFile => {
if (jsonFile) {
if (jsonFile.name === 'app') {
updateAppJson(jsonFile.name, renameUsingComponents(jsonFile.content))
} else {
updateProjectJson(jsonFile.name, jsonFile.content)
}
}
})
}
this.callback(null, '', map)
}