Mia Yang
隨著 Web Application 的演化,以往需要在 server 端處理的事情都慢慢搬到前端來處理
但 javascript 是單執行緒
即便 JavaScript 大量使用並行(Concurrency)機制,像是各種 Event Handler,依舊還是只有一個執行緒
所以就產生了前端的效能瓶頸
『 UI Blocking 』
同源限制
作用域(Scope)限制
通訊關係
腳本限制
// index.js
const worker = new Worker('./worker.js')
worker.onmessage = (event) => {
console.log(event)
}
worker.postMessage('Hello Worker Thread')
console.log('Main')
// worker.js
self.onmessage = (event) => {
console.log(event)
}
self.postMessage('Hi Main Thread')
console.log('Worker')
// index.js
const worker = new Worker('./worker.js')
worker.onmessage = (event) => {
console.log(event)
}
worker.postMessage('Hello Worker Thread')
console.log('Main')
// worker.js
self.onmessage = (event) => {
console.log(event)
}
self.postMessage('Hi Main Thread')
console.log('Worker')
Prefetching and/or caching data for later use
Polling and processing data from web services
Processing and display of large data sets
Computations related to moves in a game
Image processing and filtering
XMLHttpRequest
// worker.js
export default 'worker'
// index.js
const worker = new Worker('./worker.js')
// ... make a request
// worker.js
// index.js
import wb from './worker.js'
// ... make a request
// worker.js
function reqListener () {
const res = JSON.parse(this.responseText)
self.postMessage(res)
}
const xhr = new XMLHttpRequest()
self.onmessage = () => {
xhr.addEventListener("loadend", reqListener)
xhr.open("GET", "https://h79v58r6mk.execute-api.ap-northeast-1.amazonaws.com/staging/api/user")
xhr.setRequestHeader('Authorization', 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI5YTZlZGY2MC02MGExLTExZWEtODQ3My1jMzI3YzZiNmMwOTIiLCJpYXQiOjE1ODM2MDU3Nzh9.8f03D-wlbGl6F8PeI-OqOZc_bnRK1CUTGuIEOaNxrOk');
xhr.setRequestHeader('x-api-key', 'srOpzgACYODv9UiBN4D38Q6pgzI2pAXa2ItFnfl8');
xhr.send()
}
// index.js
const worker = new Worker('./worker.js')
worker.onmessage = (event) => {
console.log(event)
}
const app = new Vue({
el: "#app",
data: {
name: ''
},
created () {
setTimeout(() => {
worker.postMessage(null)
axios('https://h79v58r6mk.execute-api.ap-northeast-1.amazonaws.com/staging/api/user', {
headers: {
'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI5YTZlZGY2MC02MGExLTExZWEtODQ3My1jMzI3YzZiNmMwOTIiLCJpYXQiOjE1ODM2MDU3Nzh9.8f03D-wlbGl6F8PeI-OqOZc_bnRK1CUTGuIEOaNxrOk',
'x-api-key': 'srOpzgACYODv9UiBN4D38Q6pgzI2pAXa2ItFnfl8'
},
method: 'GET'
})
}, 5000)
},
methods: {
clickHandler () {
console.log('click')
this.name = 'Mia'
}
}
});
// worker.js
function reqListener () {
const res = JSON.parse(this.responseText)
self.postMessage(res)
}
const xhr = new XMLHttpRequest()
self.onmessage = () => {
xhr.addEventListener("loadend", reqListener)
xhr.open("GET", "https://h79v58r6mk.execute-api.ap-northeast-1.amazonaws.com/staging/api/user")
xhr.setRequestHeader('Authorization', 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI5YTZlZGY2MC02MGExLTExZWEtODQ3My1jMzI3YzZiNmMwOTIiLCJpYXQiOjE1ODM2MDU3Nzh9.8f03D-wlbGl6F8PeI-OqOZc_bnRK1CUTGuIEOaNxrOk');
xhr.setRequestHeader('x-api-key', 'srOpzgACYODv9UiBN4D38Q6pgzI2pAXa2ItFnfl8');
xhr.send()
}
// index.js
const worker = new Worker('./worker.js')
worker.onmessage = (event) => {
console.log(event)
}
const app = new Vue({
el: "#app",
data: {
name: ''
},
created () {
setTimeout(() => {
worker.postMessage(null)
axios('https://h79v58r6mk.execute-api.ap-northeast-1.amazonaws.com/staging/api/user', {
headers: {
'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI5YTZlZGY2MC02MGExLTExZWEtODQ3My1jMzI3YzZiNmMwOTIiLCJpYXQiOjE1ODM2MDU3Nzh9.8f03D-wlbGl6F8PeI-OqOZc_bnRK1CUTGuIEOaNxrOk',
'x-api-key': 'srOpzgACYODv9UiBN4D38Q6pgzI2pAXa2ItFnfl8'
},
method: 'GET'
})
}, 5000)
},
methods: {
clickHandler () {
console.log('click')
this.name = 'Mia'
}
}
});