2016-08-29 6 views
2

저는 서버 측 렌더링의 핵심 기능인 scala-js 프론트 엔드 프레임 워크를 작성하고 있습니다. 그 아이디어는 document.createElement, element.appendChild 및 기타로 dom을 조작하는 구성 요소가 있다는 것입니다. 서버에서 서브 클래스 HTMLDocument, Element 및 기타는 일반 문자열 html로 변환 될 수있는 서버 돔 구현으로 메소드를 대체합니다. 그래서 서버 모듈에 scalajs-dom_sjs 종속성을 추가하고이를 시도했습니다. 그러나 HTMLDocument, Element 그리고 대부분의 다른 클래스는 생성자 내에 "라이브러리의 JVM 버전 사용"이라는 예외를 throw하는 js.native을 호출합니다. 분명히 존재하지 않습니다. 나는 다른 방법을 사용하여 내 자신의 dom 라이브러리를 구현할 수 있지만 두 배의 작업이 필요합니다. 왜냐하면 서버와 클라이언트에서 구현해야하므로 서버에서 한 번만 구현할 첫 번째 방법을 사용하는 것입니다.서버 측 렌더링으로 scala-js 프론트 엔드 프레임 워크 작성하기. 서버에서 scala-js-dom을 사용할 수 없습니다.

내 질문은 : 왜 엄격하게 서버에서 scala-js 라이브러리 버전을 사용하는 것이 금지되어 있으며 그 문제가 있습니까?

답변

3

DOM API가 js.native으로 가득 찼다는 것을 알 수 있습니다. 이러한 클래스는 스칼라에서 구현되지 않습니다. 그것들은 브라우저의 DOM API의 일부이며, JVM에 상응하는 것이 없습니다. JVM에서 scalajs-dom에 정의 된 유형을 사용할 수없고 유용하다고 기대됩니다. 이 방법의 구현은 어디서 비롯된 것입니까?

실제로 JVM 측을 위해 DOM과 비슷한 라이브러리를 구현해야합니다. 클라이언트 측에서이 클래스를 "다시 구현"하지 않으려면 클래스에 org.scalajs.dom 네임 스페이스를 다시 사용할 수 있으며 scalajs-dom과 똑같은 구조와 유형을 제공 할 수 있습니다 (단, js.Any은 분명히 확장되지 않습니다).

의미 론적으로 모호한 점에 유의하십시오. 확장 된 유형 js.Any은 일반적인 스칼라 유형과 동일한 의미를 갖지 않습니다. 정상적인 사용을 위해 "충분히 호환되는"API를 생각해 낼 수도 있지만 여전히 모호합니다.

일반적으로 서버 및 클라이언트에서 이른바 동형 DOM 조작을 가능하게하기 위해 DOM에 무관 한 교차 컴파일 라이브러리를 작성합니다. 클라이언트 측에서는 실제 DOM 노드에 "렌더링"기능을 제공합니다. 서버 측에서는 HTML로 클라이언트에 보낼 문자열로 렌더링합니다.

이것은 정확히 Scalatags입니다.

+0

이 메소드의 구현은 어디서 발생합니까? 나는 그들을 쓸 것이다. 내 목표 (서버 측 렌더링)에서는 아약스 및 다른 브라우저 특정 항목을 구현할 필요가 없으며 기본 DOM 조작 만 구현하면됩니다. – Yaroslav

+1

그러면 내가 원하는 것은 제 3 단락의 예약과 함께 제 2 단락에서 설명하는 것입니다. – sjrd

+4

Scalatags를 사용하면 dom 및 텍스트 백엔드에 대한 템플릿을 완전히 다시 사용할 수 있습니다. http://www.lihaoyi.com/scalatags/#Cross-backendCode –