diff --git a/packages/shims-node.d.ts b/packages/shims-node.d.ts index 34431034ad966b458793a81e145c1c15f62034cd..d3cf9af2519cb7e574c94bf8fdbf278d581b8f80 100644 --- a/packages/shims-node.d.ts +++ b/packages/shims-node.d.ts @@ -9,6 +9,7 @@ declare namespace NodeJS { UNI_INPUT_DIR: string UNI_OUTPUT_DIR: string UNI_CLI_CONTEXT: string + UNI_SUBPACKAGE?: string UNI_COMPILER_VERSION: string UNI_COMPILER_VERSION_TYPE: 'a' | 'r' UNI_HBUILDERX_PLUGINS: string diff --git a/packages/uni-cli-shared/src/env/define.ts b/packages/uni-cli-shared/src/env/define.ts index 996d002a26905b004055a1a5e089330d4d0db5b6..7454c60f62b78981ddf45e6196b716eaa88f6e87 100644 --- a/packages/uni-cli-shared/src/env/define.ts +++ b/packages/uni-cli-shared/src/env/define.ts @@ -13,6 +13,7 @@ export function initDefine(stringifyBoolean: boolean = false) { 'process.env.UNI_APP_ID': JSON.stringify(manifestJson.appid || ''), 'process.env.UNI_APP_NAME': JSON.stringify(manifestJson.name || ''), 'process.env.UNI_PLATFORM': JSON.stringify(process.env.UNI_PLATFORM), + 'process.env.UNI_SUBPACKAGE': JSON.stringify(process.env.UNI_SUBPACKAGE), 'process.env.UNI_COMPILER_VERSION': JSON.stringify( process.env.UNI_COMPILER_VERSION ), diff --git a/packages/uni-cli-shared/src/json/mp/jsonFile.ts b/packages/uni-cli-shared/src/json/mp/jsonFile.ts index bedb39e37596e2fe1339f4c835b04b5474f6afa4..de571a0efc2d485df366f7f5df82798657b3a241 100644 --- a/packages/uni-cli-shared/src/json/mp/jsonFile.ts +++ b/packages/uni-cli-shared/src/json/mp/jsonFile.ts @@ -1,6 +1,6 @@ import { extend } from '@vue/shared' import { ComponentJson, PageWindowOptions, UsingComponents } from './types' -import { normalizeNodeModules } from '../../utils' +import { removeExt, relativeFile, normalizeNodeModules } from '../../utils' let appJsonCache: Record = {} const jsonFilesCache = new Map() @@ -8,6 +8,10 @@ const jsonPagesCache = new Map() const jsonComponentsCache = new Map() const jsonUsingComponentsCache = new Map() +export function isPageFile(file: string) { + return jsonPagesCache.has(removeExt(file)) +} + export function hasJsonFile(filename: string) { return ( filename === 'app' || @@ -22,16 +26,25 @@ export function normalizeJsonFilename(filename: string) { export function findChangedJsonFiles() { const changedJsonFiles = new Map() - function findChangedFile(name: string, json: Record) { + function findChangedFile(filename: string, json: Record) { const newJson = extend({}, json) if (!newJson.usingComponents) { newJson.usingComponents = {} } - extend(newJson.usingComponents, jsonUsingComponentsCache.get(name)) + extend(newJson.usingComponents, jsonUsingComponentsCache.get(filename)) + const usingComponents = newJson.usingComponents + // 格式化为相对路径,这样作为分包也可以直接运行 + Object.keys(usingComponents).forEach((name) => { + usingComponents[name] = relativeFile( + filename, + usingComponents[name].slice(1) + ) + }) + const jsonStr = JSON.stringify(newJson, null, 2) - if (jsonFilesCache.get(name) !== jsonStr) { - changedJsonFiles.set(name, jsonStr) - jsonFilesCache.set(name, jsonStr) + if (jsonFilesCache.get(filename) !== jsonStr) { + changedJsonFiles.set(filename, jsonStr) + jsonFilesCache.set(filename, jsonStr) } } function findChangedFiles(jsonsCache: Map) { diff --git a/packages/uni-cli-shared/src/utils.ts b/packages/uni-cli-shared/src/utils.ts index a751e0b380910caf570dc1365ee5481908273cfd..189429cceea220b81d44cd4d13233dd19e346850 100644 --- a/packages/uni-cli-shared/src/utils.ts +++ b/packages/uni-cli-shared/src/utils.ts @@ -19,6 +19,9 @@ export function normalizePath(id: string): string { return isWindows ? id.replace(/\\/g, '/') : id } +export function relativeFile(from: string, to: string) { + return normalizePath(path.relative(path.dirname(from), to)) +} export function checkElementNodeTag( node: RootNode | TemplateChildNode | null | undefined, tag: string diff --git a/packages/uni-mp-alipay/dist/uni.mp.esm.js b/packages/uni-mp-alipay/dist/uni.mp.esm.js index 9b3d9a6a4e7836ee0d2fa78f35ebaf9cdc30eb63..7867bbb0645fec6644c30998560c40755a02944f 100644 --- a/packages/uni-mp-alipay/dist/uni.mp.esm.js +++ b/packages/uni-mp-alipay/dist/uni.mp.esm.js @@ -334,6 +334,43 @@ function initCreateApp(parseAppOptions) { return App(parseApp(vm, parseAppOptions)); }; } +function initCreateSubpackageApp(parseAppOptions) { + return function createApp(vm) { + const appOptions = parseApp(vm, parseAppOptions); + const app = getApp({ + allowDefault: true, + }); + vm.$.ctx.$scope = app; + const globalData = app.globalData; + if (globalData) { + Object.keys(appOptions.globalData).forEach((name) => { + if (!hasOwn(globalData, name)) { + globalData[name] = appOptions.globalData[name]; + } + }); + } + Object.keys(appOptions).forEach((name) => { + if (!hasOwn(app, name)) { + app[name] = appOptions[name]; + } + }); + if (isFunction(appOptions.onShow) && my.onAppShow) { + my.onAppShow((args) => { + vm.$callHook('onShow', args); + }); + } + if (isFunction(appOptions.onHide) && my.onAppHide) { + my.onAppHide((args) => { + vm.$callHook('onHide', args); + }); + } + if (isFunction(appOptions.onLaunch)) { + const args = my.getLaunchOptionsSync && my.getLaunchOptionsSync(); + vm.$callHook('onLaunch', args); + } + return App(appOptions); + }; +} function initLocale(appVm) { const locale = ref(my.getSystemInfoSync().language || 'zh-Hans'); Object.defineProperty(appVm, '$locale', { @@ -571,20 +608,15 @@ function onAliGetAuthorize(method, $event) { my.getPhoneNumber({ success: (res) => { $event.type = 'getphonenumber'; - const response = JSON.parse(res.response).response; - if (response.code === '10000') { - // success - $event.detail.errMsg = 'getPhoneNumber:ok'; - $event.detail.encryptedData = res.response; - } - else { - $event.detail.errMsg = 'getPhoneNumber:fail Error: ' + res.response; - } + const response = JSON.parse(res.response); + $event.detail.errMsg = 'getPhoneNumber:ok'; + $event.detail.encryptedData = response.response; + $event.detail.sign = response.sign; this[method]($event); }, - fail: () => { + fail: (res) => { $event.type = 'getphonenumber'; - $event.detail.errMsg = 'getPhoneNumber:fail'; + $event.detail.errMsg = 'getPhoneNumber:fail Error: ' + JSON.stringify(res); this[method]($event); }, }); @@ -983,9 +1015,11 @@ function initCreateComponent() { const createApp = initCreateApp(parseAppOptions); const createPage = initCreatePage(); const createComponent = initCreateComponent(); +const createSubpackageApp = initCreateSubpackageApp(parseAppOptions); my.EventChannel = EventChannel; my.createApp = createApp; my.createPage = createPage; -my.createComponent = createComponent; +my.createComponent = createComponent; +my.createSubpackageApp = createSubpackageApp; -export { createApp, createComponent, createPage }; +export { createApp, createComponent, createPage, createSubpackageApp }; diff --git a/packages/uni-mp-alipay/src/runtime/index.ts b/packages/uni-mp-alipay/src/runtime/index.ts index 623ed6491fa9ad9c7f86ec5e772a9e8053c57a29..1f44c8c7d4608d8011cd4919b0ef1aba5c67acd4 100644 --- a/packages/uni-mp-alipay/src/runtime/index.ts +++ b/packages/uni-mp-alipay/src/runtime/index.ts @@ -1,6 +1,6 @@ import { EventChannel } from '@dcloudio/uni-shared' -import { initCreateApp } from '@dcloudio/uni-mp-core' +import { initCreateApp, initCreateSubpackageApp } from '@dcloudio/uni-mp-core' import * as parseAppOptions from './parseAppOptions' @@ -9,7 +9,9 @@ import { initCreateComponent } from './createComponent' export const createApp = initCreateApp(parseAppOptions) export const createPage = initCreatePage() export const createComponent = initCreateComponent() +export const createSubpackageApp = initCreateSubpackageApp(parseAppOptions) ;(my as any).EventChannel = EventChannel ;(my as any).createApp = createApp ;(my as any).createPage = createPage ;(my as any).createComponent = createComponent +;(my as any).createSubpackageApp = createSubpackageApp diff --git a/packages/uni-mp-baidu/dist/uni.mp.esm.js b/packages/uni-mp-baidu/dist/uni.mp.esm.js index 39aeb141fa78876f272b57f900cecc8fbe7ee41c..295a2bd57a9e297d7ae326ae5da0208095e87239 100644 --- a/packages/uni-mp-baidu/dist/uni.mp.esm.js +++ b/packages/uni-mp-baidu/dist/uni.mp.esm.js @@ -323,6 +323,43 @@ function initCreateApp(parseAppOptions) { return App(parseApp(vm, parseAppOptions)); }; } +function initCreateSubpackageApp(parseAppOptions) { + return function createApp(vm) { + const appOptions = parseApp(vm, parseAppOptions); + const app = getApp({ + allowDefault: true, + }); + vm.$.ctx.$scope = app; + const globalData = app.globalData; + if (globalData) { + Object.keys(appOptions.globalData).forEach((name) => { + if (!hasOwn(globalData, name)) { + globalData[name] = appOptions.globalData[name]; + } + }); + } + Object.keys(appOptions).forEach((name) => { + if (!hasOwn(app, name)) { + app[name] = appOptions[name]; + } + }); + if (isFunction(appOptions.onShow) && swan.onAppShow) { + swan.onAppShow((args) => { + vm.$callHook('onShow', args); + }); + } + if (isFunction(appOptions.onHide) && swan.onAppHide) { + swan.onAppHide((args) => { + vm.$callHook('onHide', args); + }); + } + if (isFunction(appOptions.onLaunch)) { + const args = swan.getLaunchOptionsSync && swan.getLaunchOptionsSync(); + vm.$callHook('onLaunch', args); + } + return App(appOptions); + }; +} function initLocale(appVm) { const locale = ref(swan.getSystemInfoSync().language || 'zh-Hans'); Object.defineProperty(appVm, '$locale', { @@ -979,9 +1016,11 @@ var parsePageOptions = /*#__PURE__*/Object.freeze({ const createApp = initCreateApp(parseAppOptions); const createPage = initCreatePage(parsePageOptions); const createComponent = initCreateComponent(parseComponentOptions); +const createSubpackageApp = initCreateSubpackageApp(parseAppOptions); swan.EventChannel = EventChannel; swan.createApp = global.createApp = createApp; swan.createPage = createPage; -swan.createComponent = createComponent; +swan.createComponent = createComponent; +swan.createSubpackageApp = createSubpackageApp; -export { createApp, createComponent, createPage }; +export { createApp, createComponent, createPage, createSubpackageApp }; diff --git a/packages/uni-mp-baidu/src/runtime/index.ts b/packages/uni-mp-baidu/src/runtime/index.ts index 8b455f815cd60220f9fa075a0a60d8891cab82bd..9b46e14d3aadef9e8cc2a29d90287e7ad99891f9 100644 --- a/packages/uni-mp-baidu/src/runtime/index.ts +++ b/packages/uni-mp-baidu/src/runtime/index.ts @@ -3,6 +3,7 @@ import { initCreateApp, initCreatePage, initCreateComponent, + initCreateSubpackageApp, } from '@dcloudio/uni-mp-core' import '@dcloudio/uni-mp-polyfill' @@ -14,7 +15,9 @@ import * as parseComponentOptions from './parseComponentOptions' export const createApp = initCreateApp(parseAppOptions) export const createPage = initCreatePage(parsePageOptions) export const createComponent = initCreateComponent(parseComponentOptions) +export const createSubpackageApp = initCreateSubpackageApp(parseAppOptions) ;(swan as any).EventChannel = EventChannel ;(swan as any).createApp = (global as any).createApp = createApp ;(swan as any).createPage = createPage ;(swan as any).createComponent = createComponent +;(swan as any).createSubpackageApp = createSubpackageApp diff --git a/packages/uni-mp-core/src/index.ts b/packages/uni-mp-core/src/index.ts index 5b714482fb5cb35aa75b3f53c0ed0442c012f0d9..be6f92207032025614bab2a56bfc67b881e7acfd 100644 --- a/packages/uni-mp-core/src/index.ts +++ b/packages/uni-mp-core/src/index.ts @@ -7,7 +7,7 @@ declare module '@vue/runtime-core' { } } -export { initCreateApp } from './runtime/app' +export { initCreateApp, initCreateSubpackageApp } from './runtime/app' export { initCreatePage } from './runtime/page' export { initCreateComponent } from './runtime/component' diff --git a/packages/uni-mp-core/src/runtime/app.ts b/packages/uni-mp-core/src/runtime/app.ts index 2d0081dff5ed2431ae97c696a2ca741308d9b2eb..4671bae45745d6ff5375a7488f80f767ff428524 100644 --- a/packages/uni-mp-core/src/runtime/app.ts +++ b/packages/uni-mp-core/src/runtime/app.ts @@ -1,4 +1,4 @@ -import { extend } from '@vue/shared' +import { extend, hasOwn, isFunction } from '@vue/shared' import { ComponentPublicInstance, ComponentOptions, ref } from 'vue' import { initBaseInstance } from './componentInstance' @@ -95,6 +95,45 @@ export function initCreateApp(parseAppOptions?: ParseAppOptions) { } } +export function initCreateSubpackageApp(parseAppOptions?: ParseAppOptions) { + return function createApp(vm: ComponentPublicInstance) { + const appOptions = parseApp(vm, parseAppOptions) + const app = getApp({ + allowDefault: true, + }) + ;(vm.$ as any).ctx.$scope = app + const globalData = app.globalData + if (globalData) { + Object.keys(appOptions.globalData).forEach((name) => { + if (!hasOwn(globalData, name)) { + globalData[name] = appOptions.globalData[name] + } + }) + } + Object.keys(appOptions).forEach((name) => { + if (!hasOwn(app, name)) { + app[name] = appOptions[name] + } + }) + if (isFunction(appOptions.onShow) && __GLOBAL__.onAppShow) { + __GLOBAL__.onAppShow((args: unknown) => { + vm.$callHook('onShow', args) + }) + } + if (isFunction(appOptions.onHide) && __GLOBAL__.onAppHide) { + __GLOBAL__.onAppHide((args: unknown) => { + vm.$callHook('onHide', args) + }) + } + if (isFunction(appOptions.onLaunch)) { + const args = + __GLOBAL__.getLaunchOptionsSync && __GLOBAL__.getLaunchOptionsSync() + vm.$callHook('onLaunch', args) + } + return App(appOptions) + } +} + function initLocale(appVm: ComponentPublicInstance) { const locale = ref( __GLOBAL__.getSystemInfoSync().language || 'zh-Hans' diff --git a/packages/uni-mp-kuaishou/dist/uni.mp.esm.js b/packages/uni-mp-kuaishou/dist/uni.mp.esm.js index 9f8a7155393f17b2bdaa38f12fd22f3347410212..7549ff808ce2293e2c908edddaabe88333e721ae 100644 --- a/packages/uni-mp-kuaishou/dist/uni.mp.esm.js +++ b/packages/uni-mp-kuaishou/dist/uni.mp.esm.js @@ -323,6 +323,43 @@ function initCreateApp(parseAppOptions) { return App(parseApp(vm, parseAppOptions)); }; } +function initCreateSubpackageApp(parseAppOptions) { + return function createApp(vm) { + const appOptions = parseApp(vm, parseAppOptions); + const app = getApp({ + allowDefault: true, + }); + vm.$.ctx.$scope = app; + const globalData = app.globalData; + if (globalData) { + Object.keys(appOptions.globalData).forEach((name) => { + if (!hasOwn(globalData, name)) { + globalData[name] = appOptions.globalData[name]; + } + }); + } + Object.keys(appOptions).forEach((name) => { + if (!hasOwn(app, name)) { + app[name] = appOptions[name]; + } + }); + if (isFunction(appOptions.onShow) && ks.onAppShow) { + ks.onAppShow((args) => { + vm.$callHook('onShow', args); + }); + } + if (isFunction(appOptions.onHide) && ks.onAppHide) { + ks.onAppHide((args) => { + vm.$callHook('onHide', args); + }); + } + if (isFunction(appOptions.onLaunch)) { + const args = ks.getLaunchOptionsSync && ks.getLaunchOptionsSync(); + vm.$callHook('onLaunch', args); + } + return App(appOptions); + }; +} function initLocale(appVm) { const locale = ref(ks.getSystemInfoSync().language || 'zh-Hans'); Object.defineProperty(appVm, '$locale', { @@ -886,9 +923,11 @@ var parseComponentOptions = extend({}, baseParseOptions, { const createApp = initCreateApp(); const createPage = initCreatePage(parsePageOptions); const createComponent = initCreateComponent(parseComponentOptions); +const createSubpackageApp = initCreateSubpackageApp(); ks.EventChannel = EventChannel; ks.createApp = global.createApp = createApp; ks.createPage = createPage; -ks.createComponent = createComponent; +ks.createComponent = createComponent; +ks.createSubpackageApp = createSubpackageApp; -export { createApp, createComponent, createPage }; +export { createApp, createComponent, createPage, createSubpackageApp }; diff --git a/packages/uni-mp-kuaishou/src/runtime/index.ts b/packages/uni-mp-kuaishou/src/runtime/index.ts index ec33897600626ddeb4a5d027bc8cf5cf7705ef85..21af7a5be7c49d6a122ee54c53225a2f5845bad1 100644 --- a/packages/uni-mp-kuaishou/src/runtime/index.ts +++ b/packages/uni-mp-kuaishou/src/runtime/index.ts @@ -3,6 +3,7 @@ import { initCreateApp, initCreatePage, initCreateComponent, + initCreateSubpackageApp, } from '@dcloudio/uni-mp-core' import '@dcloudio/uni-mp-polyfill' @@ -12,7 +13,9 @@ import parseComponentOptions from './parseComponentOptions' export const createApp = initCreateApp() export const createPage = initCreatePage(parsePageOptions) export const createComponent = initCreateComponent(parseComponentOptions) +export const createSubpackageApp = initCreateSubpackageApp() ;(ks as any).EventChannel = EventChannel ;(ks as any).createApp = (global as any).createApp = createApp ;(ks as any).createPage = createPage ;(ks as any).createComponent = createComponent +;(ks as any).createSubpackageApp = createSubpackageApp diff --git a/packages/uni-mp-lark/dist/uni.mp.esm.js b/packages/uni-mp-lark/dist/uni.mp.esm.js index 5d0eb5b0037f7e6483bff250aead1b1472a0f0e0..fb380c9c93eaebb0dff144d2d06dd8f3a44a8fa4 100644 --- a/packages/uni-mp-lark/dist/uni.mp.esm.js +++ b/packages/uni-mp-lark/dist/uni.mp.esm.js @@ -322,6 +322,43 @@ function initCreateApp(parseAppOptions) { return App(parseApp(vm, parseAppOptions)); }; } +function initCreateSubpackageApp(parseAppOptions) { + return function createApp(vm) { + const appOptions = parseApp(vm, parseAppOptions); + const app = getApp({ + allowDefault: true, + }); + vm.$.ctx.$scope = app; + const globalData = app.globalData; + if (globalData) { + Object.keys(appOptions.globalData).forEach((name) => { + if (!hasOwn(globalData, name)) { + globalData[name] = appOptions.globalData[name]; + } + }); + } + Object.keys(appOptions).forEach((name) => { + if (!hasOwn(app, name)) { + app[name] = appOptions[name]; + } + }); + if (isFunction(appOptions.onShow) && tt.onAppShow) { + tt.onAppShow((args) => { + vm.$callHook('onShow', args); + }); + } + if (isFunction(appOptions.onHide) && tt.onAppHide) { + tt.onAppHide((args) => { + vm.$callHook('onHide', args); + }); + } + if (isFunction(appOptions.onLaunch)) { + const args = tt.getLaunchOptionsSync && tt.getLaunchOptionsSync(); + vm.$callHook('onLaunch', args); + } + return App(appOptions); + }; +} function initLocale(appVm) { const locale = ref(tt.getSystemInfoSync().language || 'zh-Hans'); Object.defineProperty(appVm, '$locale', { @@ -961,9 +998,11 @@ var parsePageOptions = /*#__PURE__*/Object.freeze({ const createApp = initCreateApp(); const createPage = initCreatePage(parsePageOptions); const createComponent = initCreateComponent(parseComponentOptions); +const createSubpackageApp = initCreateSubpackageApp(); tt.EventChannel = EventChannel; tt.createApp = global.createApp = createApp; tt.createPage = createPage; -tt.createComponent = createComponent; +tt.createComponent = createComponent; +tt.createSubpackageApp = createSubpackageApp; -export { createApp, createComponent, createPage }; +export { createApp, createComponent, createPage, createSubpackageApp }; diff --git a/packages/uni-mp-lark/src/runtime/index.ts b/packages/uni-mp-lark/src/runtime/index.ts index 7669a5f48913e1a643b3c8cbe480b1b339ad44e1..6864d089d360962195f44e01ae9d18b8608866b9 100644 --- a/packages/uni-mp-lark/src/runtime/index.ts +++ b/packages/uni-mp-lark/src/runtime/index.ts @@ -3,6 +3,7 @@ import { initCreateApp, initCreatePage, initCreateComponent, + initCreateSubpackageApp, } from '@dcloudio/uni-mp-core' import '@dcloudio/uni-mp-polyfill' @@ -13,7 +14,9 @@ import * as parseComponentOptions from '@dcloudio/uni-mp-toutiao/src/runtime/par export const createApp = initCreateApp() export const createPage = initCreatePage(parsePageOptions) export const createComponent = initCreateComponent(parseComponentOptions) +export const createSubpackageApp = initCreateSubpackageApp() ;(tt as any).EventChannel = EventChannel ;(tt as any).createApp = (global as any).createApp = createApp ;(tt as any).createPage = createPage ;(tt as any).createComponent = createComponent +;(tt as any).createSubpackageApp = createSubpackageApp diff --git a/packages/uni-mp-qq/dist/uni.mp.esm.js b/packages/uni-mp-qq/dist/uni.mp.esm.js index 4914bb601ce34f19f66b2195c48f0c4891fc4131..f1f170fdd5bf525c4e04d9603badfdbe4ff2a88b 100644 --- a/packages/uni-mp-qq/dist/uni.mp.esm.js +++ b/packages/uni-mp-qq/dist/uni.mp.esm.js @@ -319,6 +319,43 @@ function initCreateApp(parseAppOptions) { return App(parseApp(vm, parseAppOptions)); }; } +function initCreateSubpackageApp(parseAppOptions) { + return function createApp(vm) { + const appOptions = parseApp(vm, parseAppOptions); + const app = getApp({ + allowDefault: true, + }); + vm.$.ctx.$scope = app; + const globalData = app.globalData; + if (globalData) { + Object.keys(appOptions.globalData).forEach((name) => { + if (!hasOwn(globalData, name)) { + globalData[name] = appOptions.globalData[name]; + } + }); + } + Object.keys(appOptions).forEach((name) => { + if (!hasOwn(app, name)) { + app[name] = appOptions[name]; + } + }); + if (isFunction(appOptions.onShow) && qq.onAppShow) { + qq.onAppShow((args) => { + vm.$callHook('onShow', args); + }); + } + if (isFunction(appOptions.onHide) && qq.onAppHide) { + qq.onAppHide((args) => { + vm.$callHook('onHide', args); + }); + } + if (isFunction(appOptions.onLaunch)) { + const args = qq.getLaunchOptionsSync && qq.getLaunchOptionsSync(); + vm.$callHook('onLaunch', args); + } + return App(appOptions); + }; +} function initLocale(appVm) { const locale = ref(qq.getSystemInfoSync().language || 'zh-Hans'); Object.defineProperty(appVm, '$locale', { @@ -781,13 +818,16 @@ var parseOptions = /*#__PURE__*/Object.freeze({ const createApp = initCreateApp(); const createPage = initCreatePage(parseOptions); const createComponent = initCreateComponent(parseOptions); +const createSubpackageApp = initCreateSubpackageApp(); wx.createApp = global.createApp = createApp; wx.createPage = createPage; -wx.createComponent = createComponent; +wx.createComponent = createComponent; +wx.createSubpackageApp = createSubpackageApp; qq.EventChannel = EventChannel; qq.createApp = global.createApp = createApp; qq.createPage = createPage; -qq.createComponent = createComponent; +qq.createComponent = createComponent; +qq.createSubpackageApp = createSubpackageApp; -export { createApp, createComponent, createPage }; +export { createApp, createComponent, createPage, createSubpackageApp }; diff --git a/packages/uni-mp-qq/src/runtime/index.ts b/packages/uni-mp-qq/src/runtime/index.ts index cf4412a2cfd6dbe965839d9fbcb5386dc43f2b50..bc067da75830469d66b9351588be45781a60c58b 100644 --- a/packages/uni-mp-qq/src/runtime/index.ts +++ b/packages/uni-mp-qq/src/runtime/index.ts @@ -3,6 +3,7 @@ import { createApp, createPage, createComponent, + createSubpackageApp, } from '@dcloudio/uni-mp-weixin/src/runtime' export * from '@dcloudio/uni-mp-weixin/src/runtime' @@ -10,3 +11,4 @@ export * from '@dcloudio/uni-mp-weixin/src/runtime' ;(qq as any).createApp = (global as any).createApp = createApp ;(qq as any).createPage = createPage ;(qq as any).createComponent = createComponent +;(qq as any).createSubpackageApp = createSubpackageApp diff --git a/packages/uni-mp-toutiao/dist/uni.mp.esm.js b/packages/uni-mp-toutiao/dist/uni.mp.esm.js index 8db7d8aca43cb648bf7e8cc75849112117103f31..cb6484f7336d1008625f193ef29c00900cda9992 100644 --- a/packages/uni-mp-toutiao/dist/uni.mp.esm.js +++ b/packages/uni-mp-toutiao/dist/uni.mp.esm.js @@ -322,6 +322,43 @@ function initCreateApp(parseAppOptions) { return App(parseApp(vm, parseAppOptions)); }; } +function initCreateSubpackageApp(parseAppOptions) { + return function createApp(vm) { + const appOptions = parseApp(vm, parseAppOptions); + const app = getApp({ + allowDefault: true, + }); + vm.$.ctx.$scope = app; + const globalData = app.globalData; + if (globalData) { + Object.keys(appOptions.globalData).forEach((name) => { + if (!hasOwn(globalData, name)) { + globalData[name] = appOptions.globalData[name]; + } + }); + } + Object.keys(appOptions).forEach((name) => { + if (!hasOwn(app, name)) { + app[name] = appOptions[name]; + } + }); + if (isFunction(appOptions.onShow) && tt.onAppShow) { + tt.onAppShow((args) => { + vm.$callHook('onShow', args); + }); + } + if (isFunction(appOptions.onHide) && tt.onAppHide) { + tt.onAppHide((args) => { + vm.$callHook('onHide', args); + }); + } + if (isFunction(appOptions.onLaunch)) { + const args = tt.getLaunchOptionsSync && tt.getLaunchOptionsSync(); + vm.$callHook('onLaunch', args); + } + return App(appOptions); + }; +} function initLocale(appVm) { const locale = ref(tt.getSystemInfoSync().language || 'zh-Hans'); Object.defineProperty(appVm, '$locale', { @@ -977,9 +1014,11 @@ var parsePageOptions = /*#__PURE__*/Object.freeze({ const createApp = initCreateApp(); const createPage = initCreatePage(parsePageOptions); const createComponent = initCreateComponent(parseComponentOptions); +const createSubpackageApp = initCreateSubpackageApp(); tt.EventChannel = EventChannel; tt.createApp = global.createApp = createApp; tt.createPage = createPage; -tt.createComponent = createComponent; +tt.createComponent = createComponent; +tt.createSubpackageApp = createSubpackageApp; -export { createApp, createComponent, createPage }; +export { createApp, createComponent, createPage, createSubpackageApp }; diff --git a/packages/uni-mp-toutiao/src/runtime/index.ts b/packages/uni-mp-toutiao/src/runtime/index.ts index ca0f8aba373877162d793941b487f90f834bfdc7..e54e5de6f80558841a57b2abb80e2491c86ce32c 100644 --- a/packages/uni-mp-toutiao/src/runtime/index.ts +++ b/packages/uni-mp-toutiao/src/runtime/index.ts @@ -3,6 +3,7 @@ import { initCreateApp, initCreatePage, initCreateComponent, + initCreateSubpackageApp, } from '@dcloudio/uni-mp-core' import '@dcloudio/uni-mp-polyfill' @@ -13,7 +14,9 @@ import * as parseComponentOptions from './parseComponentOptions' export const createApp = initCreateApp() export const createPage = initCreatePage(parsePageOptions) export const createComponent = initCreateComponent(parseComponentOptions) +export const createSubpackageApp = initCreateSubpackageApp() ;(tt as any).EventChannel = EventChannel ;(tt as any).createApp = (global as any).createApp = createApp ;(tt as any).createPage = createPage ;(tt as any).createComponent = createComponent +;(tt as any).createSubpackageApp = createSubpackageApp diff --git a/packages/uni-mp-vite/src/index.ts b/packages/uni-mp-vite/src/index.ts index 8db22a32842c9f343fcf044575ccc7f0a6e9956b..cbad800c33dd76c266eb153515078fe099bdc505 100644 --- a/packages/uni-mp-vite/src/index.ts +++ b/packages/uni-mp-vite/src/index.ts @@ -1,16 +1,23 @@ import { extend } from '@vue/shared' +import type { SFCScriptCompileOptions } from '@vue/compiler-sfc' import { initProvide, uniViteInjectPlugin } from '@dcloudio/uni-cli-shared' + import { uniMiniProgramPlugin, UniMiniProgramPluginOptions } from './plugin' import { uniUsingComponentsPlugin } from './plugins/usingComponents' import { uniMainJsPlugin } from './plugins/mainJs' import { uniManifestJsonPlugin } from './plugins/manifestJson' import { uniPagesJsonPlugin } from './plugins/pagesJson' import { uniEntryPlugin } from './plugins/entry' -import type { SFCScriptCompileOptions } from '@vue/compiler-sfc' + import { uniRenderjsPlugin } from './plugins/renderjs' +import { uniSubpackagePlugin } from './plugins/subpackage' export { UniMiniProgramPluginOptions } from './plugin' export default (options: UniMiniProgramPluginOptions) => { + if (!options.app.subpackages) { + delete process.env.UNI_SUBPACKAGE + } + return [ (options: { vueOptions?: { script?: Partial } @@ -28,5 +35,6 @@ export default (options: UniMiniProgramPluginOptions) => { }) => { return uniUsingComponentsPlugin(options.vueOptions?.script) }, + ...(process.env.UNI_SUBPACKAGE ? [uniSubpackagePlugin(options)] : []), ] } diff --git a/packages/uni-mp-vite/src/plugin/configResolved.ts b/packages/uni-mp-vite/src/plugin/configResolved.ts index 6312d431a62435d9d09a3466eb5d0e66d475b471..c611c262ba6724df1ba0bfc3b8eb51638aa49245 100644 --- a/packages/uni-mp-vite/src/plugin/configResolved.ts +++ b/packages/uni-mp-vite/src/plugin/configResolved.ts @@ -10,6 +10,7 @@ import { removeExt, transformScopedCss, normalizeMiniProgramFilename, + relativeFile, } from '@dcloudio/uni-cli-shared' import { UniMiniProgramPluginOptions } from '.' import { getNVueCssPaths } from '../plugins/pagesJson' @@ -67,7 +68,10 @@ export function createConfigResolved({ const normalized = normalizePath(filename) if (nvueCssPaths.find((pageCssPath) => pageCssPath === normalized)) { debugNVueCss(normalized) - return `@import "/nvue${extname}";\n` + cssCode + return ( + `@import "${relativeFile(normalized, 'nvue' + extname)}";\n` + + cssCode + ) } return cssCode }, diff --git a/packages/uni-mp-vite/src/plugins/subpackage.ts b/packages/uni-mp-vite/src/plugins/subpackage.ts new file mode 100644 index 0000000000000000000000000000000000000000..9f093d8d8624237aa3291b99937c14ed0f692fcc --- /dev/null +++ b/packages/uni-mp-vite/src/plugins/subpackage.ts @@ -0,0 +1,36 @@ +import { OutputAsset, OutputChunk } from 'rollup' +import type { Plugin } from 'vite' +import { isPageFile, relativeFile } from '@dcloudio/uni-cli-shared' +import { UniMiniProgramPluginOptions } from '../plugin' + +export function uniSubpackagePlugin({ + style: { extname }, +}: UniMiniProgramPluginOptions): Plugin { + return { + name: 'vite:uni-mp-subpackage', + enforce: 'post', + generateBundle(_, bundle) { + ;['project.config.json', 'app.json'].forEach((name) => { + delete bundle[name] + }) + const appJsFile = 'app.js' + const appCssFile = 'app' + extname + Object.keys(bundle).forEach((name) => { + if (!isPageFile(name)) { + return + } + // 仅页面级 wxss 需要补充 app.wxss + if (name.endsWith(extname)) { + const cssFile = bundle[name] as OutputAsset + cssFile.source = + `@import "${relativeFile(name, appCssFile)}";\n` + + cssFile.source.toString() + } else if (name.endsWith('.js')) { + const jsFile = bundle[name] as OutputChunk + jsFile.code = + `require('${relativeFile(name, appJsFile)}');\n` + jsFile.code + } + }) + }, + } +} diff --git a/packages/uni-mp-vue/dist/vue.runtime.esm.js b/packages/uni-mp-vue/dist/vue.runtime.esm.js index 4aa9de6c71cd5752874834e322723cd164bf98f2..f9669e1e709a53ae4cfb9a5e08f748b2f5991c77 100644 --- a/packages/uni-mp-vue/dist/vue.runtime.esm.js +++ b/packages/uni-mp-vue/dist/vue.runtime.esm.js @@ -4898,12 +4898,15 @@ var plugin = { }, }; function getCreateApp() { + const method = process.env.UNI_SUBPACKAGE + ? 'createSubpackageApp' + : 'createApp'; if (typeof global !== 'undefined') { - return global.createApp; + return global[method]; } else if (typeof my !== 'undefined') { // 支付宝小程序没有global - return my.createApp; + return my[method]; } } diff --git a/packages/uni-mp-vue/src/plugin.ts b/packages/uni-mp-vue/src/plugin.ts index de3f69772bfdc42751664e605700a65d6e719f14..11026bd39f719d2649d5b4d2ea2c67cf3a364e07 100644 --- a/packages/uni-mp-vue/src/plugin.ts +++ b/packages/uni-mp-vue/src/plugin.ts @@ -28,10 +28,13 @@ export default { } function getCreateApp() { + const method = process.env.UNI_SUBPACKAGE + ? 'createSubpackageApp' + : 'createApp' if (typeof global !== 'undefined') { - return (global as any).createApp + return (global as any)[method] } else if (typeof my !== 'undefined') { // 支付宝小程序没有global - return (my as any).createApp + return (my as any)[method] } } diff --git a/packages/uni-mp-weixin/dist/uni.mp.esm.js b/packages/uni-mp-weixin/dist/uni.mp.esm.js index ef694ae9d308c7191f67609626d9915446123539..a5cbdf389e6c7bb16536119944c0ffd40881587c 100644 --- a/packages/uni-mp-weixin/dist/uni.mp.esm.js +++ b/packages/uni-mp-weixin/dist/uni.mp.esm.js @@ -256,6 +256,43 @@ function initCreateApp(parseAppOptions) { return App(parseApp(vm, parseAppOptions)); }; } +function initCreateSubpackageApp(parseAppOptions) { + return function createApp(vm) { + const appOptions = parseApp(vm, parseAppOptions); + const app = getApp({ + allowDefault: true, + }); + vm.$.ctx.$scope = app; + const globalData = app.globalData; + if (globalData) { + Object.keys(appOptions.globalData).forEach((name) => { + if (!hasOwn(globalData, name)) { + globalData[name] = appOptions.globalData[name]; + } + }); + } + Object.keys(appOptions).forEach((name) => { + if (!hasOwn(app, name)) { + app[name] = appOptions[name]; + } + }); + if (isFunction(appOptions.onShow) && wx.onAppShow) { + wx.onAppShow((args) => { + vm.$callHook('onShow', args); + }); + } + if (isFunction(appOptions.onHide) && wx.onAppHide) { + wx.onAppHide((args) => { + vm.$callHook('onHide', args); + }); + } + if (isFunction(appOptions.onLaunch)) { + const args = wx.getLaunchOptionsSync && wx.getLaunchOptionsSync(); + vm.$callHook('onLaunch', args); + } + return App(appOptions); + }; +} function initLocale(appVm) { const locale = ref(wx.getSystemInfoSync().language || 'zh-Hans'); Object.defineProperty(appVm, '$locale', { @@ -721,8 +758,10 @@ var parseOptions = /*#__PURE__*/Object.freeze({ const createApp = initCreateApp(); const createPage = initCreatePage(parseOptions); const createComponent = initCreateComponent(parseOptions); +const createSubpackageApp = initCreateSubpackageApp(); wx.createApp = global.createApp = createApp; wx.createPage = createPage; -wx.createComponent = createComponent; +wx.createComponent = createComponent; +wx.createSubpackageApp = createSubpackageApp; -export { createApp, createComponent, createPage }; +export { createApp, createComponent, createPage, createSubpackageApp }; diff --git a/packages/uni-mp-weixin/src/runtime/index.ts b/packages/uni-mp-weixin/src/runtime/index.ts index 386abf4040cc615ecd52e374ce627bf3654414a3..f6f006e11788f2b482299e99062287e9b6661d5a 100644 --- a/packages/uni-mp-weixin/src/runtime/index.ts +++ b/packages/uni-mp-weixin/src/runtime/index.ts @@ -2,6 +2,7 @@ import { initCreateApp, initCreatePage, initCreateComponent, + initCreateSubpackageApp, } from '@dcloudio/uni-mp-core' import '@dcloudio/uni-mp-polyfill' @@ -11,6 +12,8 @@ import * as parseOptions from './parseOptions' export const createApp = initCreateApp() export const createPage = initCreatePage(parseOptions) export const createComponent = initCreateComponent(parseOptions) +export const createSubpackageApp = initCreateSubpackageApp() ;(wx as any).createApp = (global as any).createApp = createApp ;(wx as any).createPage = createPage ;(wx as any).createComponent = createComponent +;(wx as any).createSubpackageApp = createSubpackageApp diff --git a/packages/uni-quickapp-webview/dist/uni.mp.esm.js b/packages/uni-quickapp-webview/dist/uni.mp.esm.js index 10a4dd297af16894a2980ddf755acd0355cf9c22..6eff2933a7b62a716c9f2310f4f859853f67b11f 100644 --- a/packages/uni-quickapp-webview/dist/uni.mp.esm.js +++ b/packages/uni-quickapp-webview/dist/uni.mp.esm.js @@ -319,6 +319,43 @@ function initCreateApp(parseAppOptions) { return App(parseApp(vm, parseAppOptions)); }; } +function initCreateSubpackageApp(parseAppOptions) { + return function createApp(vm) { + const appOptions = parseApp(vm, parseAppOptions); + const app = getApp({ + allowDefault: true, + }); + vm.$.ctx.$scope = app; + const globalData = app.globalData; + if (globalData) { + Object.keys(appOptions.globalData).forEach((name) => { + if (!hasOwn(globalData, name)) { + globalData[name] = appOptions.globalData[name]; + } + }); + } + Object.keys(appOptions).forEach((name) => { + if (!hasOwn(app, name)) { + app[name] = appOptions[name]; + } + }); + if (isFunction(appOptions.onShow) && qa.onAppShow) { + qa.onAppShow((args) => { + vm.$callHook('onShow', args); + }); + } + if (isFunction(appOptions.onHide) && qa.onAppHide) { + qa.onAppHide((args) => { + vm.$callHook('onHide', args); + }); + } + if (isFunction(appOptions.onLaunch)) { + const args = qa.getLaunchOptionsSync && qa.getLaunchOptionsSync(); + vm.$callHook('onLaunch', args); + } + return App(appOptions); + }; +} function initLocale(appVm) { const locale = ref(qa.getSystemInfoSync().language || 'zh-Hans'); Object.defineProperty(appVm, '$locale', { @@ -941,9 +978,11 @@ var parsePageOptions = /*#__PURE__*/Object.freeze({ const createApp = initCreateApp(); const createPage = initCreatePage(parsePageOptions); const createComponent = initCreateComponent(parseComponentOptions); +const createSubpackageApp = initCreateSubpackageApp(); qa.EventChannel = EventChannel; qa.createApp = global.createApp = createApp; qa.createPage = createPage; -qa.createComponent = createComponent; +qa.createComponent = createComponent; +qa.createSubpackageApp = createSubpackageApp; -export { createApp, createComponent, createPage }; +export { createApp, createComponent, createPage, createSubpackageApp }; diff --git a/packages/uni-quickapp-webview/src/runtime/index.ts b/packages/uni-quickapp-webview/src/runtime/index.ts index 6055dc62f8df4144146de82f99eaa82113356f15..842ea5d16e514a92a443a03bdeb2ecd4df20b06c 100644 --- a/packages/uni-quickapp-webview/src/runtime/index.ts +++ b/packages/uni-quickapp-webview/src/runtime/index.ts @@ -3,6 +3,7 @@ import { initCreateApp, initCreatePage, initCreateComponent, + initCreateSubpackageApp, } from '@dcloudio/uni-mp-core' import '@dcloudio/uni-mp-polyfill' @@ -13,7 +14,9 @@ import * as parseComponentOptions from './parseComponentOptions' export const createApp = initCreateApp() export const createPage = initCreatePage(parsePageOptions) export const createComponent = initCreateComponent(parseComponentOptions) +export const createSubpackageApp = initCreateSubpackageApp() ;(qa as any).EventChannel = EventChannel ;(qa as any).createApp = (global as any).createApp = createApp ;(qa as any).createPage = createPage ;(qa as any).createComponent = createComponent +;(qa as any).createSubpackageApp = createSubpackageApp diff --git a/packages/vite-plugin-uni/src/cli/index.ts b/packages/vite-plugin-uni/src/cli/index.ts index 15e537f956ead0a87007a48e94e46bdfb5f3ecdd..e6bb00f92f63d36a0494ab85e553aa4263b1bd63 100644 --- a/packages/vite-plugin-uni/src/cli/index.ts +++ b/packages/vite-plugin-uni/src/cli/index.ts @@ -23,6 +23,7 @@ export interface CliOptions { clearScreen?: boolean autoHost?: string autoPort?: number + subpackage?: string } cli @@ -36,8 +37,9 @@ cli .option('--clearScreen', `[boolean] allow/disable clear screen when logging`) .option('-d, --debug [feat]', `[string | boolean] show debug logs`) .option('-f, --filter ', `[string] filter debug logs`) - .option('--autoHost', `[string] specify automator hostname`) - .option('--autoPort', `[number] specify automator port`) + .option('--autoHost [autoHost]', `[string] specify automator hostname`) + .option('--autoPort [autoPort]', `[number] specify automator port`) + .option('--subpackage [subpackage]', `[string] specify subpackage to build`) cli .command('') diff --git a/packages/vite-plugin-uni/src/cli/utils.ts b/packages/vite-plugin-uni/src/cli/utils.ts index 3cd7346b0d9a7b05bf69e5baade1e8deb57f3e93..ccb71785c21dfca89dfe0a342b04aed73b6d9f3d 100644 --- a/packages/vite-plugin-uni/src/cli/utils.ts +++ b/packages/vite-plugin-uni/src/cli/utils.ts @@ -89,6 +89,12 @@ export function initEnv(type: 'dev' | 'build', options: CliOptions) { process.env.UNI_OUTPUT_DIR = (options as BuildOptions).outDir! } + if (options.subpackage) { + process.env.UNI_SUBPACKAGE = options.subpackage + process.env.UNI_OUTPUT_DIR = (options as BuildOptions).outDir = + path.resolve(process.env.UNI_OUTPUT_DIR, options.subpackage) + } + initAutomator(options) if (process.env.NODE_ENV === 'production') { @@ -122,7 +128,8 @@ export function initEnv(type: 'dev' | 'build', options: CliOptions) { } function initAutomator({ autoHost, autoPort }: CliOptions) { - if (!autoPort) { + // 发行分包也不需要自动化测试 + if (!autoPort || process.env.UNI_SUBPACKAGE) { return } process.env.UNI_AUTOMATOR_WS_ENDPOINT =