diff --git a/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.service.spec.js b/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.service.spec.js
index 1ee21c560a42d63837d40e118fad9006f94dd506..0cbb251167de77fea5d444930ffed4231d55d592 100644
--- a/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.service.spec.js
+++ b/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.service.spec.js
@@ -79,10 +79,10 @@ describe('codegen', () => {
assertCodegen(
`
A{{ d | e | f }}B{{text}}C
`,
`with(this){return _c('div',{attrs:{"id":_$s(0,'a-id','a'+b),"_i":0}},[_v((_$s(0,'t0-0',_s(_f("f")(_f("e")(d)))))+(_$s(0,'t0-1',_s(text))))])}`
- )
- assertCodegen(
- `{{obj.param1}}123123{{obj.param1}}123123{{obj.param1}} -{{obj.param3}}---{{obj.param3}} {{obj.param2}}aaaa{{obj.param2}}aaaa{{obj.param2}}`,
- `with(this){return _c('view',[_v((_$s(0,'t0-0',_s(obj.param1)))+(_$s(0,'t0-1',_s(obj.param1)))+(_$s(0,'t0-2',_s(obj.param1)))),_c('text',[_v((_$s(1,'t0-0',_s(obj.param3)))+(_$s(1,'t0-1',_s(obj.param3))))]),_v((_$s(0,'t2-0',_s(obj.param2)))+(_$s(0,'t2-1',_s(obj.param2)))+(_$s(0,'t2-2',_s(obj.param2))))])}`
+ )
+ assertCodegen(
+ `{{obj.param1}}123123{{obj.param1}}123123{{obj.param1}} -{{obj.param3}}---{{obj.param3}} {{obj.param2}}aaaa{{obj.param2}}aaaa{{obj.param2}}`,
+ `with(this){return _c('view',[_v((_$s(0,'t0-0',_s(obj.param1)))+(_$s(0,'t0-1',_s(obj.param1)))+(_$s(0,'t0-2',_s(obj.param1)))),_c('text',[_v((_$s(1,'t0-0',_s(obj.param3)))+(_$s(1,'t0-1',_s(obj.param3))))]),_v((_$s(0,'t2-0',_s(obj.param2)))+(_$s(0,'t2-1',_s(obj.param2)))+(_$s(0,'t2-2',_s(obj.param2))))])}`
)
})
@@ -140,25 +140,48 @@ describe('codegen', () => {
'',
`with(this){return _c('view',{attrs:{"data-b":_$s(0,'a-data-b',b),"_i":0}})}`
)
- })
- it('generate v-if directive', () => {
- assertCodegen(
- '123d',
- `with(this){return (_$s(0,'i',a))?_c('text'):(_$s(1,'e',b))?_c('text'):(_$s(2,'e',c))?_c('text'):_c('text')}`
- )
- })
- it('generate dynamic slot', () => {
- assertCodegen(
- '',
- `with(this){return _c('base-layout',{attrs:{"_i":0},scopedSlots:_u([{key:_$s(1,'st',dynamicSlotName),fn:function(_empty_, _svm, _si){return undefined}}],null,true)})}`
- )
- })
-
- it('generate ref', () => {
- assertCodegen(
- '',
- `with(this){return _c('p',{ref:_$s(0,'ref',component1)})}`
- )
- })
+ })
+ it('generate v-if directive', () => {
+ assertCodegen(
+ '123d',
+ `with(this){return (_$s(0,'i',a))?_c('text'):(_$s(1,'e',b))?_c('text'):(_$s(2,'e',c))?_c('text'):_c('text')}`
+ )
+ })
+ it('generate dynamic slot', () => {
+ assertCodegen(
+ '',
+ `with(this){return _c('base-layout',{attrs:{"_i":0},scopedSlots:_u([{key:_$s(1,'st',dynamicSlotName),fn:function(_empty_, _svm, _si){return undefined}}],null,true)})}`
+ )
+ })
+
+ it('generate ref', () => {
+ assertCodegen(
+ '',
+ `with(this){return _c('p',{ref:_$s(0,'ref',component1)})}`
+ )
+ })
+
+ it('generate image', () => {
+ assertCodegen(
+ '',
+ `with(this){return _c('image',{attrs:{"src":_$s(0,'a-src',src),"_i":0}})}`
+ )
+ assertCodegen(
+ '',
+ `with(this){return _c('image',{attrs:{"_i":0}})}`
+ )
+ assertCodegen(
+ '',
+ `with(this){return _c('image',{attrs:{"src":_$s(0,'a-src',"/"+require("../static/logo.png")),"_i":0}})}`
+ )
+ assertCodegen(
+ '',
+ `with(this){return _c('image',{attrs:{"_i":0}})}`
+ )
+ assertCodegen(
+ '',
+ `with(this){return _c('image',{attrs:{"_i":0}})}`
+ )
+ })
})
/* eslint-enable quotes */
diff --git a/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.view.spec.js b/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.view.spec.js
index 8ffd4da7a788fd280e07397f181ce5b5faf532f9..261a67392a6f3afe385f4c9d2cd3d5d18ae71074 100644
--- a/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.view.spec.js
+++ b/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.view.spec.js
@@ -40,12 +40,12 @@ describe('codegen', () => {
'',
`with(this){return _c('div',{attrs:{"_i":0}},[_t("default",[_c('div',{attrs:{"_i":2}},[_v((_$g(2,'t0-0')))])],{"_i":1})],2)}`
)
- })
- it('generate text with multiple statements', () => {
- assertCodegen(
- `{{obj.param1}}123123{{obj.param1}}123123{{obj.param1}} -{{obj.param3}}---{{obj.param3}} {{obj.param2}}aaaa{{obj.param2}}aaaa{{obj.param2}}`,
- `with(this){return _c('v-uni-view',{attrs:{"_i":0}},[_v((_$g(0,'t0-0'))+"123123"+(_$g(0,'t0-1'))+"123123"+(_$g(0,'t0-2'))),_c('v-uni-text',{attrs:{"_i":1}},[_v("-"+(_$g(1,'t0-0'))+"---"+(_$g(1,'t0-1')))]),_v((_$g(0,'t2-0'))+"aaaa"+(_$g(0,'t2-1'))+"aaaa"+(_$g(0,'t2-2')))],1)}`
- )
+ })
+ it('generate text with multiple statements', () => {
+ assertCodegen(
+ `{{obj.param1}}123123{{obj.param1}}123123{{obj.param1}} -{{obj.param3}}---{{obj.param3}} {{obj.param2}}aaaa{{obj.param2}}aaaa{{obj.param2}}`,
+ `with(this){return _c('v-uni-view',{attrs:{"_i":0}},[_v((_$g(0,'t0-0'))+"123123"+(_$g(0,'t0-1'))+"123123"+(_$g(0,'t0-2'))),_c('v-uni-text',{attrs:{"_i":1}},[_v("-"+(_$g(1,'t0-0'))+"---"+(_$g(1,'t0-1')))]),_v((_$g(0,'t2-0'))+"aaaa"+(_$g(0,'t2-1'))+"aaaa"+(_$g(0,'t2-2')))],1)}`
+ )
})
it('generate v-slot', () => {
assertCodegen(
@@ -81,24 +81,46 @@ describe('codegen', () => {
'',
`with(this){return _c('v-uni-view',{attrs:{"data-a":"1","data-b":_$g(0,'a-data-b'),"_i":0}})}`
)
- })
- it('generate v-if directive', () => {
- assertCodegen(
- '123d',
- `with(this){return (_$g(0,'i'))?_c('v-uni-text',{attrs:{"_i":0}},[_v("1")]):(_$g(1,'e'))?_c('v-uni-text',{attrs:{"_i":1}},[_v("2")]):(_$g(2,'e'))?_c('v-uni-text',{attrs:{"_i":2}},[_v("3")]):_c('v-uni-text',{attrs:{"_i":3}},[_v("d")])}`
- )
- })
- it('generate dynamic slot', () => {
- assertCodegen(
- '',
- `with(this){return _c('base-layout',{attrs:{"_i":0},scopedSlots:_u([{key:_$g(1,'st'),fn:function(_empty_, _svm, _si){return undefined}}],null,true)})}`
- )
- })
- it('generate ref', () => {
- assertCodegen(
- '',
- `with(this){return _c('p',{ref:_$g(0,'ref'),attrs:{"_i":0}})}`
- )
+ })
+ it('generate v-if directive', () => {
+ assertCodegen(
+ '123d',
+ `with(this){return (_$g(0,'i'))?_c('v-uni-text',{attrs:{"_i":0}},[_v("1")]):(_$g(1,'e'))?_c('v-uni-text',{attrs:{"_i":1}},[_v("2")]):(_$g(2,'e'))?_c('v-uni-text',{attrs:{"_i":2}},[_v("3")]):_c('v-uni-text',{attrs:{"_i":3}},[_v("d")])}`
+ )
+ })
+ it('generate dynamic slot', () => {
+ assertCodegen(
+ '',
+ `with(this){return _c('base-layout',{attrs:{"_i":0},scopedSlots:_u([{key:_$g(1,'st'),fn:function(_empty_, _svm, _si){return undefined}}],null,true)})}`
+ )
+ })
+ it('generate ref', () => {
+ assertCodegen(
+ '',
+ `with(this){return _c('p',{ref:_$g(0,'ref'),attrs:{"_i":0}})}`
+ )
+ })
+ it('generate image', () => {
+ assertCodegen(
+ '',
+ `with(this){return _c('v-uni-image',{attrs:{"src":_$g(0,'a-src'),"_i":0}})}`
+ )
+ assertCodegen(
+ '',
+ `with(this){return _c('v-uni-image',{attrs:{"src":"/static/logo.png","_i":0}})}`
+ )
+ assertCodegen(
+ '',
+ `with(this){return _c('v-uni-image',{attrs:{"src":_$g(0,'a-src'),"_i":0}})}`
+ )
+ assertCodegen(
+ '',
+ `with(this){return _c('v-uni-image',{attrs:{"src":"/static/logo.png","_i":0}})}`
+ )
+ assertCodegen(
+ '',
+ `with(this){return _c('v-uni-image',{attrs:{"src":"/static/logo.png","_i":0}})}`
+ )
})
})
/* eslint-enable quotes */
diff --git a/packages/uni-template-compiler/lib/asset-url.js b/packages/uni-template-compiler/lib/asset-url.js
index 4e7232bfad52ea9444f3784278f1d9686cd7b1ba..d6b28096732b9322f09bb983905368719ac4413f 100644
--- a/packages/uni-template-compiler/lib/asset-url.js
+++ b/packages/uni-template-compiler/lib/asset-url.js
@@ -1,3 +1,5 @@
+const url = require('url')
+
const transformAssetUrls = {
'audio': 'src',
'video': ['src', 'poster'],
@@ -14,7 +16,47 @@ const transformAssetUrls = {
'u-video': ['src', 'poster']
}
-function rewrite (attr, name) {
+function urlToRequire (url) {
+ const returnValue = `"${url}"`
+ // same logic as in transform-require.js
+ const firstChar = url.charAt(0)
+ if (firstChar === '.' || firstChar === '~' || firstChar === '@') {
+ if (firstChar === '~') {
+ const secondChar = url.charAt(1)
+ url = url.slice(secondChar === '/' ? 2 : 1)
+ }
+ const uriParts = parseUriParts(url)
+ if (!uriParts.hash) { // fixed by xxxxxx (v3 template中需要加/)
+ return `"/"+require("${url}")`
+ } else { // fixed by xxxxxx (v3 template中需要加/)
+ // support uri fragment case by excluding it from
+ // the require and instead appending it as string;
+ // assuming that the path part is sufficient according to
+ // the above caseing(t.i. no protocol-auth-host parts expected)
+ return `"/"+require("${uriParts.path}") + "${uriParts.hash}"`
+ }
+ }
+ return returnValue
+}
+/**
+ * vuejs/component-compiler-utils#22 Support uri fragment in transformed require
+ * @param urlString an url as a string
+ */
+function parseUriParts (urlString) {
+ // initialize return value
+ const returnValue = url.parse('')
+ if (urlString) {
+ // A TypeError is thrown if urlString is not a string
+ // @see https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost
+ if (typeof urlString === 'string') {
+ // check is an uri
+ return url.parse(urlString) // take apart the uri
+ }
+ }
+ return returnValue
+}
+
+function rewrite (attr, name, options) {
if (attr.name === name) {
const value = attr.value
// only transform static URLs
@@ -22,13 +64,17 @@ function rewrite (attr, name) {
attr.value = attr.value
.replace('"@/', '"/')
.replace('"~@/', '"/')
+ if (options.service || options.view) { // v3
+ attr.value = urlToRequire(attr.value.slice(1, -1))
+ }
return true
}
}
return false
}
+
module.exports = {
- postTransformNode: (node) => {
+ postTransformNode: (node, options) => {
if (!node.attrs) {
return
}
@@ -37,9 +83,19 @@ module.exports = {
return
}
if (typeof attributes === 'string') {
- node.attrs.some(attr => rewrite(attr, attributes))
+ if (node.attrs.some(attr => rewrite(attr, attributes, options))) {
+ if (options.service || options.view) {
+ node.hasBindings = true
+ }
+ }
} else if (Array.isArray(attributes)) {
- attributes.forEach(item => node.attrs.some(attr => rewrite(attr, item)))
+ attributes.forEach(item => {
+ if (node.attrs.some(attr => rewrite(attr, item, options))) {
+ if (options.service || options.view) {
+ node.hasBindings = true
+ }
+ }
+ })
}
}
}