Skip to content

번역: QuickJS를 사용해 자바스크립트로 안전하게 번역하기

QuickJS는 C로 구현된 경량 JavaScript 엔진이며, WASM으로 빌드하면 브라우저에서도 사용할 수 있습니다. 미리 준비해둔 @yaksok-ts/quickjs 패키지를 사용하면 QuickJS를 사용하면 자바스크립트 번역 기능을 쉽게 사용할 수 있습니다.

QuickJS를 사용해도 시스템 함수에는 접근할 수 없습니다

QuickJS는 시스템(브라우저, 런타임 등..)에서 격리된 환경에서 실행됩니다. 그렇기에 alert, prompt 등 시스템 함수에는 접근할 수 없습니다.

만약 시스템 함수에 접근하고 싶다면 QuickJS에 시스템 함수 연결하기를 참조하세요.

설치

@yaksok-ts/quickjs 패키지를 설치합니다.

bash
deno install jsr:@yaksok-ts/quickjs

사용법

@yaksok-ts/quickjs 패키지를 사용하면 QuickJS를 사용해 자바스크립트로 번역할 수 있습니다.

typescript
import { QuickJS } from '@yaksok-ts/quickjs'
import { yaksok } from '@yaksok-ts/core'
import { FunctionParams } from '../src/constant/type.ts'

const quickJS = new QuickJS()
await quickJS.init()

const code = `
번역(QuickJS), (최소)와 (최대) 사이의 랜덤한 수
***
    return Math.floor(Math.random() * (최대 - 최소 + 1)) + 최소
***

(1)와 (10) 사이의 랜덤한 수 보여주기
`

function runFFI(runtime: string, code: string, params: FunctionParams) {
    if (runtime !== 'QuickJS') {
        throw new Error(`Unknown runtime: ${runtime}`)
    }

    const result = quickJS.run(code, params)

    if (!result) {
        throw new Error('Result is null')
    }

    return result
}

yaksok(code, { runFFI })

약속 런타임과 QuickJS 데이터타입, 자바스크립트 데이터타입 사이의 형변환은 라이브러리 내에서 자동으로 이루어집니다.

QuickJS에 시스템 함수 연결하기

QuickJS 인스턴스를 생성할 때 시스템 함수를 연결할 수 있습니다.

typescript
new QuickJS({
    getUserAgent() {
        return navigator.userAgent
    },
})

위와 같이 인스턴스를 생성하면 QuickJS의 전역스코프에getUserAgent 함수가 노출됩니다. 이를 호출하면 브라우저의 navigator.userAgent 값을 반환합니다.