提交 8b93f24d 编写于 作者: fxy060608's avatar fxy060608

feat: init quickapp-light

上级 ad27f7ca
......@@ -23,7 +23,7 @@ const PLATFORMS = {
prefix: 'tt',
title: '头条小程序'
},
'mp-quickapp': {
'quickapp-light': {
prefix: 'qa',
title: '快应用(Light)版'
},
......@@ -64,4 +64,4 @@ module.exports = {
})
],
external: ['vue']
}
}
......@@ -22,8 +22,8 @@
"build:mp-weixin": "cross-env UNI_PLATFORM=mp-weixin rollup -c build/rollup.config.mp.js",
"build:mp-baidu": "cross-env UNI_PLATFORM=mp-baidu rollup -c build/rollup.config.mp.js",
"build:mp-alipay": "cross-env UNI_PLATFORM=mp-alipay rollup -c build/rollup.config.mp.js",
"build:mp-toutiao": "cross-env UNI_PLATFORM=mp-toutiao rollup -c build/rollup.config.mp.js",
"build:mp-quickapp": "cross-env UNI_PLATFORM=mp-quickapp rollup -c build/rollup.config.mp.js",
"build:mp-toutiao": "cross-env UNI_PLATFORM=mp-toutiao rollup -c build/rollup.config.mp.js",
"build:quickapp-light": "cross-env UNI_PLATFORM=quickapp-light rollup -c build/rollup.config.mp.js",
"build:mp-weixin:mp": "npm run lint && cross-env UNI_PLATFORM=mp-weixin UNI_MP=true rollup -c build/rollup.config.mp.js",
"build:mp-weixin:wxs": "rollup -c build/rollup.config.wxs.js",
"build:quickapp": "cross-env NODE_ENV=development node build/build.qa.js && cross-env NODE_ENV=production node build/build.qa.js",
......@@ -111,7 +111,7 @@
"my": true,
"swan": true,
"tt": true,
"qh": true,
"qh": true,
"qa": true,
"HWH5": true,
"weex": true,
......@@ -147,4 +147,4 @@
"main": "index.js",
"description": "",
"author": ""
}
}
......@@ -165,7 +165,8 @@ var serviceContext = (function () {
'startPullDownRefresh',
'stopPullDownRefresh',
'createSelectorQuery',
'createIntersectionObserver'
'createIntersectionObserver',
'getMenuButtonBoundingClientRect'
];
const event = [
......@@ -649,7 +650,7 @@ var serviceContext = (function () {
const ASYNC_API = ['createBLEConnection'];
const CALLBACK_API_RE = /^on/;
const CALLBACK_API_RE = /^on|^off/;
function isContextApi (name) {
return CONTEXT_API_RE.test(name)
......@@ -2970,7 +2971,7 @@ var serviceContext = (function () {
}
function getScreenInfo () {
const { resolutionWidth, resolutionHeight } = plus.screen.getCureentSize();
const { resolutionWidth, resolutionHeight } = plus.screen.getCurrentSize();
return {
screenWidth: Math.round(resolutionWidth),
screenHeight: Math.round(resolutionHeight)
......@@ -5651,14 +5652,21 @@ var serviceContext = (function () {
openLocation: openLocation$1
});
function openLocation$2 (data) {
function openLocation$2 (data, callbackId) {
showPage({
url: '__uniappopenlocation',
data,
style: {
titleNView: {
type: 'transparent'
}
},
popGesture: 'close',
backButtonAutoControl: 'close'
},
onClose () {
invoke$1(callbackId, {
errMsg: 'openLocation:fail cancel'
});
}
});
return {
......@@ -9253,17 +9261,14 @@ var serviceContext = (function () {
const eventNames = [
'load',
'close',
'verify',
'error'
];
const ERROR_CODE_LIST = [-5001, -5002, -5003, -5004, -5005, -5006];
class RewardedVideoAd {
constructor (adpid) {
this._options = {
adpid: adpid
};
constructor (options = {}) {
const _callbacks = this._callbacks = {};
eventNames.forEach(item => {
_callbacks[item] = [];
......@@ -9277,7 +9282,7 @@ var serviceContext = (function () {
this._adError = '';
this._loadPromiseResolve = null;
this._loadPromiseReject = null;
const rewardAd = this._rewardAd = plus.ad.createRewardedVideoAd(this._options);
const rewardAd = this._rewardAd = plus.ad.createRewardedVideoAd(options);
rewardAd.onLoad((e) => {
this._isLoad = true;
this._dispatchEvent('load', {});
......@@ -9290,6 +9295,9 @@ var serviceContext = (function () {
this._loadAd();
this._dispatchEvent('close', { isEnded: e.isEnded });
});
rewardAd.onVerify && rewardAd.onVerify((e) => {
this._dispatchEvent('verify', { isValid: e.isValid });
});
rewardAd.onError((e) => {
const { code, message } = e;
const data = { code: code, errMsg: message };
......@@ -9323,6 +9331,12 @@ var serviceContext = (function () {
}
})
}
getProvider () {
return this._rewardAd.getProvider()
}
destroy () {
this._rewardAd.destroy();
}
_loadAd () {
this._isLoad = false;
this._rewardAd.load();
......@@ -9336,10 +9350,8 @@ var serviceContext = (function () {
}
}
function createRewardedVideoAd ({
adpid = ''
} = {}) {
return new RewardedVideoAd(adpid)
function createRewardedVideoAd (options) {
return new RewardedVideoAd(options)
}
......@@ -10646,8 +10658,9 @@ var serviceContext = (function () {
var cId = canvasEventCallbacks.push(function (data) {
invoke$1(callbackId, data);
});
// fix ...
operateCanvas(canvasId, pageId, 'putImageData', {
data: [...data],
data: Array.prototype.slice.call(data),
x,
y,
width,
......@@ -10729,17 +10742,13 @@ var serviceContext = (function () {
callback.invoke(callbackId, data);
});
const methods = ['getCenterLocation', 'getScale', 'getRegion', 'includePoints', 'translateMarker'];
const methods = ['getCenterLocation', 'moveToLocation', 'getScale', 'getRegion', 'includePoints', 'translateMarker'];
class MapContext {
constructor (id, pageVm) {
this.id = id;
this.pageVm = pageVm;
}
moveToLocation () {
operateMapPlayer$3(this.id, this.pageVm, 'moveToLocation');
}
}
MapContext.prototype.$getAppMap = function () {
......@@ -12146,7 +12155,7 @@ var serviceContext = (function () {
return
}
if (!page.$page.meta.isNVue) {
const target = page.$vm._$vd.elements.find(target => target.tagName === 'web-view' && target.events['message']);
const target = page.$vm._$vd.elements.find(target => target.type === 'web-view' && target.events['message']);
if (!target) {
return
}
......@@ -13191,8 +13200,7 @@ var serviceContext = (function () {
cur = newObj[key];
old = oldObj[key];
if (old !== cur) {
// 全量同步 style (因为 style 可能会动态删除部分样式)
if (key === B_STYLE && isPlainObject(cur) && isPlainObject(old)) {
if (key === B_STYLE && isPlainObject(cur) && isPlainObject(old)) { // 全量同步 style (因为 style 可能会动态删除部分样式)
if (Object.keys(cur).length !== Object.keys(old).length) { // 长度不等
setResult(result || (result = Object.create(null)), B_STYLE, cur);
} else {
......@@ -13203,6 +13211,14 @@ var serviceContext = (function () {
const vFor = diffArray(cur, old);
vFor && setResult(result || (result = Object.create(null)), V_FOR, vFor);
} else {
if (key.indexOf('change:') === 0) { // wxs change:prop
try {
// 先简单的用 stringify 判断
if (JSON.stringify(cur) === JSON.stringify(old)) {
continue
}
} catch (e) {}
}
setResult(result || (result = Object.create(null)), key, cur);
}
}
......
此差异已折叠。
{
"compilerOptions": {
"target": "es6",
"module": "commonjs"
}
}
\ No newline at end of file
const compiler = require('@dcloudio/uni-mp-weixin/lib/uni.compiler.js')
module.exports = Object.assign({}, compiler, {
directive: 'qa:'
})
const fs = require('fs')
const path = require('path')
module.exports = {
options: {
cssVars: {
'--status-bar-height': '25px',
'--window-top': '0px',
'--window-bottom': '0px'
},
extnames: {
style: '.css',
template: '.qxml',
filter: '.qjs'
},
filterTag: 'qjs'
},
validate (platformOptions, manifestJson) {
if (!platformOptions.package) {
console.warn('manifest.json->quickapp-light 缺少 package 配置')
}
if (!platformOptions.icon) {
console.error('manifest.json->quickapp-light 缺少 icon 配置')
}
},
copyWebpackOptions (platformOptions, vueOptions) {
const jsConfigPath = path.resolve(process.env.UNI_INPUT_DIR, 'jsconfig.json')
if (fs.existsSync(jsConfigPath)) {
return [jsConfigPath]
}
return [path.resolve(__dirname, 'assets/jsconfig.json')]
},
configureWebpack () {
return {
devtool: process.env.NODE_ENV === 'production' ? false : 'inline-source-map'
}
}
}
{
"name": "@dcloudio/uni-quickapp-light",
"version": "2.0.0-alpha-26420200309002",
"description": "uni-app quickapp-light",
"main": "dist/index.js",
"repository": {
"type": "git",
"url": "git+https://github.com/dcloudio/uni-app.git",
"directory": "packages/uni-quickapp-light"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "fxy060608",
"license": "Apache-2.0",
"uni-app": {
"name": "quickapp-light",
"title": "快应用(Light)版"
},
"gitHead": "84e9cb1ca1898054d161f1514efadd1ab24fd804"
}
const compiler = require('../lib')
function assertCodegen (template, templateCode, renderCode = `with(this){}`, options = {}) {
const res = compiler.compile(template, {
resourcePath: 'test.qxml',
mp: Object.assign({
minified: true,
isTest: true,
platform: 'quickapp-light'
}, options)
})
expect(res.template).toBe(templateCode)
expect(res.render).toBe(renderCode)
}
describe('mp:compiler-quickapp-light', () => {
it('generate v-for directive', () => {
assertCodegen(
'<view><view v-for="(item,index) in items" :key="index"></view></view>',
`<view><block qa:for="{{items}}" qa:for-item="item" qa:for-index="index" qa:key="index"><view></view></block></view>`
)
})
it('generate v-else-if with v-else directive', () => {
assertCodegen(
'<view><view v-if="show">hello</view><view v-else-if="hide">world</view><view v-else>bye</view></view>',
`<view><block qa:if="{{show}}"><view>hello</view></block><block qa:else><block qa:if="{{hide}}"><view>world</view></block><block qa:else><view>bye</view></block></block></view>`
)
})
})
......@@ -4971,10 +4971,10 @@ function initMixin (Vue) {
initEvents(vm);
initRender(vm);
callHook(vm, 'beforeCreate');
vm.mpHost !== 'mp-toutiao' && initInjections(vm); // resolve injections before data/props
!vm._$fallback && initInjections(vm); // resolve injections before data/props
initState(vm);
vm.mpHost !== 'mp-toutiao' && initProvide(vm); // resolve provide after data/props
vm.mpHost !== 'mp-toutiao' && callHook(vm, 'created');
!vm._$fallback && initProvide(vm); // resolve provide after data/props
!vm._$fallback && callHook(vm, 'created');
/* istanbul ignore if */
if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
......@@ -5690,7 +5690,7 @@ function mountComponent$1(
}
}
vm.mpHost !== 'mp-toutiao' && callHook(vm, 'beforeMount');
!vm._$fallback && callHook(vm, 'beforeMount');
var updateComponent = function () {
vm._update(vm._render(), hydrating);
......
/**
* webpack-uni-pages-loader 待重构,需要将平台特有逻辑,收敛到各自包内
* @param {Object} pagesJson
* @param {Object} manifestJson
*/
module.exports = function (pagesJson, manifestJson) {
const {
app
} = require('../mp')(pagesJson, manifestJson)
const baseJson = {
minPlatformVersion: 1053
}
manifestJson.name && (baseJson.name = manifestJson.name)
manifestJson.versionName && (baseJson.versionName = manifestJson.versionName)
manifestJson.versionCode && (baseJson.versionCode = manifestJson.versionCode)
Object.assign(app.content, baseJson, manifestJson['quickapp-light'] || {})
if (!app.content.package) {
app.content.package = manifestJson.name
}
return [app]
}
......@@ -19,6 +19,9 @@ import {
import {
initWebviewApi as initWeixinWebviewApi
} from 'uni-platforms/mp-weixin/runtime/web-view'
import {
initWebviewApi as initQuickappWebviewApi
} from 'uni-platforms/quickapp-light/runtime/web-view'
const UniAppJSBridgeReady = function () {
window.UniAppJSBridge = true
......@@ -35,6 +38,7 @@ const initWebviewApis = [
initAlipayWebviewApi,
initBaiduWebviewApi,
initToutiaoWebviewApi,
initQuickappWebviewApi,
initH5WebviewApi
]
......@@ -61,4 +65,4 @@ if (!api.navigateTo) {
}
api.webView = webViewApi
export default api
export default api
import previewImage from '../../../mp-weixin/helpers/normalize-preview-image'
export const protocols = {
previewImage
}
export const todos = []
export const canIUses = []
const providers = {
oauth: [],
share: [],
payment: [],
push: []
}
if (qa.canIUse('getAccountProvider')) {
providers.oauth.push(qa.getAccountProvider())
}
if (qa.canIUse('getVendorPaymentProvider')) {
providers.payment.push(qa.getVendorPaymentProvider())
}
export default providers
import '../../mp-weixin/runtime/index'
const isQuickapp = window.qa &&
/quickapp/i.test(navigator.userAgent)
export function initWebviewApi (readyCallback) {
if (!isQuickapp) {
return
}
if (window.QaJSBridge && window.QaJSBridge.invoke) {
setTimeout(readyCallback, 0)
} else {
document.addEventListener('QaJSBridgeReady', readyCallback)
}
const {
navigateTo,
navigateBack,
switchTab,
reLaunch,
redirectTo,
postMessage,
getEnv
} = window.qa
return {
navigateTo,
navigateBack,
switchTab,
reLaunch,
redirectTo,
postMessage,
getEnv
}
}
import Vue from 'vue'
import parseBaseApp from '../../../mp-weixin/runtime/wrapper/app-base-parser'
import {
mocks,
initRefs
} from './util'
export default function parseApp (vm) {
Vue.prototype._$fallback = true // 降级(调整原 vue 的部分生命周期,如 created,beforeMount,inject,provide)
Vue.mixin({
created () { // 处理 injections, triggerEvent 是异步,且触发时机很慢,故延迟 relation 设置
if (this.mpType !== 'app') {
initRefs(this)
this.__init_injections(this)
this.__init_provide(this)
}
}
})
return parseBaseApp(vm, {
mocks,
initRefs: function () {} // attached 时,可能查询不到
})
}
import {
isPage,
initRelation,
handleLink
} from './util'
import {
initSlots,
initVueIds
} from 'uni-wrapper/util'
import parseBaseComponent from '../../../mp-weixin/runtime/wrapper/component-base-parser'
export default function parseComponent (vueOptions) {
const [componentOptions, VueComponent] = parseBaseComponent(vueOptions)
componentOptions.lifetimes.attached = function attached () {
const properties = this.properties
const options = {
mpType: isPage.call(this) ? 'page' : 'component',
mpInstance: this,
propsData: properties
}
initVueIds(properties.vueId, this)
// 初始化 vue 实例
this.$vm = new VueComponent(options)
// 处理$slots,$scopedSlots(暂不支持动态变化$slots)
initSlots(this.$vm, properties.vueSlots)
// 处理父子关系
initRelation.call(this, {
vuePid: this._$vuePid,
mpInstance: this
})
// 触发首次 setData
this.$vm.$mount()
}
// ready 比 handleLink 还早,初始化逻辑放到 handleLink 中
delete componentOptions.lifetimes.ready
componentOptions.methods.__l = handleLink
return componentOptions
}
import {
isPage,
instances,
initRelation
} from './util'
import parseBasePage from '../../../mp-weixin/runtime/wrapper/page-base-parser'
export default function parsePage (vuePageOptions) {
const pageOptions = parseBasePage(vuePageOptions, {
isPage,
initRelation
})
// 页面需要在 ready 中触发,其他组件是在 handleLink 中触发
pageOptions.lifetimes.ready = function ready () {
if (this.$vm && this.$vm.mpType === 'page') {
this.$vm.__call_hook('created')
this.$vm.__call_hook('beforeMount')
this.$vm._isMounted = true
this.$vm.__call_hook('mounted')
this.$vm.__call_hook('onReady')
} else {
this.is && console.warn(this.is + ' is not ready')
}
}
pageOptions.lifetimes.detached = function detached () {
this.$vm && this.$vm.$destroy()
// 清理
const pageId = this.pageinstance.__pageId__
Object.keys(instances).forEach(key => {
if (key.indexOf(pageId + '_') === 0) {
delete instances[key]
}
})
}
return pageOptions
}
export {
mocks,
isPage
}
from '../../../mp-baidu/runtime/wrapper/util'
export {
initRefs
}
from '../../../mp-weixin/runtime/wrapper/util'
export const instances = Object.create(null)
export function initRelation ({
vuePid,
mpInstance
}) {
// triggerEvent 后,接收事件时机特别晚,已经到了 ready 之后
const nodeId = mpInstance.nodeId + ''
const webviewId = mpInstance.pageinstance.__pageId__ + ''
instances[webviewId + '_' + nodeId] = mpInstance.$vm
this.triggerEvent('__l', {
vuePid,
nodeId,
webviewId
})
}
export function handleLink ({
detail: {
nodeId,
webviewId
}
}) {
const vm = instances[webviewId + '_' + nodeId]
if (!vm) {
return
}
let parentVm = instances[webviewId + '_' + vm.$scope.ownerId]
if (!parentVm) {
parentVm = this.$vm
}
vm.$parent = parentVm
vm.$root = parentVm.$root
parentVm.$children.push(vm)
const createdVm = function () {
vm.__call_hook('created')
}
const mountedVm = function () {
// 处理当前 vm 子
if (vm._$childVues) {
vm._$childVues.forEach(([createdVm]) => createdVm())
vm._$childVues.forEach(([, mountedVm]) => mountedVm())
delete vm._$childVues
}
vm.__call_hook('beforeMount')
vm._isMounted = true
vm.__call_hook('mounted')
vm.__call_hook('onReady')
}
// 当 parentVm 已经 mounted 时,直接触发,否则延迟
if (!parentVm || parentVm._isMounted) {
createdVm()
mountedVm()
} else {
(parentVm._$childVues || (parentVm._$childVues = [])).push([createdVm, mountedVm])
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册