From 8b8d734ebb0e5e31a5aa2f07c709b1b2f8a97882 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Tue, 19 Nov 2019 21:09:26 +0800 Subject: [PATCH] feat(runtime): add web-view runtime --- build/rollup.config.web-view.js | 23 ++++ dist/uni.webview.1.5.2.js | 1 + package.json | 3 + src/core/runtime/web-view/index.js | 63 +++++++++++ .../app-plus/runtime/web-view-api.js | 104 ++++++++++++++++++ src/platforms/app-plus/runtime/web-view.js | 19 ++++ src/platforms/h5/runtime/web-view.js | 8 ++ src/platforms/mp-alipay/runtime/web-view.js | 28 +++++ src/platforms/mp-baidu/runtime/web-view.js | 13 +++ src/platforms/mp-qq/runtime/web-view.js | 18 +++ src/platforms/mp-toutiao/runtime/web-view.js | 13 +++ src/platforms/mp-weixin/runtime/web-view.js | 18 +++ yarn.lock | 33 +++++- 13 files changed, 343 insertions(+), 1 deletion(-) create mode 100644 build/rollup.config.web-view.js create mode 100644 dist/uni.webview.1.5.2.js create mode 100644 src/core/runtime/web-view/index.js create mode 100644 src/platforms/app-plus/runtime/web-view-api.js create mode 100644 src/platforms/app-plus/runtime/web-view.js create mode 100644 src/platforms/h5/runtime/web-view.js create mode 100644 src/platforms/mp-alipay/runtime/web-view.js create mode 100644 src/platforms/mp-baidu/runtime/web-view.js create mode 100644 src/platforms/mp-qq/runtime/web-view.js create mode 100644 src/platforms/mp-toutiao/runtime/web-view.js create mode 100644 src/platforms/mp-weixin/runtime/web-view.js diff --git a/build/rollup.config.web-view.js b/build/rollup.config.web-view.js new file mode 100644 index 000000000..25e9c089a --- /dev/null +++ b/build/rollup.config.web-view.js @@ -0,0 +1,23 @@ +const path = require('path') +const babel = require('rollup-plugin-babel') +const alias = require('rollup-plugin-alias') +const uglify = require('rollup-plugin-uglify') +module.exports = { + input: 'src/core/runtime/web-view/index.js', + output: { + name: 'uni', + file: `dist/uni.webview.1.5.2.js`, + format: 'umd' + }, + plugins: [ + alias({ + 'uni-platforms': path.resolve(__dirname, '../src/platforms') + }), + babel(), + uglify.uglify({ + output: { + ascii_only: true + } + }) + ] +} diff --git a/dist/uni.webview.1.5.2.js b/dist/uni.webview.1.5.2.js new file mode 100644 index 000000000..40ad9921f --- /dev/null +++ b/dist/uni.webview.1.5.2.js @@ -0,0 +1 @@ +!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e=e||self).uni=n()}(this,function(){"use strict";function i(e,n){var i={options:{timestamp:+new Date},name:e,arg:n};if(!window.plus)return window.parent.postMessage({type:s,data:i,pageId:""},"*");if(0===d.length){var t=plus.webview.currentWebview();if(!t)throw new Error("plus.webview.currentWebview() is undefined");var o=t.parent(),a="";a=o?o.id:t.id,d.push(a)}var r=JSON.stringify(i);plus.webview.getWebviewById(u)?plus.webview.postMessageToUniNView({type:s,args:{data:i,webviewIds:d}},u):plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler("'.concat(s,'",').concat(r,",").concat(JSON.stringify(d),");"))}var d=[],u="__uniapp__service",s="WEB_INVOKE_APPSERVICE",n={navigateTo:function(e){var n=(0 { + if (window.plus && readyRE.test(document.readyState)) { + readyCallback() + } else { + document.addEventListener('plusready', readyCallback) + } + }, 0) + return api +} diff --git a/src/platforms/h5/runtime/web-view.js b/src/platforms/h5/runtime/web-view.js new file mode 100644 index 000000000..85f50dbe4 --- /dev/null +++ b/src/platforms/h5/runtime/web-view.js @@ -0,0 +1,8 @@ +import api from '../../app-plus/runtime/web-view-api' + +export function initWebviewApi (readyCallback) { + setTimeout(() => { + document.addEventListener('DOMContentLoaded', readyCallback) + }, 0) + return api +} diff --git a/src/platforms/mp-alipay/runtime/web-view.js b/src/platforms/mp-alipay/runtime/web-view.js new file mode 100644 index 000000000..a5cf43e18 --- /dev/null +++ b/src/platforms/mp-alipay/runtime/web-view.js @@ -0,0 +1,28 @@ +const isAlipay = window.my && navigator.userAgent.indexOf('AlipayClient') > -1 + +export function initWebviewApi (readyCallback) { + if (!isAlipay) { + return + } + setTimeout(() => { + document.addEventListener('DOMContentLoaded', readyCallback) + }, 0) + const { + navigateTo, + navigateBack, + switchTab, + reLaunch, + redirectTo, + postMessage, + getEnv + } = window.my + return { + navigateTo, + navigateBack, + switchTab, + reLaunch, + redirectTo, + postMessage, + getEnv + } +} diff --git a/src/platforms/mp-baidu/runtime/web-view.js b/src/platforms/mp-baidu/runtime/web-view.js new file mode 100644 index 000000000..8a15af4e3 --- /dev/null +++ b/src/platforms/mp-baidu/runtime/web-view.js @@ -0,0 +1,13 @@ +const isBaidu = window.swan && + window.swan.webView && + /swan-baiduboxapp/i.test(navigator.userAgent) + +export function initWebviewApi (readyCallback) { + if (!isBaidu) { + return + } + setTimeout(() => { + document.addEventListener('DOMContentLoaded', readyCallback) + }, 0) + return window.swan.webView +} diff --git a/src/platforms/mp-qq/runtime/web-view.js b/src/platforms/mp-qq/runtime/web-view.js new file mode 100644 index 000000000..2794f88f2 --- /dev/null +++ b/src/platforms/mp-qq/runtime/web-view.js @@ -0,0 +1,18 @@ +const isQQ = window.qq && + window.qq.miniProgram && + /QQ/i.test(navigator.userAgent) && + /miniProgram/i.test(navigator.userAgent) + +export function initWebviewApi (readyCallback) { + if (!isQQ) { + return + } + setTimeout(() => { + if (window.QQJSBridge && window.QQJSBridge.invoke) { + readyCallback() + } else { + document.addEventListener('QQJSBridgeReady', readyCallback) + } + }, 0) + return window.qq.miniProgram +} diff --git a/src/platforms/mp-toutiao/runtime/web-view.js b/src/platforms/mp-toutiao/runtime/web-view.js new file mode 100644 index 000000000..45092fc18 --- /dev/null +++ b/src/platforms/mp-toutiao/runtime/web-view.js @@ -0,0 +1,13 @@ +const isToutiao = window.tt && + window.tt.miniProgram && + /toutiaomicroapp/i.test(navigator.userAgent) + +export function initWebviewApi (readyCallback) { + if (!isToutiao) { + return + } + setTimeout(() => { + document.addEventListener('DOMContentLoaded', readyCallback) + }, 0) + return window.tt.miniProgram +} diff --git a/src/platforms/mp-weixin/runtime/web-view.js b/src/platforms/mp-weixin/runtime/web-view.js new file mode 100644 index 000000000..f96217ac7 --- /dev/null +++ b/src/platforms/mp-weixin/runtime/web-view.js @@ -0,0 +1,18 @@ +const isWeixin = window.wx && + window.wx.miniProgram && + /micromessenger/i.test(navigator.userAgent) && + /miniProgram/i.test(navigator.userAgent) + +export function initWebviewApi (readyCallback) { + if (!isWeixin) { + return + } + setTimeout(() => { + if (window.WeixinJSBridge && window.WeixinJSBridge.invoke) { + readyCallback() + } else { + document.addEventListener('WeixinJSBridgeReady', readyCallback) + } + }, 0) + return window.wx.miniProgram +} diff --git a/yarn.lock b/yarn.lock index 6948c2fd2..4243422f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2496,6 +2496,10 @@ commander@~2.19.0: version "2.19.0" resolved "https://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" +commander@~2.20.3: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + commondir@^1.0.1: version "1.0.1" resolved "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -5403,7 +5407,7 @@ jest-watcher@^24.9.0: jest-util "^24.9.0" string-length "^2.0.0" -jest-worker@^24.6.0, jest-worker@^24.9.0: +jest-worker@^24.0.0, jest-worker@^24.6.0, jest-worker@^24.9.0: version "24.9.0" resolved "https://registry.npm.taobao.org/jest-worker/download/jest-worker-24.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjest-worker%2Fdownload%2Fjest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" dependencies: @@ -7683,6 +7687,13 @@ rollup-plugin-alias@^1.4.0: dependencies: slash "^3.0.0" +rollup-plugin-babel@^4.3.3: + version "4.3.3" + resolved "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.3.3.tgz#7eb5ac16d9b5831c3fd5d97e8df77ba25c72a2aa" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + rollup-pluginutils "^2.8.1" + rollup-plugin-commonjs@^10.0.1: version "10.0.1" resolved "https://registry.npm.taobao.org/rollup-plugin-commonjs/download/rollup-plugin-commonjs-10.0.1.tgz#fbfcadf4ce2e826068e056a9f5c19287d9744ddf" @@ -7710,6 +7721,15 @@ rollup-plugin-replace@^2.1.0: magic-string "^0.25.2" rollup-pluginutils "^2.6.0" +rollup-plugin-uglify@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-6.0.3.tgz#e3f776171344b580bec6c6ab8888622b67099457" + dependencies: + "@babel/code-frame" "^7.0.0" + jest-worker "^24.0.0" + serialize-javascript "^1.9.0" + uglify-js "^3.4.9" + rollup-pluginutils@^2.6.0, rollup-pluginutils@^2.8.1: version "2.8.1" resolved "https://registry.npm.taobao.org/rollup-pluginutils/download/rollup-pluginutils-2.8.1.tgz#8fa6dd0697344938ef26c2c09d2488ce9e33ce97" @@ -7865,6 +7885,10 @@ serialize-javascript@^1.4.0, serialize-javascript@^1.7.0: version "1.7.0" resolved "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" +serialize-javascript@^1.9.0: + version "1.9.1" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.npm.taobao.org/serve-index/download/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -8660,6 +8684,13 @@ uglify-js@^3.1.4: commander "~2.20.0" source-map "~0.6.1" +uglify-js@^3.4.9: + version "3.6.9" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.9.tgz#85d353edb6ddfb62a9d798f36e91792249320611" + dependencies: + commander "~2.20.3" + source-map "~0.6.1" + unc-path-regex@^0.1.0: version "0.1.2" resolved "https://registry.npm.taobao.org/unc-path-regex/download/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" -- GitLab