提交 90fb0799 编写于 作者: 石小磊 提交者: 折腾笔记

feat: 支持京东小程序

上级 2aaef88f
......@@ -32,6 +32,10 @@ const PLATFORMS = {
prefix: 'tt',
title: '飞书小程序'
},
'mp-jd': {
prefix: 'jd',
title: '京东小程序'
},
'quickapp-webview': {
prefix: 'qa',
title: '快应用(Webview)版'
......
......@@ -20,11 +20,12 @@
"build:mp-toutiao": "cross-env UNI_PLATFORM=mp-toutiao rollup -c build/rollup.config.mp.js",
"build:mp-kuaishou": "cross-env UNI_PLATFORM=mp-kuaishou rollup -c build/rollup.config.mp.js",
"build:mp-lark": "cross-env UNI_PLATFORM=mp-lark rollup -c build/rollup.config.mp.js",
"build:mp-jd": "cross-env UNI_PLATFORM=mp-jd rollup -c build/rollup.config.mp.js",
"build:quickapp-webview": "cross-env UNI_PLATFORM=quickapp-webview rollup -c build/rollup.config.mp.js",
"build:mp-weixin:mp": "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-native": "cross-env NODE_ENV=development node build/build.qa.js && cross-env NODE_ENV=production node build/build.qa.js",
"build:runtime": "npm run lint && npm run build:mp-weixin && npm run build:mp-qq && npm run build:mp-alipay && npm run build:mp-baidu && npm run build:mp-toutiao && npm run build:app-plus && npm run build:quickapp-webview && npm run build:quickapp-native && npm run build:mp-kuaishou && npm run build:mp-lark",
"build:runtime": "npm run lint && npm run build:mp-weixin && npm run build:mp-qq && npm run build:mp-alipay && npm run build:mp-baidu && npm run build:mp-toutiao && npm run build:mp-jd && npm run build:app-plus && npm run build:quickapp-webview && npm run build:quickapp-native && npm run build:mp-kuaishou && npm run build:mp-lark",
"build:stat": "npm run lint && rollup -c build/rollup.config.stat.js",
"build:web-view": "rollup -c build/rollup.config.web-view.js",
"test:cli": "cross-env NODE_ENV=test jest",
......
......@@ -7,7 +7,8 @@ const PLATFORMS = [
'mp-qq',
'mp-baidu',
'mp-alipay',
'mp-toutiao'
'mp-toutiao',
'mp-jd',
]
module.exports = {
......
......@@ -11,6 +11,7 @@ const inlineLimit =
process.env.UNI_PLATFORM === 'mp-toutiao' ||
process.env.UNI_PLATFORM === 'mp-kuaishou' ||
process.env.UNI_PLATFORM === 'mp-lark' ||
process.env.UNI_PLATFORM === 'mp-jd' ||
process.env.UNI_PLATFORM === 'app-plus' // v2需要base64,v3需要rewriteUrl
// mp-weixin,mp-qq,app-plus 非v3(即:需要base64的平台)
......
# `uni-mp-jd`
> TODO: description
## Usage
```
const uniMpJD = require('uni-mp-jd');
// TODO: DEMONSTRATE API
```
此差异已折叠。
const compiler = require('@dcloudio/uni-mp-weixin/lib/uni.compiler.js')
module.exports = Object.assign({}, compiler, {
directive: 'jd:'
})
module.exports = {
options: {
cssVars: {
'--status-bar-height': '25px',
'--window-top': '0px',
'--window-bottom': '0px',
'--window-left': '0px',
'--window-right': '0px'
},
extnames: {
style: '.jxss',
template: '.jxml'
},
project: 'project.config.json'
},
copyWebpackOptions (platformOptions, vueOptions) {
const copyOptions = ['jdcomponents']
global.uniModules.forEach(module => {
copyOptions.push('uni_modules/' + module + '/jdcomponents')
})
return copyOptions
}
}
{
"name": "@dcloudio/uni-mp-jd",
"version": "2.0.0-32920211029001",
"description": "uni-app mp-jd",
"main": "dist/index.js",
"repository": {
"type": "git",
"url": "git+https://github.com/dcloudio/uni-app.git",
"directory": "packages/uni-mp-jd"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "shixiaolei6",
"license": "Apache-2.0",
"uni-app": {
"name": "mp-jd",
"title": "京东小程序"
},
"gitHead": "9e2d0f8e244724fcd64880316c57d837d1778cf8"
}
......@@ -5,6 +5,7 @@ const PLATFORMS = [
'mp-qq',
'mp-baidu',
'mp-alipay',
'mp-jd',
'mp-toutiao',
'quickapp-native'
]
......@@ -62,4 +63,4 @@ module.exports = function parseDisplay(manifest, pages, globalStyle = {}) {
display.pages[key] = parseStyle(page.style)
})
manifest.display = display
}
}
import { version } from '../package.json';
import { version } from '../package.json';
const STAT_VERSION = version;
const STAT_URL = 'https://tongji.dcloud.io/uni/stat';
const STAT_H5_URL = 'https://tongji.dcloud.io/uni/stat.gif';
const PAGE_PVER_TIME = 1800;
const APP_PVER_TIME = 300;
const OPERATING_TIME = 10;
const DIFF_TIME = 60 * 1000 * 60 * 24;
const OPERATING_TIME = 10;
const DIFF_TIME = 60 * 1000 * 60 * 24;
const statConfig = require('uni-stat-config').default || require('uni-stat-config');
const UUID_KEY = '__DC_STAT_UUID';
const UUID_VALUE = '__DC_UUID_VALUE';
......@@ -80,6 +80,7 @@ const getPlatformName = () => {
'mp-baidu': 'bd',
'mp-toutiao': 'tt',
'mp-qq': 'qq',
'mp-jd': 'jd',
'quickapp-native': 'qn',
'mp-kuaishou': 'ks'
};
......@@ -390,8 +391,8 @@ const requestData = (done) => {
});
}
});
};
};
const PagesJson = require('uni-pages?{"type":"style"}').default;
const statConfig$1 = require('uni-stat-config').default || require('uni-stat-config');
......@@ -927,8 +928,8 @@ class Stat extends Util {
};
this.request(options);
}
}
}
const stat = Stat.getInstance();
let isHide = false;
const lifecycle = {
......@@ -981,4 +982,4 @@ function main() {
}
}
main();
main();
......@@ -78,6 +78,7 @@ export const getPlatformName = () => {
'mp-baidu': 'bd',
'mp-toutiao': 'tt',
'mp-qq': 'qq',
'mp-jd': 'jd',
'quickapp-native': 'qn',
'mp-kuaishou': 'ks',
'mp-lark': 'lark'
......
......@@ -231,7 +231,7 @@ function traverseDataNode (dataNode, state, node) {
let key
// 自定义组件不支持 hidden 属性
const platform = state.options.platform.name
const platforms = ['mp-weixin', 'mp-qq', 'mp-toutiao', 'mp-lark']
const platforms = ['mp-weixin', 'mp-qq','mp-jd', 'mp-toutiao', 'mp-lark']
if (isComponent(node.type) && platforms.includes(platform)) {
// 字节跳动|飞书小程序自定义属性不会反应在DOM上,只能使用事件格式
key = `${platform === 'mp-toutiao' || platform === 'mp-lark' ? 'bind:-' : ''}${ATTE_DATA_CUSTOM_HIDDEN}`
......
......@@ -48,7 +48,7 @@ module.exports = (api, options) => {
return buildManifestJson()
}
const platforms = ['mp-weixin', 'mp-qq', 'mp-baidu', 'mp-alipay', 'mp-toutiao', 'mp-lark']
const platforms = ['mp-weixin', 'mp-qq','mp-jd', 'mp-baidu', 'mp-alipay', 'mp-toutiao', 'mp-lark']
if (args.subpackage && platforms.includes(process.env.UNI_PLATFORM)) {
process.env.UNI_SUBPACKGE = args.subpackage
}
......@@ -281,4 +281,4 @@ function buildManifestJson () {
done
} = require('@vue/cli-shared-utils')
done('Build complete.')
}
}
......@@ -84,6 +84,7 @@ const getPlatformName = () => {
'mp-baidu': 'bd',
'mp-toutiao': 'tt',
'mp-qq': 'qq',
'mp-jd': 'jd',
'quickapp-native': 'qn',
'mp-kuaishou': 'ks',
};
......
......@@ -82,6 +82,7 @@ const getPlatformName = () => {
'mp-baidu': 'bd',
'mp-toutiao': 'tt',
'mp-qq': 'qq',
'mp-jd': 'jd',
'quickapp-native': 'qn',
'mp-kuaishou': 'ks',
};
......
......@@ -47,7 +47,7 @@ module.exports = function generateApp (compilation) {
// 框架预设样式 用于隐藏自定义组件
// TODO 分平台 import 不同 css
const platforms = ['mp-weixin', 'mp-qq', 'mp-toutiao', 'mp-lark']
const platforms = ['mp-weixin', 'mp-qq', 'mp-jd','mp-toutiao', 'mp-lark']
const presetStyle = platforms.includes(process.env.UNI_PLATFORM) ? '[data-custom-hidden="true"],[bind-data-custom-hidden="true"]{display: none !important;}' : ''
if (compilation.assets[`common/main${ext}`]) { // 是否存在 main.css
......
module.exports = function (pagesJson, manifestJson) {
const {
app,
project
} = require('../mp')(pagesJson, manifestJson, require('./project.config.json'))
return [app, project]
}
{
"setting": {
"urlCheck": true,
"es6": false,
"postcss": false,
"minified": false,
"newFeature": true
},
"appid": "testAppId",
"projectname": ""
}
......@@ -32,6 +32,9 @@ import {
import {
initWebviewApi as initLarkWebviewApi
} from 'uni-platforms/mp-lark/runtime/web-view'
import {
initWebviewApi as initJDWebviewApi
} from 'uni-platforms/mp-jd/runtime/web-view'
const UniAppJSBridgeReady = function () {
window.UniAppJSBridge = true
......@@ -51,6 +54,7 @@ const initWebviewApis = [
initQuickappWebviewApi,
initKuaishouWebviewApi,
initLarkWebviewApi,
initJDWebviewApi,
initH5WebviewApi
]
......
import navigateTo from 'uni-helpers/navigate-to'
import redirectTo from '../../../mp-weixin/helpers/redirect-to'
import previewImage from '../../../mp-weixin/helpers/normalize-preview-image'
import getSystemInfo from '../../../mp-weixin/helpers/system-info'
import getUserProfile from '../../../mp-weixin/helpers/get-user-profile'
export const protocols = {
navigateTo,
redirectTo,
previewImage,
getSystemInfo,
getSystemInfoSync: getSystemInfo,
getUserProfile
}
export const todos = [
]
export const canIUses = []
export default {
oauth: ['jd'],
share: ['jd'],
payment: [''],
push: ['']
}
import '../../mp-weixin/runtime/index'
const isJD = window.jd &&
window.jd.miniProgram &&
/micromessenger/i.test(navigator.userAgent) &&
/miniProgram/i.test(navigator.userAgent)
export function initWebviewApi (readyCallback) {
if (!isJD) {
return
}
if (window.JDJSBridgeReady && window.JDJSBridgeReady.invoke) {
setTimeout(readyCallback, 0)
} else {
document.addEventListener('JDJSBridgeReady', readyCallback)
}
return window.jd.miniProgram
}
import parseBaseApp from '../../../mp-weixin/runtime/wrapper/app-parser'
export default function parseApp (vm) {
return parseBaseApp(vm)
}
import Vue from 'vue'
import {
initData,
initSlots,
initVueIds,
handleEvent,
initBehaviors,
initProperties,
initVueComponent
} from 'uni-wrapper/util'
import {
handleLink,
initBehavior
} from './util'
export default function parseBaseComponent (vueComponentOptions, {
isPage,
initRelation
} = {}) {
const [VueComponent, vueOptions] = initVueComponent(Vue, vueComponentOptions)
const options = {
multipleSlots: true,
addGlobalClass: true,
...(vueOptions.options || {})
}
const componentOptions = {
options,
data: initData(vueOptions, Vue.prototype),
behaviors: initBehaviors(vueOptions, initBehavior),
properties: initProperties(vueOptions.props, false, vueOptions.__file),
lifetimes: {
attached () {
const properties = this.properties
const options = {
mpType: isPage.call(this) ? 'page' : 'component',
mpInstance: this,
propsData: properties
}
initVueIds(properties.vueId, this)
// 处理父子关系
initRelation.call(this, {
vuePid: this._$vuePid,
vueOptions: options
})
// 初始化 vue 实例
this.$vm = new VueComponent(options)
// 处理$slots,$scopedSlots(暂不支持动态变化$slots)
initSlots(this.$vm, properties.vueSlots)
// 触发首次 setData
this.$vm.$mount()
},
ready () {
// 当组件 props 默认值为 true,初始化时传入 false 会导致 created,ready 触发, 但 attached 不触发
// https://developers.weixin.qq.com/community/develop/doc/00066ae2844cc0f8eb883e2a557800
if (this.$vm) {
this.$vm._isMounted = true
this.$vm.__call_hook('mounted')
this.$vm.__call_hook('onReady')
} else {
// this.is && console.warn(this.is + ' is not attached')
}
},
detached () {
this.$vm && this.$vm.$destroy()
},
},
pageLifetimes: {
show (args) {
this.$vm && this.$vm.__call_hook('onPageShow', args)
},
hide () {
this.$vm && this.$vm.__call_hook('onPageHide')
},
resize (size) {
this.$vm && this.$vm.__call_hook('onPageResize', size)
}
},
attached () {
const properties = this.properties
const options = {
mpType: isPage.call(this) ? 'page' : 'component',
mpInstance: this,
propsData: properties
}
initVueIds(properties.vueId, this)
// 处理父子关系
initRelation.call(this, {
vuePid: this._$vuePid,
vueOptions: options
})
// 初始化 vue 实例
this.$vm = new VueComponent(options)
// 处理$slots,$scopedSlots(暂不支持动态变化$slots)
initSlots(this.$vm, properties.vueSlots)
// 触发首次 setData
this.$vm.$mount()
},
ready () {
// 当组件 props 默认值为 true,初始化时传入 false 会导致 created,ready 触发, 但 attached 不触发
// https://developers.weixin.qq.com/community/develop/doc/00066ae2844cc0f8eb883e2a557800
if (this.$vm) {
this.$vm._isMounted = true
this.$vm.__call_hook('mounted')
this.$vm.__call_hook('onReady')
} else {
// this.is && console.warn(this.is + ' is not attached')
}
},
detached () {
this.$vm && this.$vm.$destroy()
},
methods: {
__l: handleLink,
__e: handleEvent
}
}
// externalClasses
if (vueOptions.externalClasses) {
componentOptions.externalClasses = vueOptions.externalClasses
}
if (Array.isArray(vueOptions.wxsCallMethods)) {
vueOptions.wxsCallMethods.forEach(callMethod => {
componentOptions.methods[callMethod] = function (args) {
return this.$vm[callMethod](args)
}
})
}
if (isPage) {
return componentOptions
}
return [componentOptions, VueComponent]
}
import parseBasePage from '../../../mp-weixin/runtime/wrapper/page-parser'
export default function parsePage (vuePageOptions) {
return parseBasePage(vuePageOptions)
}
export const mocks = ['__route__', '__wxExparserNodeId__', '__wxWebviewId__']
export function findVmByVueId (vm, vuePid) {
const $children = vm.$children
// 优先查找直属(反向查找:https://github.com/dcloudio/uni-app/issues/1200)
for (let i = $children.length - 1; i >= 0; i--) {
const childVm = $children[i]
if (childVm.$scope._$vueId === vuePid) {
return childVm
}
}
// 反向递归查找
let parentVm
for (let i = $children.length - 1; i >= 0; i--) {
parentVm = findVmByVueId($children[i], vuePid)
if (parentVm) {
return parentVm
}
}
}
export function initBehavior (options) {
return Behavior(options)
}
export function isPage () {
return !!this.route
}
export function initRelation (detail) {
this.triggerEvent('__l', detail)
}
function selectAllComponents (mpInstance, selector, $refs) {
const components = mpInstance.selectAllComponents(selector)
components.forEach(component => {
const ref = component.dataset.ref
$refs[ref] = component.$vm || component
if (__PLATFORM__ === 'mp-weixin') {
if (component.dataset.vueGeneric === 'scoped') {
component.selectAllComponents('.scoped-ref').forEach(scopedComponent => {
selectAllComponents(scopedComponent, selector, $refs)
})
}
}
})
}
export function initRefs (vm) {
const mpInstance = vm.$scope
Object.defineProperty(vm, '$refs', {
get () {
const $refs = {}
selectAllComponents(mpInstance, '.vue-ref', $refs)
// TODO 暂不考虑 for 中的 scoped
const forComponents = mpInstance.selectAllComponents('.vue-ref-in-for')
forComponents.forEach(component => {
const ref = component.dataset.ref
if (!$refs[ref]) {
$refs[ref] = []
}
$refs[ref].push(component.$vm || component)
})
return $refs
}
})
}
export function handleLink (event) {
const {
vuePid,
vueOptions
} = event.detail || event.value // detail 是微信,value 是百度(dipatch)
let parentVm
if (vuePid) {
parentVm = findVmByVueId(this.$vm, vuePid)
}
if (!parentVm) {
parentVm = this.$vm
}
vueOptions.parent = parentVm
}
......@@ -110,7 +110,7 @@ export default function parseBaseApp (vm, {
initRefs
}) {
initEventChannel()
if (__PLATFORM__ === 'mp-weixin' || __PLATFORM__ === 'mp-qq' || __PLATFORM__ === 'mp-toutiao' || __PLATFORM__ ===
if (__PLATFORM__ === 'mp-weixin' || __PLATFORM__ === 'mp-qq'|| __PLATFORM__ === 'mp-jd' || __PLATFORM__ === 'mp-toutiao' || __PLATFORM__ ===
'mp-kuaishou' || __PLATFORM__ === 'mp-alipay' || __PLATFORM__ === 'mp-baidu' || __PLATFORM__ === 'mp-lark') {
initScopedSlotsParams()
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册