提交 0596d62d 编写于 作者: fxy060608's avatar fxy060608

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

const path = require('path')
const webpack = require('webpack')
const moduleAlias = require('module-alias')
// TODO 重写 vue scoped(若升级 vue 编译器,需要确认该文件路径是否发生变化)
moduleAlias.addAlias('./stylePlugins/scoped', path.resolve(__dirname, './scoped.js'))
const {
parseEntry,
getMainEntry,
......
'use strict'
Object.defineProperty(exports, '__esModule', { value: true })
const postcss = require('postcss')
// postcss-selector-parser does have typings but it's problematic to work with.
const selectorParser = require('postcss-selector-parser')
exports.default = postcss.plugin('add-id', (options) => (root) => {
const id = options
const keyframes = Object.create(null)
root.each(function rewriteSelector (node) {
if (!node.selector) {
// handle media queries
if (node.type === 'atrule') {
if (node.name === 'media' || node.name === 'supports') {
node.each(rewriteSelector)
} else if (/-?keyframes$/.test(node.name)) {
// register keyframes
keyframes[node.params] = node.params = node.params + '-' + id
}
}
return
}
node.selector = selectorParser((selectors) => {
selectors.each((selector) => {
let node = null
selector.each((n) => {
// ">>>" combinator
// and /deep/ alias for >>>, since >>> doesn't work in SASS
if (n.type === 'combinator' &&
(n.value === '>>>' || n.value === '/deep/')) {
n.value = ' '
n.spaces.before = n.spaces.after = ''
return false
}
if (n.type !== 'pseudo' && n.type !== 'combinator') {
node = n
}
})
if (node) {
node.spaces.after = ''
} else {
// For deep selectors & standalone pseudo selectors,
// the attribute selectors are prepended rather than appended.
// So all leading spaces must be eliminated to avoid problems.
selector.first.spaces.before = ''
}
selector.insertAfter(node, selectorParser.className({
value: id
}))
})
}).processSync(node.selector)
})
// If keyframes are found in this <style>, find and rewrite animation names
// in declarations.
// Caveat: this only works for keyframes and animation rules in the same
// <style> element.
if (Object.keys(keyframes).length) {
root.walkDecls(decl => {
// individual animation-name declaration
if (/^(-\w+-)?animation-name$/.test(decl.prop)) {
decl.value = decl.value
.split(',')
.map(v => keyframes[v.trim()] || v.trim())
.join(',')
}
// shorthand
if (/^(-\w+-)?animation$/.test(decl.prop)) {
decl.value = decl.value
.split(',')
.map(v => {
const vals = v.trim().split(/\s+/)
const i = vals.findIndex(val => keyframes[val])
if (i !== -1) {
vals.splice(i, 1, keyframes[vals[i]])
return vals.join(' ')
} else {
return v
}
})
.join(',')
}
})
}
})
dist/compileTemplate
dist/parse
dist/parseCustomBlocks
\ No newline at end of file
dist/parseCustomBlocks
dist/stylePlugins/scoped.js
\ No newline at end of file
......@@ -58,9 +58,16 @@ exports.default = postcss.plugin('add-id', (options) => (root) => {
// So all leading spaces must be eliminated to avoid problems.
selector.first.spaces.before = '';
}
selector.insertAfter(node, selectorParser.attribute({
attribute: id
}));
// fixed by xxxxxx (h5 平台继续使用 attribute,其他平台使用 className)
if(process.env.UNI_PLATFORM === 'h5'){
selector.insertAfter(node, selectorParser.attribute({
attribute: id
}));
} else {
selector.insertAfter(node, selectorParser.className({
value: id
}));
}
});
}).processSync(node.selector);
});
......
<template>
<uni-ad
v-bind="attrs"
v-on="$listeners">
<div
ref="container"
class="uni-ad-container" />
</uni-ad>
</template>
<script>
import {
subscriber
} from 'uni-mixins'
import native from '../../mixins/native'
const methods = [
'draw'
]
const attrs = [
'adpid',
'data'
]
export default {
name: 'Ad',
mixins: [subscriber, native],
props: {
adpid: {
type: [Number, String],
default: ''
},
data: {
type: Object,
default: null
}
},
data () {
return {
hidden: false
}
},
computed: {
attrs () {
const obj = {}
attrs.forEach(key => {
let val = this.$props[key]
val = key === 'src' ? this.$getRealPath(val) : val
obj[key.replace(/[A-Z]/g, str => '-' + str.toLowerCase())] = val
})
return obj
}
},
watch: {
hidden (val) {
this.adView && this.adView[val ? 'hide' : 'show']()
},
adpid (val) {
if (val) {
this._loadData(val)
}
},
data (val) {
if (val) {
this._fillData(val)
}
}
},
mounted () {
let adStyle = Object.assign({
id: 'AdView' + Date.now()
}, this.position)
let adView = this.adView = plus.ad.createAdView(adStyle)
adView.interceptTouchEvent(false)
plus.webview.currentWebview().append(adView)
if (this.hidden) {
adView.hide()
}
this.$watch('attrs', () => {
this._request()
}, {
deep: true
})
this.$watch('position', () => {
this.adView && this.adView.setStyle(this.position)
}, {
deep: true
})
// 模板渲染有效
adView.setDislikeListener && adView.setDislikeListener((data) => {
this.adView && this.adView.close()
this.$refs.container.style.height = '0px'
this._updateView()
this.$trigger('close', {}, data)
})
adView.setRenderingListener && adView.setRenderingListener((data) => {
if (data.result === 0) {
this.$refs.container.style.height = data.height + 'px'
this._updateView()
} else {
this.$trigger('error', {}, {
errCode: data.result
})
}
})
// 仅 Android 下载类广告
adView.setDownloadListener && adView.setDownloadListener((data) => {
this.$trigger('downloadchange', {}, data)
})
this._request()
},
beforeDestroy () {
delete this.adView
},
methods: {
_handleSubscribe ({
type,
data = {}
}) {
if (methods.includes(type)) {
this.adView && this.adView[type](data)
}
},
_request () {
if (!this.adView) {
return
}
if (this.data) {
this._fillData(this.data)
} else if (this.adpid) {
this._loadData()
}
},
_loadData (adpid) {
plus.ad.getAds({
adpid: adpid || this.adpid,
count: 1,
width: this.position.width
},
(res) => {
this._fillData(res[0])
},
(err) => {
this.$trigger('error', {}, {
errCode: err.code,
errMsg: err.message
})
})
},
_fillData (data) {
this.adView.renderingBind(data)
// const height = plus.ad.measureAdHeight(this.position.width.replace('px', ''), data)
// this.$refs.container.style.height = height + 'px'
this.$trigger('load', {}, {})
},
_updateView () {
window.dispatchEvent(new CustomEvent('updateview'))
}
}
}
</script>
<style>
uni-ad {
display: block;
overflow: hidden;
}
uni-ad[hidden] {
display: none;
}
uni-ad .uni-ad-container {
width: 100%;
min-height: 1px;
}
</style>
......@@ -69,7 +69,7 @@ function broadcast (vm, componentName, eventName, ...params) {
})
}
const NATIVE_COMPONENTS = ['Camera', 'LivePlayer', 'LivePusher', 'Map', 'Video', 'CoverView', 'CoverImage']
const NATIVE_COMPONENTS = ['Camera', 'LivePlayer', 'LivePusher', 'Map', 'Video', 'CoverView', 'CoverImage', 'Ad']
function updateView () {
const pages = getCurrentPages()
......@@ -81,7 +81,8 @@ function updateView () {
)
}
window.addEventListener('resize', updateView)
window.addEventListener('resize', updateView)
window.addEventListener('updateview', updateView)
function vdSync ({
data,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册