diff --git a/packages/uni-app-plus/dist/index.js b/packages/uni-app-plus/dist/index.js index 04ac6a510c1277295323b7f941ccb0207fc14020..c2c339734d914d46b5262c25817a09116c73a85e 100644 --- a/packages/uni-app-plus/dist/index.js +++ b/packages/uni-app-plus/dist/index.js @@ -21,7 +21,7 @@ function hasOwn (obj, key) { function noop () {} -const SYNC_API_RE = /hideKeyboard|upx2px|canIUse|^create|Sync$|Manager$/; +const SYNC_API_RE = /requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$/; const CONTEXT_API_RE = /^create|Manager$/; @@ -228,35 +228,6 @@ TODOS.forEach(function (name) { todoApis[name] = createTodoApi(name); }); -var providers = {}; - -function getProvider ({ - service, - success, - fail, - complete -}) { - let res = false; - if (providers[service]) { - res = { - errMsg: 'getProvider:ok', - service, - provider: providers[service] - }; - isFn(success) && success(res); - } else { - res = { - errMsg: 'getProvider:fail:服务[' + service + ']不存在' - }; - isFn(fail) && fail(res); - } - isFn(complete) && complete(res); -} - -var extraApi = /*#__PURE__*/Object.freeze({ - getProvider: getProvider -}); - function requireNativePlugin (pluginName) { /* eslint-disable no-undef */ return __requireNativePlugin__(pluginName) @@ -289,13 +260,13 @@ function initHooks (mpOptions, hooks, delay = false) { }); } -function getData (vueOptions) { +function getData (vueOptions, context) { let data = vueOptions.data || {}; const methods = vueOptions.methods || {}; if (typeof data === 'function') { try { - data = data(); + data = data.call(context); // 支持 Vue.prototype 上挂的数据 } catch (e) { if (process.env.VUE_APP_DEBUG) { console.warn('根据 Vue 的 data 函数初始化小程序 data 失败,请尽量确保 data 函数中不访问 vm 对象,否则可能影响首次数据渲染速度。', data); @@ -561,7 +532,7 @@ const hooks$1 = [ function createPage (vueOptions) { vueOptions = vueOptions.default || vueOptions; const pageOptions = { - data: getData(vueOptions), + data: getData(vueOptions, Vue.prototype), onLoad (args) { this.$vm = new Vue(Object.assign(vueOptions, { @@ -570,7 +541,7 @@ function createPage (vueOptions) { })); this.$vm.__call_hook('created'); - this.$vm.__call_hook('onLoad', args); // 开发者一般可能会在 onLoad 时赋值,所以提前到 mount 之前 + this.$vm.__call_hook('onLoad', args); // 开发者可能会在 onLoad 时赋值,提前到 mount 之前 this.$vm.$mount(); }, onReady () { @@ -615,6 +586,9 @@ function initVueComponent (mpInstace, VueComponent, extraOptions = {}) { }); mpInstace.$vm.$scopedSlots = mpInstace.$vm.$slots = $slots; } + // 性能优先,mount 提前到 attached 中,保证组件首次渲染数据被合并 + // 导致与标准 Vue 的差异,data 和 computed 中不能使用$parent,provide等组件属性 + mpInstace.$vm.$mount(); } function createComponent (vueOptions) { @@ -629,7 +603,7 @@ function createComponent (vueOptions) { multipleSlots: true, addGlobalClass: true }, - data: getData(vueOptions), + data: getData(vueOptions, Vue.prototype), properties, lifetimes: { attached () { @@ -639,9 +613,9 @@ function createComponent (vueOptions) { initVueComponent(this, VueComponent); // 目前发现部分情况小程序 attached 不触发 triggerLink(this); // 处理 parent,children - // 初始化渲染数据(需要等 parent,inject 都初始化完成,否则可以放到 attached 里边初始化渲染) + // 补充生命周期 this.$vm.__call_hook('created'); - this.$vm.$mount(); + this.$vm.__call_hook('beforeMount'); this.$vm._isMounted = true; this.$vm.__call_hook('mounted'); this.$vm.__call_hook('onReady'); @@ -680,13 +654,7 @@ if (typeof Proxy !== 'undefined') { } if (api[name]) { return promisify(name, api[name]) - } - if (extraApi[name]) { - return promisify(name, extraApi[name]) - } - if (todoApis[name]) { - return promisify(name, todoApis[name]) - } + } if (!hasOwn(wx, name) && !hasOwn(protocols, name)) { return } @@ -696,14 +664,6 @@ if (typeof Proxy !== 'undefined') { } else { uni.upx2px = upx2px; - Object.keys(todoApis).forEach(name => { - uni[name] = promisify(name, todoApis[name]); - }); - - Object.keys(extraApi).forEach(name => { - uni[name] = promisify(name, todoApis[name]); - }); - Object.keys(api).forEach(name => { uni[name] = promisify(name, api[name]); }); diff --git a/packages/uni-app-plus/package.json b/packages/uni-app-plus/package.json index 38f703d14b71c4140931085c2307783b2ad3006a..ff80ef4feebafdb4d10d1eb4780f667602d79ddb 100644 --- a/packages/uni-app-plus/package.json +++ b/packages/uni-app-plus/package.json @@ -1,6 +1,6 @@ { "name": "@dcloudio/uni-app-plus", - "version": "0.0.202", + "version": "0.0.204", "description": "uni-app app-plus", "main": "dist/index.js", "scripts": { diff --git a/packages/uni-mp-weixin/dist/index.js b/packages/uni-mp-weixin/dist/index.js index 22abfae23ec1ae2c518717d4738e16742ee3f6fb..420d96608eb6f347183db1932a77d775f5cd91fb 100644 --- a/packages/uni-mp-weixin/dist/index.js +++ b/packages/uni-mp-weixin/dist/index.js @@ -21,7 +21,7 @@ function hasOwn (obj, key) { function noop () {} -const SYNC_API_RE = /hideKeyboard|upx2px|canIUse|^create|Sync$|Manager$/; +const SYNC_API_RE = /requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$/; const CONTEXT_API_RE = /^create|Manager$/; @@ -291,13 +291,13 @@ function initHooks (mpOptions, hooks, delay = false) { }); } -function getData (vueOptions) { +function getData (vueOptions, context) { let data = vueOptions.data || {}; const methods = vueOptions.methods || {}; if (typeof data === 'function') { try { - data = data(); + data = data.call(context); // 支持 Vue.prototype 上挂的数据 } catch (e) { if (process.env.VUE_APP_DEBUG) { console.warn('根据 Vue 的 data 函数初始化小程序 data 失败,请尽量确保 data 函数中不访问 vm 对象,否则可能影响首次数据渲染速度。', data); @@ -563,7 +563,7 @@ const hooks$1 = [ function createPage (vueOptions) { vueOptions = vueOptions.default || vueOptions; const pageOptions = { - data: getData(vueOptions), + data: getData(vueOptions, Vue.prototype), onLoad (args) { this.$vm = new Vue(Object.assign(vueOptions, { @@ -572,7 +572,7 @@ function createPage (vueOptions) { })); this.$vm.__call_hook('created'); - this.$vm.__call_hook('onLoad', args); // 开发者一般可能会在 onLoad 时赋值,所以提前到 mount 之前 + this.$vm.__call_hook('onLoad', args); // 开发者可能会在 onLoad 时赋值,提前到 mount 之前 this.$vm.$mount(); }, onReady () { @@ -634,7 +634,7 @@ function createComponent (vueOptions) { multipleSlots: true, addGlobalClass: true }, - data: getData(vueOptions), + data: getData(vueOptions, Vue.prototype), properties, lifetimes: { attached () { @@ -685,9 +685,11 @@ if (typeof Proxy !== 'undefined') { } if (api[name]) { return promisify(name, api[name]) - } - if (extraApi[name]) { - return promisify(name, extraApi[name]) + } + { + if (extraApi[name]) { + return promisify(name, extraApi[name]) + } } if (todoApis[name]) { return promisify(name, todoApis[name]) @@ -704,10 +706,12 @@ if (typeof Proxy !== 'undefined') { Object.keys(todoApis).forEach(name => { uni[name] = promisify(name, todoApis[name]); }); - - Object.keys(extraApi).forEach(name => { - uni[name] = promisify(name, todoApis[name]); - }); + + { + Object.keys(extraApi).forEach(name => { + uni[name] = promisify(name, todoApis[name]); + }); + } Object.keys(api).forEach(name => { uni[name] = promisify(name, api[name]); diff --git a/packages/uni-mp-weixin/package.json b/packages/uni-mp-weixin/package.json index b76cd9703a2229f5b1cbcdc1a5fcc2a7c60ae1f9..48e49b7bed96f3fbbfaf263eb939a4d996a52ea7 100644 --- a/packages/uni-mp-weixin/package.json +++ b/packages/uni-mp-weixin/package.json @@ -1,6 +1,6 @@ { "name": "@dcloudio/uni-mp-weixin", - "version": "0.0.913", + "version": "0.0.914", "description": "uni-app mp-weixin", "main": "dist/index.js", "scripts": { diff --git a/src/core/helpers/promise.js b/src/core/helpers/promise.js index b431dae4c496f0fdc9ab3393a4d7edb347396e9e..687b6655bccc51fba2a27bc380ede6dd90f13889 100644 --- a/src/core/helpers/promise.js +++ b/src/core/helpers/promise.js @@ -2,7 +2,7 @@ import { isFn } from 'uni-shared' -const SYNC_API_RE = /hideKeyboard|upx2px|canIUse|^create|Sync$|Manager$/ +const SYNC_API_RE = /requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$/ const CONTEXT_API_RE = /^create|Manager$/ diff --git a/src/core/runtime/index.js b/src/core/runtime/index.js index fc905efca76ece9107f9de054e191007ac7777d2..8a4538ed5b1908d958d66d5ba6ed62283a3c811d 100644 --- a/src/core/runtime/index.js +++ b/src/core/runtime/index.js @@ -13,8 +13,8 @@ import { import wrapper from './wrapper' import todoApi from './todo' - -import * as extraApi from './extra' + +import * as extraApi from './extra' import * as api from 'uni-platform/service/api/index.js' @@ -30,12 +30,14 @@ if (typeof Proxy !== 'undefined') { } if (api[name]) { return promisify(name, api[name]) - } - if (extraApi[name]) { - return promisify(name, extraApi[name]) - } - if (todoApi[name]) { - return promisify(name, todoApi[name]) + } + if (__PLATFORM__ !== 'app-plus') { + if (extraApi[name]) { + return promisify(name, extraApi[name]) + } + if (todoApi[name]) { + return promisify(name, todoApi[name]) + } } if (!hasOwn(__GLOBAL__, name) && !hasOwn(protocols, name)) { return @@ -46,13 +48,14 @@ if (typeof Proxy !== 'undefined') { } else { uni.upx2px = upx2px - Object.keys(todoApi).forEach(name => { - uni[name] = promisify(name, todoApi[name]) - }) - - Object.keys(extraApi).forEach(name => { - uni[name] = promisify(name, todoApi[name]) - }) + if (__PLATFORM__ !== 'app-plus') { + Object.keys(todoApi).forEach(name => { + uni[name] = promisify(name, todoApi[name]) + }) + Object.keys(extraApi).forEach(name => { + uni[name] = promisify(name, todoApi[name]) + }) + } Object.keys(api).forEach(name => { uni[name] = promisify(name, api[name]) diff --git a/src/core/runtime/wrapper/create-component.js b/src/core/runtime/wrapper/create-component.js index 8d8d76de008bccd9ed0c458f065feec40338677b..43cc4c83d810c784a14060532a003ebc6d93f775 100644 --- a/src/core/runtime/wrapper/create-component.js +++ b/src/core/runtime/wrapper/create-component.js @@ -50,7 +50,7 @@ export function createComponent (vueOptions) { multipleSlots: true, addGlobalClass: true }, - data: getData(vueOptions), + data: getData(vueOptions, Vue.prototype), properties, lifetimes: { attached () { diff --git a/src/core/runtime/wrapper/create-page.js b/src/core/runtime/wrapper/create-page.js index e703ad2c6019ee08f5247741bf9d711c19cb809e..721082dbfd530a4bc3820212acb69b8c0cf5a761 100644 --- a/src/core/runtime/wrapper/create-page.js +++ b/src/core/runtime/wrapper/create-page.js @@ -30,7 +30,7 @@ const hooks = [ export function createPage (vueOptions) { vueOptions = vueOptions.default || vueOptions const pageOptions = { - data: getData(vueOptions), + data: getData(vueOptions, Vue.prototype), onLoad (args) { if (__PLATFORM__ === 'mp-baidu') { this.$baiduComponentInstances = Object.create(null) @@ -42,7 +42,7 @@ export function createPage (vueOptions) { })) this.$vm.__call_hook('created') - this.$vm.__call_hook('onLoad', args) // 开发者一般可能会在 onLoad 时赋值,所以提前到 mount 之前 + this.$vm.__call_hook('onLoad', args) // 开发者可能会在 onLoad 时赋值,提前到 mount 之前 this.$vm.$mount() }, onReady () { diff --git a/src/core/runtime/wrapper/util.js b/src/core/runtime/wrapper/util.js index 52d82b53e6c1592e299a60b48af4239e37da7dd5..2da9d61f86e6e93e75d739a389d0f50db4af5c91 100644 --- a/src/core/runtime/wrapper/util.js +++ b/src/core/runtime/wrapper/util.js @@ -28,13 +28,13 @@ export function initHooks (mpOptions, hooks, delay = false) { }) } -export function getData (vueOptions) { +export function getData (vueOptions, context) { let data = vueOptions.data || {} const methods = vueOptions.methods || {} if (typeof data === 'function') { try { - data = data() + data = data.call(context) // 支持 Vue.prototype 上挂的数据 } catch (e) { if (process.env.VUE_APP_DEBUG) { console.warn('根据 Vue 的 data 函数初始化小程序 data 失败,请尽量确保 data 函数中不访问 vm 对象,否则可能影响首次数据渲染速度。', data) diff --git a/src/platforms/app-plus/service/api/require-native-plugin.js b/src/platforms/app-plus/service/api/require-native-plugin.js new file mode 100644 index 0000000000000000000000000000000000000000..4e07387c4bac1b0e9d98dc737fd1e0677f0cf287 --- /dev/null +++ b/src/platforms/app-plus/service/api/require-native-plugin.js @@ -0,0 +1,4 @@ +export default function requireNativePlugin (pluginName) { + /* eslint-disable no-undef */ + return __requireNativePlugin__(pluginName) +}