提交 31e9a94b 编写于 作者: fxy060608's avatar fxy060608

Merge branch 'dev' of https://github.com/dcloudio/uni-app into alpha

# Conflicts:
#	packages/uni-h5/dist/index.umd.min.js
#	packages/uni-quickapp-native/dist/vue.dev.js
#	packages/uni-quickapp-native/dist/vue.prod.js
......@@ -23,11 +23,11 @@ let pluginDir = process.argv[2]
if (!pluginDir) {
console.error('缺少参数')
process.exit(0)
}
if (pluginDir.indexOf('/') === -1) {
pluginDir = path.resolve(__dirname, '../packages/uni-' + pluginDir)
}
}
if (pluginDir.indexOf('/') === -1) {
pluginDir = path.resolve(__dirname, '../packages/uni-' + pluginDir)
}
const pkg = require(path.join(pluginDir, 'package.json'))
if (!pkg['uni-app']) {
......@@ -47,9 +47,19 @@ service.webpackRawConfigFns.push(function () {
},
module: {
rules: [{
test: path.resolve(__dirname, '../src/core/view/components/index.js'),
use: [{
loader: path.resolve(__dirname, '../lib/extends-component-loader'),
options: {
extends: path.resolve(pluginDir, 'src/view/components'),
base: path.resolve(__dirname, '../src/core/view/components'),
platform: path.resolve(__dirname, '../src/platforms/h5/view/components')
}
}]
}, {
test: path.resolve(__dirname, '../src/platforms/h5/service/api/index.js'),
use: [{
loader: path.resolve(__dirname, '../lib/extends-loader'),
loader: path.resolve(__dirname, '../lib/extends-api-loader'),
options: {
extends: path.resolve(pluginDir, 'src/service/api'),
base: path.resolve(__dirname, '../src/platforms/h5/service/api')
......
......@@ -7,8 +7,10 @@
**属性说明**
|属性名|类型|说明|平台差异说明|
|:-|:-|:-|:|
|:-|:-|:-|:-|
|src|String|webview 指向网页的链接| |
|allow|String|用于为 [iframe](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/iframe) 指定其[特征策略](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/策略特征)|H5|
|sandbox|String|该属性对呈现在 [iframe](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/iframe) 框架中的内容启用一些额外的限制条件。|H5|
|webview-styles|Object|webview 的样式|App|
|@message|EventHandler|网页向应用 `postMessage` 时,会在特定时机(后退、组件销毁、分享)触发并收到消息。|H5 暂不支持|
......
......@@ -206,7 +206,9 @@ const third = [
'setPageMeta',
'onNativeEventReceive',
'sendNativeEvent',
'preloadPage'
'preloadPage',
'unPreloadPage',
'loadSubPackage'
]
const ad = [
......
const fs = require('fs')
const path = require('path')
const glob = require('glob')
const loaderUtils = require('loader-utils')
const isWin = /^win/.test(process.platform)
const normalizePath = path => (isWin ? path.replace(/\\/g, '/') : path)
module.exports = function loader(source) {
const options = loaderUtils.getOptions(this)
const baseDir = options['base']
const platformDir = options['platform']
const extendsDir = options['extends']
const components = []
const extendsFiles = []
// extends目录均导出
glob.sync('**/index.vue', {
cwd: extendsDir
}).forEach(file => {
extendsFiles.push(file)
components.push(normalizePath(path.join(extendsDir, file)))
})
//base目录中有,extends无的导出
glob.sync('**/index.vue', {
cwd: baseDir
}).forEach(file => {
if (!extendsFiles.includes(file)) {
components.push(normalizePath(path.join(baseDir, file)))
}
})
//platform目录中有,extends无的导出
glob.sync('**/index.vue', {
cwd: platformDir
}).forEach(file => {
if (!extendsFiles.includes(file)) {
components.push(normalizePath(path.join(platformDir, file)))
}
})
const componentsCode = components.map(component => {
return `require('${component}').default`
}).join(',')
return `
import Vue from 'vue'
import baseMixin from 'uni-mixins/base'
import animation from 'uni-mixins/animation'
[${componentsCode}].forEach(component=>{
component.mixins = component.mixins ? [].concat(baseMixin, component.mixins) : [baseMixin]
component.mixins.push(animation)
component.name = 'VUni' + component.name
component.isReserved = true
Vue.component(component.name, component)
})
`
}
......@@ -12,4 +12,4 @@ MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
function e(){for(var e=0,t=0,r=arguments.length;t<r;t++)e+=arguments[t].length;var n=Array(e),o=0;for(t=0;t<r;t++)for(var u=arguments[t],i=0,c=u.length;i<c;i++,o++)n[o]=u[i];return n}var t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto),r=new Uint8Array(16);function n(){if(!t)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return t(r)}for(var o=[],u=0;u<256;++u)o[u]=(u+256).toString(16).substr(1);function i(e,t,r){var u=t&&r||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var i=(e=e||{}).random||(e.rng||n)();if(i[6]=15&i[6]|64,i[8]=63&i[8]|128,t)for(var c=0;c<16;++c)t[u+c]=i[c];return t||function(e,t){var r=t||0,n=o;return[n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]]].join("")}(i)}var c=Object.prototype.hasOwnProperty,a=Array.isArray,s=function(e){var t=Object.create(null);return function(r){return t[r]||(t[r]=e(r))}},l=/-(\w)/g,f=s((function(e){return e.replace(l,(function(e,t){return t?t.toUpperCase():""}))})),p=s((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),g=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;function d(e,t){if(a(e))return e;if(t&&(r=t,n=e,c.call(r,n)))return[e];var r,n,o=[];return e.replace(g,(function(e,t,r,n){return o.push(r?n.replace(/\\(\\)?/g,"$1"):t||e),n})),o}function m(e,t){var r,n=d(t,e);for(r=n.shift();null!=r;){if(null==(e=e[r]))return;r=n.shift()}return e}var v=new Map;function h(e){if(!function(e){if(e){var t=e.tagName;return 0===t.indexOf("UNI-")||"BODY"===t}return!1}(e))throw Error("no such element");var t,r,n={elementId:(t=e,r=t._id,r||(r=i(),t._id=r,v.set(r,{id:r,element:t})),r),tagName:e.tagName.toLocaleLowerCase().replace("uni-","")},o=e.__vue__;return o.$parent&&o.$parent.$el===e&&(o=o.$parent),o&&!o.$options.isReserved&&(n.nodeId=function(e){if(e._$weex)return e._uid;if(e._$id)return e._$id;var t=function(e){for(var t=e.$parent;t;){if(t._$id)return t;t=t.$parent}}(e);if(!e.$parent)return"-1";var r=e.$vnode,n=r.context;return n&&n!==t&&n._$id?n._$id+";"+t._$id+","+r.data.attrs._i:t._$id+","+r.data.attrs._i}(o)),"video"===n.tagName&&(n.videoId=n.nodeId),n}var _={input:{input:function(e,t){var r=e.__vue__;r.valueSync=t,r.$triggerInput({},{value:t})}},textarea:{input:function(e,t){var r=e.__vue__;r.valueSync=t,r.$triggerInput({},{value:t})}},"scroll-view":{scrollTo:function(e,t,r){var n=e.__vue__.$refs.main;n.scrollLeft=t,n.scrollTop=r},scrollTop:function(e){return e.__vue__.$refs.main.scrollTop},scrollLeft:function(e){return e.__vue__.$refs.main.scrollLeft},scrollWidth:function(e){return e.__vue__.$refs.main.scrollWidth},scrollHeight:function(e){return e.__vue__.$refs.main.scrollHeight}},swiper:{swipeTo:function(e,t){e.__vue__.current=t}},"movable-view":{moveTo:function(e,t,r){e.__vue__._animationTo(t,r)}},switch:{tap:function(e){e.click()}},slider:{slideTo:function(e,t){var r=e.__vue__,n=r.$refs["uni-slider"],o=n.offsetWidth,u=n.getBoundingClientRect().left;r.value=t,r._onClick({x:(t-r.min)*o/(r.max-r.min)+u})}}},y={getWindow:function(e){return window},getDocument:function(e){return document},getEl:function(e){var t=v.get(e);if(!t)throw Error("element destroyed");return t.element},getOffset:function(e){var t=e.getBoundingClientRect();return Promise.resolve({left:t.left+window.pageXOffset,top:t.top+window.pageYOffset})},querySelector:function(e,t){return Promise.resolve(h(e.querySelector(t)))},querySelectorAll:function(e,t){var r=[],n=document.querySelectorAll(t);return[].forEach.call(n,(function(e){try{r.push(h(e))}catch(e){}})),Promise.resolve({elements:r})},queryProperties:function(e,t){return Promise.resolve({properties:t.map((function(t){var r=m(e,t);return"document.documentElement.scrollTop"===t&&0===r&&(r=m(e,"document.body.scrollTop")),r}))})},queryAttributes:function(e,t){return Promise.resolve({attributes:t.map((function(t){return String(e.getAttribute(t))}))})},queryStyles:function(e,t){var r=getComputedStyle(e);return Promise.resolve({styles:t.map((function(e){return r[e]}))})},queryHTML:function(e,t){return Promise.resolve({html:(r="outer"===t?e.outerHTML:e.innerHTML,r.replace(/\n/g,"").replace(/(<uni-text[^>]*>)(<span[^>]*>[^<]*<\/span>)(.*?<\/uni-text>)/g,"$1$3").replace(/<\/?[^>]*>/g,(function(e){return-1<e.indexOf("<body")?"<page>":"</body>"===e?"</page>":0!==e.indexOf("<uni-")&&0!==e.indexOf("</uni-")?"":e.replace(/uni-/g,"").replace(/ role=""/g,"").replace(/ aria-label=""/g,"")})))});var r},dispatchTapEvent:function(e){return e.click(),Promise.resolve()},dispatchLongpressEvent:function(e){return Promise.resolve()},dispatchTouchEvent:function(e,t,r){r||(r={}),r.touches||(r.touches=[]),r.changedTouches||(r.changedTouches=[]),r.touches.length||r.touches.push({identifier:Date.now(),target:e});var n=r.touches.map((function(e){return new Touch(e)})),o=r.changedTouches.map((function(e){return new Touch(e)}));return e.dispatchEvent(new TouchEvent(t,{cancelable:!0,bubbles:!0,touches:n,targetTouches:[],changedTouches:o})),Promise.resolve()},callFunction:function(t,r,n){var o=m(_,r);return o?Promise.resolve({result:o.apply(null,e([t],n))}):Promise.reject(Error(r+" not exists"))},triggerEvent:function(e,t,r){var n=e.__vue__;return n.$trigger&&n.$trigger(t,{},r),Promise.resolve()}};["movable-view","picker","ad","button","checkbox-group","checkbox","form","icon","label","movable-area","navigator","picker-view-column","picker-view","progress","radio-group","radio","rich-text","u-slider","swiper-item","swiper","switch"].map((function(e){return p(f(e))}));var E=Object.assign({},function(e){return{"Page.getElement":function(t){return e.querySelector(e.getDocument(t.pageId),t.selector)},"Page.getElements":function(t){return e.querySelectorAll(e.getDocument(t.pageId),t.selector)},"Page.getWindowProperties":function(t){return e.queryProperties(e.getWindow(t.pageId),t.names)}}}(y),function(e){var t=function(t){return e.getEl(t.elementId,t.pageId)};return{"Element.getElement":function(r){return e.querySelector(t(r),r.selector)},"Element.getElements":function(r){return e.querySelectorAll(t(r),r.selector)},"Element.getDOMProperties":function(r){return e.queryProperties(t(r),r.names)},"Element.getProperties":function(r){var n=t(r),o=n.__vue__||n.attr||{};return e.queryProperties(o,r.names)},"Element.getOffset":function(r){return e.getOffset(t(r))},"Element.getAttributes":function(r){return e.queryAttributes(t(r),r.names)},"Element.getStyles":function(r){return e.queryStyles(t(r),r.names)},"Element.getHTML":function(r){return e.queryHTML(t(r),r.type)},"Element.tap":function(r){return e.dispatchTapEvent(t(r))},"Element.longpress":function(r){return e.dispatchLongpressEvent(t(r))},"Element.touchstart":function(r){return e.dispatchTouchEvent(t(r),"touchstart",r)},"Element.touchmove":function(r){return e.dispatchTouchEvent(t(r),"touchmove",r)},"Element.touchend":function(r){return e.dispatchTouchEvent(t(r),"touchend",r)},"Element.callFunction":function(r){return e.callFunction(t(r),r.functionName,r.args)},"Element.triggerEvent":function(r){return e.triggerEvent(t(r),r.type,r.detail)}}}(y));function w(e){return UniViewJSBridge.publishHandler("onAutoMessageReceive",e)}UniViewJSBridge.subscribe("sendAutoMessage",(function(e){var t=e.id,r=e.method,n=e.params,o={id:t},u=E[r];if(!u)return o.error={message:r+" unimplemented"},w(o);try{u(n).then((function(e){e&&(o.result=e)})).catch((function(e){o.error={message:e.message}})).finally((function(){w(o)}))}catch(e){o.error={message:e.message},w(o)}}));
function e(){for(var e=0,t=0,r=arguments.length;t<r;t++)e+=arguments[t].length;var n=Array(e),o=0;for(t=0;t<r;t++)for(var u=arguments[t],i=0,c=u.length;i<c;i++,o++)n[o]=u[i];return n}var t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto),r=new Uint8Array(16);function n(){if(!t)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return t(r)}for(var o=[],u=0;u<256;++u)o[u]=(u+256).toString(16).substr(1);function i(e,t,r){var u=t&&r||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var i=(e=e||{}).random||(e.rng||n)();if(i[6]=15&i[6]|64,i[8]=63&i[8]|128,t)for(var c=0;c<16;++c)t[u+c]=i[c];return t||function(e,t){var r=t||0,n=o;return[n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]]].join("")}(i)}var c=Object.prototype.hasOwnProperty,a=Array.isArray,s=function(e){var t=Object.create(null);return function(r){return t[r]||(t[r]=e(r))}},l=/-(\w)/g,f=s((function(e){return e.replace(l,(function(e,t){return t?t.toUpperCase():""}))})),p=s((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),g=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;function d(e,t){if(a(e))return e;if(t&&(r=t,n=e,c.call(r,n)))return[e];var r,n,o=[];return e.replace(g,(function(e,t,r,n){return o.push(r?n.replace(/\\(\\)?/g,"$1"):t||e),n})),o}function m(e,t){var r,n=d(t,e);for(r=n.shift();null!=r;){if(null==(e=e[r]))return;r=n.shift()}return e}var v=new Map;function h(e){if(!function(e){if(e){var t=e.tagName;return 0===t.indexOf("UNI-")||"BODY"===t}return!1}(e))throw Error("no such element");var t,r,n={elementId:(t=e,r=t._id,r||(r=i(),t._id=r,v.set(r,{id:r,element:t})),r),tagName:e.tagName.toLocaleLowerCase().replace("uni-","")},o=e.__vue__;return o&&(o.$parent&&o.$parent.$el===e&&(o=o.$parent),o&&!o.$options.isReserved&&(n.nodeId=function(e){if(e._$weex)return e._uid;if(e._$id)return e._$id;var t=function(e){for(var t=e.$parent;t;){if(t._$id)return t;t=t.$parent}}(e);if(!e.$parent)return"-1";var r=e.$vnode,n=r.context;return n&&n!==t&&n._$id?n._$id+";"+t._$id+","+r.data.attrs._i:t._$id+","+r.data.attrs._i}(o))),"video"===n.tagName&&(n.videoId=n.nodeId),console.log(n),n}var _={input:{input:function(e,t){var r=e.__vue__;r.valueSync=t,r.$triggerInput({},{value:t})}},textarea:{input:function(e,t){var r=e.__vue__;r.valueSync=t,r.$triggerInput({},{value:t})}},"scroll-view":{scrollTo:function(e,t,r){var n=e.__vue__.$refs.main;n.scrollLeft=t,n.scrollTop=r},scrollTop:function(e){return e.__vue__.$refs.main.scrollTop},scrollLeft:function(e){return e.__vue__.$refs.main.scrollLeft},scrollWidth:function(e){return e.__vue__.$refs.main.scrollWidth},scrollHeight:function(e){return e.__vue__.$refs.main.scrollHeight}},swiper:{swipeTo:function(e,t){e.__vue__.current=t}},"movable-view":{moveTo:function(e,t,r){e.__vue__._animationTo(t,r)}},switch:{tap:function(e){e.click()}},slider:{slideTo:function(e,t){var r=e.__vue__,n=r.$refs["uni-slider"],o=n.offsetWidth,u=n.getBoundingClientRect().left;r.value=t,r._onClick({x:(t-r.min)*o/(r.max-r.min)+u})}}},y={getWindow:function(e){return window},getDocument:function(e){return document},getEl:function(e){var t=v.get(e);if(!t)throw Error("element destroyed");return t.element},getOffset:function(e){var t=e.getBoundingClientRect();return Promise.resolve({left:t.left+window.pageXOffset,top:t.top+window.pageYOffset})},querySelector:function(e,t){return"page"===t&&(t="body"),Promise.resolve(h(e.querySelector(t)))},querySelectorAll:function(e,t){var r=[],n=document.querySelectorAll(t);return[].forEach.call(n,(function(e){try{r.push(h(e))}catch(e){}})),Promise.resolve({elements:r})},queryProperties:function(e,t){return Promise.resolve({properties:t.map((function(t){var r=m(e,t);return"document.documentElement.scrollTop"===t&&0===r&&(r=m(e,"document.body.scrollTop")),r}))})},queryAttributes:function(e,t){return Promise.resolve({attributes:t.map((function(t){return String(e.getAttribute(t))}))})},queryStyles:function(e,t){var r=getComputedStyle(e);return Promise.resolve({styles:t.map((function(e){return r[e]}))})},queryHTML:function(e,t){return Promise.resolve({html:(r="outer"===t?e.outerHTML:e.innerHTML,r.replace(/\n/g,"").replace(/(<uni-text[^>]*>)(<span[^>]*>[^<]*<\/span>)(.*?<\/uni-text>)/g,"$1$3").replace(/<\/?[^>]*>/g,(function(e){return-1<e.indexOf("<body")?"<page>":"</body>"===e?"</page>":0!==e.indexOf("<uni-")&&0!==e.indexOf("</uni-")?"":e.replace(/uni-/g,"").replace(/ role=""/g,"").replace(/ aria-label=""/g,"")})))});var r},dispatchTapEvent:function(e){return e.click(),Promise.resolve()},dispatchLongpressEvent:function(e){return Promise.resolve()},dispatchTouchEvent:function(e,t,r){r||(r={}),r.touches||(r.touches=[]),r.changedTouches||(r.changedTouches=[]),r.touches.length||r.touches.push({identifier:Date.now(),target:e});var n=r.touches.map((function(e){return new Touch(e)})),o=r.changedTouches.map((function(e){return new Touch(e)}));return e.dispatchEvent(new TouchEvent(t,{cancelable:!0,bubbles:!0,touches:n,targetTouches:[],changedTouches:o})),Promise.resolve()},callFunction:function(t,r,n){var o=m(_,r);return o?Promise.resolve({result:o.apply(null,e([t],n))}):Promise.reject(Error(r+" not exists"))},triggerEvent:function(e,t,r){var n=e.__vue__;return n.$trigger&&n.$trigger(t,{},r),Promise.resolve()}};["movable-view","picker","ad","button","checkbox-group","checkbox","form","icon","label","movable-area","navigator","picker-view-column","picker-view","progress","radio-group","radio","rich-text","u-slider","swiper-item","swiper","switch"].map((function(e){return p(f(e))}));var E=Object.assign({},function(e){return{"Page.getElement":function(t){return e.querySelector(e.getDocument(t.pageId),t.selector)},"Page.getElements":function(t){return e.querySelectorAll(e.getDocument(t.pageId),t.selector)},"Page.getWindowProperties":function(t){return e.queryProperties(e.getWindow(t.pageId),t.names)}}}(y),function(e){var t=function(t){return e.getEl(t.elementId,t.pageId)};return{"Element.getElement":function(r){return e.querySelector(t(r),r.selector)},"Element.getElements":function(r){return e.querySelectorAll(t(r),r.selector)},"Element.getDOMProperties":function(r){return e.queryProperties(t(r),r.names)},"Element.getProperties":function(r){var n=t(r),o=n.__vue__||n.attr||{};return e.queryProperties(o,r.names)},"Element.getOffset":function(r){return e.getOffset(t(r))},"Element.getAttributes":function(r){return e.queryAttributes(t(r),r.names)},"Element.getStyles":function(r){return e.queryStyles(t(r),r.names)},"Element.getHTML":function(r){return e.queryHTML(t(r),r.type)},"Element.tap":function(r){return e.dispatchTapEvent(t(r))},"Element.longpress":function(r){return e.dispatchLongpressEvent(t(r))},"Element.touchstart":function(r){return e.dispatchTouchEvent(t(r),"touchstart",r)},"Element.touchmove":function(r){return e.dispatchTouchEvent(t(r),"touchmove",r)},"Element.touchend":function(r){return e.dispatchTouchEvent(t(r),"touchend",r)},"Element.callFunction":function(r){return e.callFunction(t(r),r.functionName,r.args)},"Element.triggerEvent":function(r){return e.triggerEvent(t(r),r.type,r.detail)}}}(y));function w(e){return UniViewJSBridge.publishHandler("onAutoMessageReceive",e)}UniViewJSBridge.subscribe("sendAutoMessage",(function(e){var t=e.id,r=e.method,n=e.params,o={id:t},u=E[r];if(!u)return o.error={message:r+" unimplemented"},w(o);try{u(n).then((function(e){e&&(o.result=e)})).catch((function(e){o.error={message:e.message}})).finally((function(){w(o)}))}catch(e){o.error={message:e.message},w(o)}}));
const isWin = /^win/.test(process.platform)
const normalizePath = path => (isWin ? path.replace(/\\/g, '/') : path)
function optimizeChunk(chunk) {
if (!chunk) {
return
}
const subPackages = Object.keys(process.UNI_SUBPACKAGES).map(root => `${root}/app-sub-service`)
const chunks = Array.from(chunk.groupsIterable)[0].chunks
Array.from(chunk.groupsIterable)[0].chunks = chunks.filter(chunk => !subPackages.includes(normalizePath(chunk.id)))
}
class SubPackagesPlugin {
apply(compiler) {
compiler.hooks.thisCompilation.tap('SubPackagesPlugin', compilation => {
compilation.hooks.afterOptimizeChunkIds.tap('SubPackagesPlugin', chunks => {
optimizeChunk(chunks.find(chunk => chunk.id === 'app-service'))
})
})
}
}
module.exports = SubPackagesPlugin
......@@ -23,7 +23,8 @@ module.exports = {
template: '.wxml',
filter: '.wxs'
},
filterTag: 'wxs'
filterTag: 'wxs',
subPackages: true
},
copyWebpackOptions (platformOptions, vueOptions) {
const copyOptions = []
......@@ -42,7 +43,16 @@ module.exports = {
}
return copyOptions
},
chainWebpack (config) {
chainWebpack (config, vueOptions) {
const isAppService = !!vueOptions.pluginOptions['uni-app-plus'].service
if (isAppService) {
const subPackages = Object.keys(process.UNI_SUBPACKAGES)
if (process.env.UNI_OPT_SUBPACKAGES && subPackages.length) {
config
.plugin('uni-app-plus-subpackages')
.use(require('./plugin/sub-packages-plugin'))
}
}
if (process.env.NODE_ENV === 'production') {
config.optimization.minimizer('terser').tap((args) => {
if (!args[0].terserOptions.output) {
......
此差异已折叠。
......@@ -358,7 +358,8 @@ var baseApi = /*#__PURE__*/Object.freeze({
// 不支持的 API 列表
const todos = [
'preloadPage'
'preloadPage',
'loadSubPackage'
// 'getRecorderManager',
// 'getBackgroundAudioManager',
// 'createInnerAudioContext',
......
......@@ -391,7 +391,7 @@ var previewImage = {
};
// 不支持的 API 列表
const todos = [
const todos = [
'preloadPage'
// 'hideKeyboard',
// 'onGyroscopeChange',
......@@ -422,7 +422,7 @@ const todos = [
// 'stopBeaconDiscovery',
// 'hideShareMenu',
// 'onWindowResize',
// 'offWindowResize',
// 'offWindowResize',
// 'vibrate'
];
......
......@@ -394,7 +394,8 @@ const protocols = {
previewImage
};
const todos = [
'preloadPage'
'preloadPage',
'loadSubPackage'
// 'startBeaconDiscovery',
// 'stopBeaconDiscovery',
// 'getBeacons',
......
......@@ -392,7 +392,8 @@ var previewImage = {
// 不支持的 API 列表
const todos = [
'preloadPage'
'preloadPage',
'loadSubPackage'
// 'createCameraContext',
// 'createLivePlayerContext',
// 'getSavedFileInfo',
......
......@@ -412,7 +412,8 @@ const protocols = {
};
const todos = [
'vibrate',
'preloadPage'
'preloadPage',
'loadSubPackage'
];
const canIUses = [];
......
......@@ -393,7 +393,10 @@ var previewImage = {
const protocols = {
previewImage
};
const todos = [];
const todos = [
'preloadPage',
'loadSubPackage'
];
const canIUses = [];
const CALLBACKS = ['success', 'fail', 'cancel', 'complete'];
......
const path = require('path')
const {
normalizePath
} = require('@dcloudio/uni-cli-shared')
function createCacheGroups () {
const cacheGroups = {}
if (process.UNI_CONFUSION) { // 加密
cacheGroups.confusion = {
enforce: true,
test: function (module) {
if (!module.resource) {
return false
}
if (process.UNI_CONFUSION.includes(normalizePath(module.resource))) {
return true
}
return false
},
name: 'app-confusion',
chunks: 'all'
}
}
process.env.UNI_OPT_SUBPACKAGES && Object.keys(process.UNI_SUBPACKAGES).forEach(root => {
cacheGroups[root] = {
enforce: true,
test: function (module) {
if (!module.resource) {
return false
}
if (normalizePath(module.resource).includes(root + '/')) {
return true
}
return false
},
name: root + '/app-sub-service',
chunks: 'all'
}
})
return cacheGroups
}
module.exports = function getSplitChunks () {
const {
normalizePath
} = require('@dcloudio/uni-cli-shared')
if (process.env.UNI_USING_V3) {
if (!process.UNI_CONFUSION) { // 无加密
return false
}
return {
cacheGroups: {
vendor: {
minSize: 0,
minChunks: 1,
test: function (module) {
if (!module.resource) {
return false
}
if (process.UNI_CONFUSION.includes(normalizePath(module.resource))) {
return true
}
return false
},
name: 'app-confusion',
chunks: 'all'
}
}
cacheGroups: createCacheGroups()
}
}
if (!process.env.UNI_USING_COMPONENTS) {
return {
cacheGroups: {
......
......@@ -30,7 +30,7 @@ function getDefineComponents ({
}) => `Vue.component('${name}',require('${source}').default)`)
}
const appVueFilePath = path.resolve(process.env.UNI_INPUT_DIR, 'app.vue')
const appVueFilePath = path.resolve(process.env.UNI_INPUT_DIR, 'App.vue')
function getStylesCode (loaderContext) {
if (!fs.existsSync(appVueFilePath)) {
......
......@@ -60,20 +60,27 @@ function ModuleBuildError (err) {
}
} else if (~err.message.indexOf('Cannot find module')) {
let builtinCompile = ''
let name = ''
if (~err.message.indexOf('compile-less')) {
name = 'compile-less'
builtinCompile = 'less'
} else if (~err.message.indexOf('compile-node-sass')) {
name = 'compile-node-sass'
builtinCompile = 'scss/sass'
} else if (~err.message.indexOf('compile-stylus')) {
name = 'compile-stylus'
builtinCompile = 'stylus'
} else if (~err.message.indexOf('compile-typescript')) {
name = 'compile-typescript'
builtinCompile = 'typescript'
} else if (~err.message.indexOf('compile-pug-cli')) {
name = 'compile-pug-cli'
builtinCompile = 'pug/jade'
}
if (builtinCompile) {
return {
message: '预编译器错误:代码使用了' + builtinCompile + '语言,但未安装相应编译器,请在菜单工具-插件安装里安装相应编译插件'
message: '预编译器错误:代码使用了' + builtinCompile +
'语言,但未安装相应的编译器插件,请前往插件市场安装该插件:\nhttps://ext.dcloud.net.cn/plugin?name=' + name
}
}
} else if (~firstLineMessage.indexOf('Module parse failed')) {
......@@ -88,15 +95,15 @@ function ModuleBuildError (err) {
}
function ModuleNotFoundError (err) {
const matches = err.message.match(/Can't resolve '(.*loader)'/)
if (matches && matches.length > 0) {
return {
line: 1,
message: `
Failed to resolve loader: ${matches[1]}
You may need to install it.
`
}
const matches = err.message.match(/Can't resolve '(.*loader)'/)
if (matches && matches.length > 0) {
return {
line: 1,
message: `
Failed to resolve loader: ${matches[1]}
You may need to install it.
`
}
}
const dependency = getDependency(err)
if (dependency) {
......
......@@ -478,6 +478,7 @@ module.exports = function (pagesJson, userManifestJson) {
manifest.content = manifestJson
const subPackages = []
// 分包合并
if (appJson.subPackages && appJson.subPackages.length) {
appJson.subPackages.forEach(subPackage => {
......@@ -485,6 +486,9 @@ module.exports = function (pagesJson, userManifestJson) {
subPackage.pages.forEach(page => {
appJson.pages.push(normalizePath(path.join(subPackage.root, page)))
})
subPackages.push({
root: subPackage.root
})
}
})
}
......@@ -499,6 +503,9 @@ module.exports = function (pagesJson, userManifestJson) {
}
if (process.env.UNI_USING_V3 || process.env.UNI_USING_V3_NATIVE) {
if (process.env.UNI_USING_V3) {
appJson.subPackages = subPackages
}
return require('./index.v3')(appJson, manifestJson, {
manifest,
pagesJson,
......
export const loadSubPackage = {
root: {
type: String,
required: true,
validator (value, params) {
const subPackages = __uniConfig.subPackages
if (!Array.isArray(subPackages) || subPackages.length === 0) {
return 'no subPackages'
}
if (!subPackages.find(subPackage => subPackage.root === value)) {
return 'root `' + value + '` is not found'
}
}
}
}
......@@ -76,8 +76,9 @@ function createValidator (type) {
// 参数格式化
params.url = encodeQueryString(url)
if (type === 'preloadPage') {
if (type === 'unPreloadPage') {
return
} else if (type === 'preloadPage') {
if (__PLATFORM__ === 'app-plus') {
if (!routeOptions.meta.isNVue) {
return 'can not preload vue page'
......@@ -185,4 +186,12 @@ export const preloadPage = {
required: true,
validator: createValidator('preloadPage')
}
}
}
export const unPreloadPage = {
url: {
type: String,
required: true,
validator: createValidator('unPreloadPage')
}
}
......@@ -139,5 +139,5 @@ export function requestComponentInfo ({
UniViewJSBridge.publishHandler('onRequestComponentInfo', {
reqId,
res: result
}, pageVm.$page.id)
}
}, pageId)
}
......@@ -28,9 +28,9 @@ export default {
},
methods: {
_converPx (value) {
if (/\d+[ur]px$/i.test(value)) {
value.replace(/\d+[ur]px$/i, text => {
return `${uni.upx2px(parseFloat(text))}px`
if (/^-?\d+[ur]px$/i.test(value)) {
return value.replace(/(^-?\d+)[ur]px$/i, (text, num) => {
return `${uni.upx2px(parseFloat(num))}px`
})
// eslint-disable-next-line no-useless-escape
} else if (/^-?[\d\.]+$/.test(value)) {
......
function converPx (value) {
if (/\d+[ur]px$/i.test(value)) {
value.replace(/\d+[ur]px$/i, text => {
return `${uni.upx2px(parseFloat(text))}px`
if (/^-?\d+[ur]px$/i.test(value)) {
return value.replace(/(^-?\d+)[ur]px$/i, (text, num) => {
return `${uni.upx2px(parseFloat(num))}px`
})
// eslint-disable-next-line no-useless-escape
} else if (/^-?[\d\.]+$/.test(value)) {
......@@ -73,7 +73,9 @@ function startAnimation (context) {
}
}
animate()
setTimeout(() => {
animate()
}, 0)
}
export default {
......
......@@ -39,6 +39,6 @@ export default function initVue (Vue) {
if (~conflictTags.indexOf(tag)) { // svg 部分标签名称与 uni 标签冲突
return false
}
return oldGetTagNamespace(tag) || false
return oldGetTagNamespace(tag)
}
}
......@@ -52,6 +52,7 @@ export * from './plugin/restore-global'
export * from './plugin/sub-nvue'
export * from './plugin/on-native-event-receive'
export * from './plugin/send-native-event'
export * from './plugin/load-sub-package'
export * from './route/navigate-back'
export * from './route/navigate-to'
......
import {
invoke
} from '../../bridge'
const SUB_FILENAME = 'app-sub-service.js'
function evaluateScriptFile (file, callback) {
// TODO 有可能当前 instance 是非 app-service
weex.requireModule('plus').evalJSFiles([file], callback)
}
export function loadSubPackage ({
root
}, callbackId) {
evaluateScriptFile(root + '/' + SUB_FILENAME, res => {
invoke(callbackId, {
errMsg: 'loadSubPackage:ok'
})
})
}
......@@ -7,6 +7,10 @@ import {
setStatusBarStyle
} from '../../bridge'
import {
closeWebview
} from './util'
let firstBackTime = 0
function quit () {
......@@ -46,18 +50,19 @@ function back (delta, animationType, animationDuration) {
if (delta > 1) {
// 中间页隐藏
pages.slice(len - delta, len - 1).reverse().forEach(deltaPage => {
deltaPage.$getAppWebview().close('none')
closeWebview(deltaPage.$getAppWebview(), 'none')
})
}
const backPage = function (webview) {
if (animationType) {
webview.close(animationType, animationDuration || ANI_DURATION)
closeWebview(webview, animationType, animationDuration || ANI_DURATION)
} else {
if (currentPage.$page.openType === 'redirect') { // 如果是 redirectTo 跳转的,需要制定 back 动画
webview.close(ANI_CLOSE, ANI_DURATION)
closeWebview(webview, ANI_CLOSE, ANI_DURATION)
} else {
closeWebview(webview, 'auto')
}
webview.close('auto')
}
pages.slice(len - delta, len).forEach(page => page.$remove())
......
......@@ -7,9 +7,29 @@ import {
} from '../../bridge'
import {
preloadWebview
preloadWebview,
closePreloadWebview
} from '../../framework/page'
export function unPreloadPage ({
url
}) {
const webview = closePreloadWebview({
url
})
if (webview) {
return {
id: webview.id,
url,
errMsg: 'unPreloadPage:ok'
}
}
return {
url,
errMsg: 'unPreloadPage:fail not found'
}
}
export function preloadPage ({
url
}, callbackId) {
......@@ -26,4 +46,4 @@ export function preloadPage ({
url,
errMsg: 'preloadPage:ok'
})
}
}
......@@ -3,7 +3,8 @@ import {
} from 'uni-shared'
import {
showWebview
showWebview,
closeWebview
} from './util'
import {
......@@ -45,8 +46,8 @@ function _reLaunch ({
0,
() => {
pages.forEach(page => {
page.$remove()
page.$getAppWebview().close('none')
page.$remove()
closeWebview(page.$getAppWebview(), 'none')
})
invoke(callbackId, {
errMsg: 'reLaunch:ok'
......
......@@ -12,7 +12,8 @@ import {
} from '../../bridge'
import {
registerPage
registerPage,
removePreloadWebview
} from '../../framework/page'
import {
......@@ -39,7 +40,13 @@ function _redirectTo ({
'none',
0,
() => {
lastPage && lastPage.$getAppWebview().close('none')
if (lastPage) {
const webview = lastPage.$getAppWebview()
if (webview.__preload__) {
removePreloadWebview(webview)
}
webview.close('none')
}
invoke(callbackId, {
errMsg: 'redirectTo:ok'
})
......
import {
parseQuery
} from 'uni-shared'
} from 'uni-shared'
import {
ANI_CLOSE,
ANI_DURATION
} from '../../constants'
import {
showWebview
showWebview,
closeWebview
} from './util'
import {
......@@ -28,7 +29,7 @@ import tabBar from '../../framework/tab-bar'
function _switchTab ({
url,
path,
path,
query,
from
}, callbackId) {
......@@ -52,16 +53,16 @@ function _switchTab ({
pages.reverse().forEach(page => {
if (!page.$page.meta.isTabBar && page !== currentPage) {
page.$remove()
page.$getAppWebview().close('none')
closeWebview(page.$getAppWebview(), 'none')
}
})
currentPage.$remove()
// 延迟执行避免iOS应用退出
setTimeout(() => {
if (currentPage.$page.openType === 'redirect') {
currentPage.$getAppWebview().close(ANI_CLOSE, ANI_DURATION)
closeWebview(currentPage.$getAppWebview(), ANI_CLOSE, ANI_DURATION)
} else {
currentPage.$getAppWebview().close('auto')
closeWebview(currentPage.$getAppWebview(), 'auto')
}
}, 100)
} else {
......@@ -92,9 +93,12 @@ function _switchTab ({
currentPage.$vm.__call_hook('onHide')
}
if (tabBarPage) {
tabBarPage.$getAppWebview().show('none')
const webview = tabBarPage.$getAppWebview()
webview.show('none')
// 等visible状态都切换完之后,再触发onShow,否则开发者在onShow里边 getCurrentPages 会不准确
callOnShow && tabBarPage.$vm.__call_hook('onShow')
if (callOnShow && !webview.__preload__) {
tabBarPage.$vm.__call_hook('onShow')
}
} else {
return showWebview(registerPage({
url,
......@@ -127,7 +131,7 @@ export function switchTab ({
navigate(path, function () {
_switchTab({
url,
path,
path,
query,
from
}, callbackId)
......
......@@ -7,6 +7,10 @@ import {
navigateFinish
} from '../../framework/navigator'
export function closeWebview (webview, animationType, animationDuration) {
webview[webview.__preload__ ? 'hide' : 'close'](animationType, animationDuration)
}
export function showWebview (webview, animationType, animationDuration, showCallback, delay) {
if (typeof delay === 'undefined') {
delay = webview.nvue ? 0 : 100
......
const loadedSubPackages = []
/**
* 指定路由 ready 后,检查是否触发分包预加载
* @param {Object} route
*/
export function preloadSubPackages (route) {
if (!__uniConfig.preloadRule) {
return
}
const options = __uniConfig.preloadRule[route]
if (!options || !Array.isArray(options.packages)) {
return
}
const packages = options.packages.filter(root => loadedSubPackages.indexOf(root) === -1)
if (!packages.length) {
return
}
const network = options.network || 'wifi'
if (network === 'wifi') {
uni.getNetworkType({
success (res) {
if (process.env.NODE_ENV !== 'production') {
console.log('UNIAPP[preloadRule]:' + res.networkType + ':' + JSON.stringify(options))
}
if (res.networkType === 'wifi') {
loadSubPackages(options.packages)
}
}
})
} else {
if (process.env.NODE_ENV !== 'production') {
console.log('UNIAPP[preloadRule]:' + JSON.stringify(options))
}
loadSubPackages(options.packages)
}
}
export function loadPage (route, callback) {
let isInSubPackage = false
const subPackages = __uniConfig.subPackages
if (Array.isArray(subPackages)) {
const subPackage = subPackages.find(subPackage => route.indexOf(subPackage.root) === 0)
if (subPackage) {
isInSubPackage = true
loadSubPackage(subPackage.root, callback)
}
}
if (!isInSubPackage) {
callback()
}
}
function loadSubPackage (root, callback) {
if (loadedSubPackages.indexOf(root) !== -1) {
return callback()
}
loadSubPackages([root], () => {
callback()
})
}
const SUB_FILENAME = 'app-sub-service.js'
function evaluateScriptFiles (files, callback) {
// TODO 有可能当前 instance 是非 app-service
weex.requireModule('plus').evalJSFiles(files, callback)
}
function loadSubPackages (packages, callback) {
if (process.env.NODE_ENV !== 'production') {
console.log('UNIAPP[loadSubPackages]:' + JSON.stringify(packages))
}
const startTime = Date.now()
evaluateScriptFiles(packages.map(root => {
loadedSubPackages.push(root)
return root + '/' + SUB_FILENAME
}), res => {
if (process.env.NODE_ENV !== 'production') {
console.log('UNIAPP[loadSubPackages]:' + (Date.now() - startTime))
}
callback && callback(true)
})
}
......@@ -13,6 +13,10 @@ import {
createPage
} from '../../page-factory'
import {
loadPage
} from './load-sub-package'
const pages = []
export function getCurrentPages (returnAll) {
......@@ -23,6 +27,36 @@ export function getCurrentPages (returnAll) {
const preloadWebviews = {}
export function removePreloadWebview (webview) {
const url = Object.keys(preloadWebviews).find(url => preloadWebviews[url].id === webview.id)
if (url) {
if (process.env.NODE_ENV !== 'production') {
console.log(`[uni-app] removePreloadWebview(${webview.id})`)
}
delete preloadWebviews[url]
}
}
export function closePreloadWebview ({
url
}) {
const webview = preloadWebviews[url]
if (webview) {
if (webview.__page__) {
if (!getCurrentPages(true).find(page => page === webview.__page__)) {
// 未使用
webview.close('none')
} else { // 被使用
webview.__preload__ = false
}
} else { // 未使用
webview.close('none')
}
delete preloadWebviews[url]
}
return webview
}
export function preloadWebview ({
url,
path,
......@@ -50,7 +84,21 @@ export function registerPage ({
}) {
if (preloadWebviews[url]) {
webview = preloadWebviews[url]
delete preloadWebviews[url]
if (webview.__page__) {
// 该预载页面已处于显示状态,不再使用该预加载页面,直接新开
if (getCurrentPages(true).find(page => page === webview.__page__)) {
if (process.env.NODE_ENV !== 'production') {
console.log(`[uni-app] preloadWebview(${path},${webview.id}) already in use`)
}
webview = null
} else {
pages.push(webview.__page__)
if (process.env.NODE_ENV !== 'production') {
console.log(`[uni-app] reuse preloadWebview(${path},${webview.id})`)
}
return webview
}
}
}
const routeOptions = JSON.parse(JSON.stringify(__uniRoutes.find(route => route.path === path)))
......@@ -58,7 +106,7 @@ export function registerPage ({
openType === 'reLaunch' ||
(
!__uniConfig.realEntryPagePath &&
pages.length === 0
getCurrentPages().length === 0 // redirectTo
)
) {
routeOptions.meta.isQuit = true
......@@ -129,9 +177,9 @@ export function registerPage ({
pages.push(pageInstance)
// if (webview.__preload__) {
// // TODO 触发 onShow 以及绑定vm,page 关系
// }
if (webview.__preload__) {
webview.__page__ = pageInstance
}
// 首页是 nvue 时,在 registerPage 时,执行路由堆栈
if (webview.id === '1' && webview.nvue) {
......@@ -151,7 +199,9 @@ export function registerPage ({
if (!webview.nvue) {
const pageId = webview.id
try {
createPage(route, pageId, query, pageInstance).$mount()
loadPage(route, () => {
createPage(route, pageId, query, pageInstance).$mount()
})
} catch (e) {
console.error(e)
}
......
......@@ -32,6 +32,10 @@ import {
getStatusbarHeight
} from '../../api/util'
import {
preloadSubPackages
} from '../load-sub-package'
function parsePageCreateOptions (vm, route) {
const pagePath = '/' + route
const routeOptions = __uniRoutes.find(route => route.path === pagePath)
......@@ -104,7 +108,8 @@ export function initLifecycle (Vue) {
},
mounted () {
if (this.mpType === 'page') {
callPageHook(this.$scope, 'onReady')
callPageHook(this.$scope, 'onReady')
preloadSubPackages(this.$scope.route)
}
}
})
......
......@@ -6,25 +6,32 @@
<router-view :key="key" />
</keep-alive>
<!-- </transition> -->
<tab-bar
v-if="hasTabBar"
v-show="showTabBar"
<tab-bar
v-if="hasTabBar"
v-show="showTabBar"
v-bind="tabBar"
/>
<toast
v-if="$options.components.Toast"
<toast
v-if="$options.components.Toast"
v-bind="showToast"
/>
<action-sheet
v-if="$options.components.ActionSheet"
v-bind="showActionSheet"
<action-sheet
v-if="$options.components.ActionSheet"
v-bind="showActionSheet"
@close="_onActionSheetClose"
/>
<modal
v-if="$options.components.Modal"
v-bind="showModal"
<modal
v-if="$options.components.Modal"
v-bind="showModal"
@close="_onModalClose"
/>
<template v-if="sysComponents&&sysComponents.length">
<component
:is="item"
v-for="(item, index) in sysComponents"
:key="index"
/>
</template>
</uni-app>
</template>
<script>
......@@ -56,7 +63,8 @@ export default {
return {
transitionName: 'fade',
hideTabBar: false,
tabBar: __uniConfig.tabBar || {}
tabBar: __uniConfig.tabBar || {},
sysComponents: this.$sysComponents
}
},
computed: {
......@@ -79,7 +87,8 @@ export default {
if (uni.canIUse('css.var')) {
const windowBottomValue = !newVal ? (TABBAR_HEIGHT) : 0
const envMethod = uni.canIUse('css.env') ? 'env' : (uni.canIUse('css.constant') ? 'constant' : '')
const windowBottom = windowBottomValue && envMethod ? `calc(${windowBottomValue}px + ${envMethod}(safe-area-inset-bottom))` : `${windowBottomValue}px`
const windowBottom = windowBottomValue && envMethod
? `calc(${windowBottomValue}px + ${envMethod}(safe-area-inset-bottom))` : `${windowBottomValue}px`
document.documentElement.style.setProperty('--window-bottom', windowBottom)
console.debug(`uni.${windowBottom ? 'showTabBar' : 'hideTabBar'}:--window-bottom=${windowBottom}`)
}
......@@ -111,10 +120,11 @@ export default {
<style>
@import "~uni-core/view/index.css";
uni-app {
display: block;
box-sizing: border-box;
width: 100%;
height: 100%;
}
</style>
uni-app {
display: block;
box-sizing: border-box;
width: 100%;
height: 100%;
}
</style>
......@@ -2,7 +2,7 @@
<uni-web-view v-on="$listeners">
<v-uni-resize-sensor
ref="sensor"
@resize="_resize"
@resize="_resize"
/>
</uni-web-view>
</template>
......@@ -22,6 +22,9 @@ export default {
},
mounted () {
this.iframe = document.createElement('iframe')
Object.keys(this.$attrs).forEach(key => {
this.iframe[key] = this.$attrs[key]
})
this.iframe.src = this.$getRealPath(this.src)
document.body.appendChild(this.iframe)
this._resize()
......
......@@ -2,8 +2,10 @@ import {
isPlainObject
} from 'uni-shared'
// 不支持的 API 列表
const todos = [
'preloadPage'
const todos = [
'preloadPage',
'unPreloadPage',
'loadSubPackage'
// 'getRecorderManager',
// 'getBackgroundAudioManager',
// 'createInnerAudioContext',
......@@ -222,6 +224,20 @@ const protocols = { // 需要做转换的 API 列表
filePath: 'apFilePath'
}
},
compressImage: {
args (fromArgs) {
fromArgs.compressLevel = 4
if (fromArgs && fromArgs.quality) {
fromArgs.compressLevel = Math.floor(fromArgs.quality / 26)
}
fromArgs.apFilePaths = [fromArgs.src]
},
returnValue (result) {
if (result.apFilePaths && result.apFilePaths.length) {
result.tempFilePath = result.apFilePaths[0]
}
}
},
chooseVideo: {
// 支付宝小程序文档中未找到(仅在getSetting处提及),但实际可用
returnValue: {
......
import previewImage from '../../../mp-weixin/helpers/normalize-preview-image'
// 不支持的 API 列表
const todos = [
'preloadPage'
const todos = [
'preloadPage',
'unPreloadPage'
// 'hideKeyboard',
// 'onGyroscopeChange',
// 'startGyroscope',
......@@ -31,7 +32,7 @@ const todos = [
// 'stopBeaconDiscovery',
// 'hideShareMenu',
// 'onWindowResize',
// 'offWindowResize',
// 'offWindowResize',
// 'vibrate'
]
......
......@@ -2,8 +2,10 @@ import previewImage from '../../../mp-weixin/helpers/normalize-preview-image'
export const protocols = {
previewImage
}
export const todos = [
'preloadPage'
export const todos = [
'preloadPage',
'unPreloadPage',
'loadSubPackage'
// 'startBeaconDiscovery',
// 'stopBeaconDiscovery',
// 'getBeacons',
......@@ -33,10 +35,10 @@ export const todos = [
// 'chooseInvoiceTitle',
// 'checkIsSupportSoterAuthentication',
// 'startSoterAuthentication',
// 'checkIsSoterEnrolledInDevice',
// 'vibrate',
// 'loadFontFace',
// 'getExtConfig',
// 'checkIsSoterEnrolledInDevice',
// 'vibrate',
// 'loadFontFace',
// 'getExtConfig',
// 'getExtConfigSync'
]
export const canIUses = [
......@@ -52,14 +54,14 @@ export const canIUses = [
'onUserCaptureScreen',
'vibrateLong',
'vibrateShort',
'createWorker',
'connectSocket',
'onSocketOpen',
'onSocketError',
'sendSocketMessage',
'onSocketMessage',
'closeSocket',
'onSocketClose',
'createWorker',
'connectSocket',
'onSocketOpen',
'onSocketError',
'sendSocketMessage',
'onSocketMessage',
'closeSocket',
'onSocketClose',
'openDocument',
'updateShareMenu',
'getShareInfo',
......
import previewImage from '../../../mp-weixin/helpers/normalize-preview-image'
// 不支持的 API 列表
const todos = [
'preloadPage'
const todos = [
'preloadPage',
'unPreloadPage',
'loadSubPackage'
// 'createCameraContext',
// 'createLivePlayerContext',
// 'getSavedFileInfo',
......@@ -59,7 +61,7 @@ const todos = [
// 'setEnableDebug',
// 'onWindowResize',
// 'offWindowResize',
// 'createOffscreenCanvas',
// 'createOffscreenCanvas',
// 'vibrate'
]
......@@ -153,7 +155,7 @@ const protocols = {
timeout: false
}
},
requestPayment: {
requestPayment: {
name: tt.pay ? 'pay' : 'requestPayment',
args: {
orderInfo: tt.pay ? 'orderInfo' : 'data'
......@@ -170,4 +172,4 @@ export {
protocols,
todos,
canIUses
}
}
......@@ -21,7 +21,9 @@ export const protocols = {
}
}
export const todos = [
'vibrate',
'preloadPage'
'vibrate',
'preloadPage',
'unPreloadPage',
'loadSubPackage'
]
export const canIUses = []
......@@ -3,5 +3,9 @@ import previewImage from '../../../mp-weixin/helpers/normalize-preview-image'
export const protocols = {
previewImage
}
export const todos = []
export const todos = [
'preloadPage',
'unPreloadPage',
'loadSubPackage'
]
export const canIUses = []
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册