mirror of
https://gitee.com/vuejs/vue.git
synced 2024-12-05 05:27:59 +08:00
tweak render stream implementation
This commit is contained in:
parent
8172e7e257
commit
097bb2e4e8
@ -1,6 +1,6 @@
|
||||
import stream from 'stream'
|
||||
|
||||
const MAX_STACK_DEPTH = 500
|
||||
const MAX_STACK_DEPTH = 1000
|
||||
|
||||
/**
|
||||
* Original RenderStream implmentation by Sasha Aickin (@aickin)
|
||||
@ -12,35 +12,14 @@ export default class RenderStream extends stream.Readable {
|
||||
super()
|
||||
this.buffer = ''
|
||||
this.render = render
|
||||
}
|
||||
this.expectedSize = 0
|
||||
|
||||
_read (n) {
|
||||
let bufferToPush
|
||||
// it's possible that the last chunk added bumped the buffer up to > 2 * n,
|
||||
// which means we will need to go through multiple read calls to drain it
|
||||
// down to < n.
|
||||
if (this.done) {
|
||||
this.push(null)
|
||||
return
|
||||
}
|
||||
if (this.buffer.length >= n) {
|
||||
bufferToPush = this.buffer.substring(0, n)
|
||||
this.buffer = this.buffer.substring(n)
|
||||
this.push(bufferToPush)
|
||||
return
|
||||
}
|
||||
if (!this.next) {
|
||||
this.stackDepth = 0
|
||||
// start the rendering chain.
|
||||
this.render(
|
||||
// write
|
||||
(text, next) => {
|
||||
this.write = (text, next) => {
|
||||
const n = this.expectedSize
|
||||
this.buffer += text
|
||||
if (this.buffer.length >= n) {
|
||||
this.next = next
|
||||
bufferToPush = this.buffer.substring(0, n)
|
||||
this.buffer = this.buffer.substring(n)
|
||||
this.push(bufferToPush)
|
||||
this.pushBySize(n)
|
||||
} else {
|
||||
// continue rendering until we have enough text to call this.push().
|
||||
// sometimes do this as process.nextTick to get out of stack overflows.
|
||||
@ -52,13 +31,38 @@ export default class RenderStream extends stream.Readable {
|
||||
this.stackDepth--
|
||||
}
|
||||
}
|
||||
},
|
||||
// done
|
||||
() => {
|
||||
}
|
||||
|
||||
this.end = () => {
|
||||
// the rendering is finished; we should push out the last of the buffer.
|
||||
this.done = true
|
||||
this.push(this.buffer)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pushBySize (n) {
|
||||
const bufferToPush = this.buffer.substring(0, n)
|
||||
this.buffer = this.buffer.substring(n)
|
||||
this.push(bufferToPush)
|
||||
}
|
||||
|
||||
_read (n) {
|
||||
this.expectedSize = n
|
||||
// it's possible that the last chunk added bumped the buffer up to > 2 * n,
|
||||
// which means we will need to go through multiple read calls to drain it
|
||||
// down to < n.
|
||||
if (this.done) {
|
||||
this.push(null)
|
||||
return
|
||||
}
|
||||
if (this.buffer.length >= n) {
|
||||
this.pushBySize(n)
|
||||
return
|
||||
}
|
||||
if (!this.next) {
|
||||
this.stackDepth = 0
|
||||
// start the rendering chain.
|
||||
this.render(this.write, this.end)
|
||||
} else {
|
||||
// continue with the rendering.
|
||||
this.next()
|
||||
|
Loading…
Reference in New Issue
Block a user