(Tiny)GO 및 WebAssembly로 Dev의 오프라인 페이지 만들기 🦄💡✨
이동은 간단합니다. Go와 WebAssembly에서 할 수 있습니까? 대답은 예입니다...
샘플 애플리케이션here이 있습니다. 처음부터 작성하려면 .
소스코드만 보고 싶다면 check out this branch .
코드 코드 코드
먼저 go/main.go
에서 "syscall/js"및 "fmt"를 가져옵니다.
The "syscall/js" package gives access to the WebAssembly host environment when using the js/WASM architecture. Its API is based on JavaScript semantics. This package is EXPERIMENTAL. 🦄 🦄
package main
import(
"fmt"
"syscall/js"
)
전역적으로 사용 가능한 몇 가지 변수를 추가합니다. 이러한 변수는 JavaScript 랜드 또는 브라우저에서 함수를 호출할 때 사용해야 할 수 있는 변수입니다.
var (
isPainting bool
x float64
y float64
ctx js.Value
color string
)
out/index.html
에 캔버스 요소를 수동으로 추가합니다.
<canvas id="canvas"> </canvas>
Hello World
함수 내에서 main
줄을 제거하고 다음으로 바꿉니다.
브라우저에서 document
개체를 가져옵니다. document
를 사용하여 방금 추가한 canvas
요소를 가져옵니다.
syscall/js
API를 사용하여 이를 수행할 수 있습니다.
func main() {
doc := js.Global().Get("document")
canvasEl := doc.Call("getElementById", "canvas")
}
API는 간단합니다. JavaScript의 전역 네임스페이스에서 문서를 가져옵니다.
문서 내에서 Id로 캔버스 요소를 호출합니다.
너비, 높이와 같은 canvasEl
의 일부 속성을 설정합니다. 우리는 또한 캔버스'context
를 얻을 것입니다.
bodyW := doc.Get("body").Get("clientWidth").Float()
bodyH := doc.Get("body").Get("clientHeight").Float()
canvasEl.Set("width", bodyW)
canvasEl.Set("height", bodyH)
ctx = canvasEl.Call("getContext", "2d")
그런 다음 세 개의 이벤트 리스너를 정의합니다mousedown
| mousemove
| mouseup
에서 canvasElement
로 .
마우스 다운
마우스를 클릭하면 페인팅을 시작합니다.
startPaint := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
e := args[0]
isPainting = true
x = e.Get("pageX").Float() - canvasEl.Get("offsetLeft").Float()
y = e.Get("pageY").Float() - canvasEl.Get("offsetTop").Float()
return nil
})
canvasEl.Call("addEventListener", "mousedown", startPaint)
Please note that return nil is important otherwise the program will not compile.
전체 API는 Reflect API 을 기반으로 합니다.
마우스 이동
페인트 기능을 정의합니다.
paint := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
if isPainting {
e := args[0]
nx := e.Get("pageX").Float() - canvasEl.Get("offsetLeft").Float()
ny := e.Get("pageY").Float() - canvasEl.Get("offsetTop").Float()
ctx.Set("strokeStyle", color)
ctx.Set("lineJoin", "round")
ctx.Set("lineWidth", 5)
ctx.Call("beginPath")
ctx.Call("moveTo", nx, ny)
ctx.Call("lineTo", x, y)
ctx.Call("closePath")
// actually draw the path*
ctx.Call("stroke")
// Set x and y to our new coordinates*
x = nx
y = ny
}
return nil
})
canvasEl.Call("addEventListener", "mousemove", paint)
마우스 업
마지막으로 Mouse Up 이벤트가 발생할 때 호출되는 종료 메소드를 정의합니다.
exit := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
isPainting = false
return nil
})
canvasEl.Call("addEventListener", "mouseup", exit)
마지막으로 색상 선택기를 정의합니다. out/index.html
에 색상 div를 추가하고 필요한 CSS를 추가합니다.
<style>
.color {
display: inline-block;
width: 50px;
height: 50px;
border-radius: 50%;
cursor: pointer;
margin: 10px;
}
</style>
<div id="colors></div>
색상을 배열로 정의합니다. 그런 다음 색상을 반복하고 색상 견본 노드를 만듭니다. 색상 견본에 클릭 이벤트 리스너를 추가합니다.
divEl := doc.Call("getElementById", "colors")
colors := [6]string {"#F4908E", "#F2F097", "#88B0DC", "#F7B5D1", "#53C4AF", "#FDE38C"}
for _, c := range colors {
node := doc.Call("createElement", "div")
node.Call("setAttribute","class", "color")
node.Call("setAttribute", "id", c)
node.Call("setAttribute","style", fmt.Sprintf("background-color: %s", c))
setColor := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
e := args[0]
color = e.Get("target").Get("id").String()
return nil;
})
node.Call("addEventListener", "click", setColor)
divEl.Call("appendChild", node)
}
그게 다야.
이제 go run webServer.go
를 실행하여 웹 서버를 시작합니다.
다음을 사용하여 Go into WebAssembly 모듈을 컴파일합니다.
tinygo build -o ./out/main.wasm -target wasm -no-debug ./go/main.go
를 방문하여 창의력을 발휘할 수 있는 멋진 캔버스 보드를 확인하세요 🦄.
💡 생성된WebAssembly
모듈은 52KB에 불과합니다. TinyGo는 훌륭하고 매우 작은 WebAssembly 바이너리를 생성합니다. 어떻게 생성합니까? 이 시리즈의 다음 게시물을 기대해 주세요. 💡
Note: Use Firefox / Firefox Nightly. Chrome sometimes crash.
더 많은 최적화 ❤️
Remove the fmt
import and replace fmt.Sprintf
with a normal String concatenation, this will shave off another 26KB. Check the commit here.
이 팁을 공유해 주신 Justin Clift에게 감사드립니다 :)
당신은 ❤️ 녹슬나요? WebAssembly에 Rust를 사용하는 방법을 확인하세요.
이것이 멋진 WebAssembly 여정을 시작하는 동기가 되기를 바랍니다. 질문/제안/내가 뭔가를 놓친 느낌이 있으면 언제든지 의견을 추가하십시오.
에서 나를 팔로우할 수 있습니다.
이 글이 마음에 드셨다면 좋아요나 댓글을 남겨주세요. ❤️
감사
.ltag__user__id__38627 .follow-action-button {
배경색: #FFF2F5 !중요;
색상: #FF80AB !중요;
테두리 색상: #FFF2F5 !중요;
}
알리 스피텔
Passionate about education, Python, JavaScript, and code art.
에 대한 .
Reference
이 문제에 관하여((Tiny)GO 및 WebAssembly로 Dev의 오프라인 페이지 만들기 🦄💡✨), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/sendilkumarn/create-dev-s-offline-page-with-tiny-go-and-webassembly-9n6
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
The "syscall/js" package gives access to the WebAssembly host environment when using the js/WASM architecture. Its API is based on JavaScript semantics. This package is EXPERIMENTAL. 🦄 🦄
package main
import(
"fmt"
"syscall/js"
)
var (
isPainting bool
x float64
y float64
ctx js.Value
color string
)
<canvas id="canvas"> </canvas>
func main() {
doc := js.Global().Get("document")
canvasEl := doc.Call("getElementById", "canvas")
}
bodyW := doc.Get("body").Get("clientWidth").Float()
bodyH := doc.Get("body").Get("clientHeight").Float()
canvasEl.Set("width", bodyW)
canvasEl.Set("height", bodyH)
ctx = canvasEl.Call("getContext", "2d")
startPaint := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
e := args[0]
isPainting = true
x = e.Get("pageX").Float() - canvasEl.Get("offsetLeft").Float()
y = e.Get("pageY").Float() - canvasEl.Get("offsetTop").Float()
return nil
})
canvasEl.Call("addEventListener", "mousedown", startPaint)
Please note that return nil is important otherwise the program will not compile.
paint := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
if isPainting {
e := args[0]
nx := e.Get("pageX").Float() - canvasEl.Get("offsetLeft").Float()
ny := e.Get("pageY").Float() - canvasEl.Get("offsetTop").Float()
ctx.Set("strokeStyle", color)
ctx.Set("lineJoin", "round")
ctx.Set("lineWidth", 5)
ctx.Call("beginPath")
ctx.Call("moveTo", nx, ny)
ctx.Call("lineTo", x, y)
ctx.Call("closePath")
// actually draw the path*
ctx.Call("stroke")
// Set x and y to our new coordinates*
x = nx
y = ny
}
return nil
})
canvasEl.Call("addEventListener", "mousemove", paint)
exit := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
isPainting = false
return nil
})
canvasEl.Call("addEventListener", "mouseup", exit)
<style>
.color {
display: inline-block;
width: 50px;
height: 50px;
border-radius: 50%;
cursor: pointer;
margin: 10px;
}
</style>
<div id="colors></div>
divEl := doc.Call("getElementById", "colors")
colors := [6]string {"#F4908E", "#F2F097", "#88B0DC", "#F7B5D1", "#53C4AF", "#FDE38C"}
for _, c := range colors {
node := doc.Call("createElement", "div")
node.Call("setAttribute","class", "color")
node.Call("setAttribute", "id", c)
node.Call("setAttribute","style", fmt.Sprintf("background-color: %s", c))
setColor := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
e := args[0]
color = e.Get("target").Get("id").String()
return nil;
})
node.Call("addEventListener", "click", setColor)
divEl.Call("appendChild", node)
}
tinygo build -o ./out/main.wasm -target wasm -no-debug ./go/main.go
Note: Use Firefox / Firefox Nightly. Chrome sometimes crash.
Remove the fmt
import and replace fmt.Sprintf
with a normal String concatenation, this will shave off another 26KB. Check the commit here.
Reference
이 문제에 관하여((Tiny)GO 및 WebAssembly로 Dev의 오프라인 페이지 만들기 🦄💡✨), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sendilkumarn/create-dev-s-offline-page-with-tiny-go-and-webassembly-9n6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)