2012-09-08 4 views
1

CommonJS API (require())를 구현 한 JavaScript 파일을 네이티브 Java 코드로 컴파일하려고 시도했는지 궁금합니다. http://code.google.com/p/pagedown/네이티브 Java에 대한 CommonJS 기능이 필요한 JavaScript 컴파일

이 프로젝트는 함께 제공 :

나는 현재 내가 오픈 소스 (대량 살상 무기 (WMD) 편집기의 포트)에 유래 해, 이것과 같은 텍스트 편집기를 사용하는 것입니다 짓고 있어요 사이트를 가지고 편집기의 마크 업 언어를 삭제하고 유효한 HTML로 변환하는 몇 가지 JavaScript 파일.

Rhino 1.7R4에서 약간 놀았으므로 런타임에 JavaScript 파일/모듈을로드 할 수 있었고 필요할 때마다 기능을 실행할 수있었습니다.

그러나이 스크립트를 원시 Java 코드로 사전 컴파일하는 것이 좋습니다. 나는이 코뿔소 문서 다음 CommonJS 기능을 사용하지 않는 하나의 스크립트를 컴파일하는 데 성공했습니다

https://developer.mozilla.org/en-US/docs/Rhino/JavaScript_Compiler

을하지만 CommonJS 기능을 구현 여러 의존 스크립트를 컴파일하는 올바른 방법에 관해서 손실에 있어요 , Rhino 자체에 대해서는 잘 설명되어 있지 않습니다.

두 가지 코드베이스 (JS를 JAVA로 변환)를 작성/유지하는 번역 비용없이 마크 업 변환 및 sanitisation을위한 원시 Java 코드를 갖는 것이 아이디어입니다.

건배

+0

중복 가능성 (http://stackoverflow.com/questions/11074836/resolving-modules-using-require-js-and-java-rhino) –

답변

0

RingoJS는 그런 일을 할 수 있습니다

링고는 CommonJS 모듈 사양을 구현합니다. 즉,

모든 JavaScript 파일은 자체 최상위 범위에있는 모듈로 취급됩니다.

모듈의 내보내기 개체에 연결된 기능이나 속성이 노출됩니다.

require() 함수는 모듈의 엑스포트 객체를 반환합니다.

주어진 식별자 문자열이 ./ 또는 ../로 시작하는 경우 링고의 모듈 로더가 파일을 검색하여로드하려고 시도합니다. 그러므로 require ('./ foo') 링고가 ./foo.js 파일을 모듈로로드하도록 권고한다.

그렇지 않으면 링고는 모듈 경로의 모든 폴더에서 모듈을 찾습니다.

모듈 경로는 링고가 모듈을 찾을 표준 위치 목록입니다.

는 모듈 경로는 다음과 같은 방법으로 설정할 수 있습니다

RINGO_MODULE_PATH 환경 변수 설정.

ringo.modulepath Java 시스템 속성 설정.

ringo 명령 줄 도구에 -m 또는 --modules 옵션을 사용합니다.

JsgiServlet에서 module-path servlet init 매개 변수를 사용합니다.

require.paths에 요소 추가 또는 제거 Ringo 내에서 Array와 유사한 속성.

패키지는 여러 모듈과 다른 리소스를 하나의 단위로 묶는 수단을 제공합니다. 패키지는 package.json 패키지 설명자 파일이 들어있는 디렉토리입니다.

{ 
    "main": "lib/main.js" 
} 

이 모듈 ID가 패키지 디렉토리와 package.json의 정의에 직접 해결하는 경우 : package.json 기술자의 주요 속성은 모듈의 주 진입 점으로 링고의 모듈 로더에 의해 인식 주요 속성 인 Ringo는 지정된 리소스를로드하려고 시도합니다. main 속성의 값은 패키지 루트에 상대적인 경로 여야합니다.

모듈 ID가 package.json 파일을 포함하지 않는 디렉토리로 해석되거나 package.json이 main 속성을 정의하지 않으면 Ringo는 해당 디렉토리에 index.js 파일을로드하려고 시도합니다.

모듈 ID의 일부가 패키지 디렉토리로 해석되면 링고는 해당 패키지의 lib 디렉토리에 대해 id의 나머지 부분을 해석하려고 시도합니다. lib 디렉토리의 위치는 package.json의 directories.lib 특성을 사용하여 대체 할 수 있습니다.

CommonJS 모듈 사양

{ 
    "directories": { 
     "lib": "new-lib" 
    } 
} 

의도적으로 작게 유지 하였다. Ringo는 물건을 내보내고 가져 오기위한 몇 가지 추가 정보를 제공합니다. 이 코드를 사용하는 단점은 코드가 링고에 묶여 있지만 코드를 "순수한"CommonJS로 변환하는 것이 상대적으로 쉽고 그 목적을위한 명령 행 도구도 있다는 것입니다.

하나의 링고 확장은 포함 기능입니다. 이것은 require와 비슷하지만 다른 모듈의 내보내기 객체를 전체적으로 반환하는 대신 호출 모듈의 범위에 각 속성을 직접 복사하여 로컬에서 정의 된 것처럼 사용할 수있게 만듭니다.

include는 경제성이 가장 중요한 쉘 작업 및 빠른 스크립트에 적합하며 이것이 그 의미입니다. 프로그램에 사용 된 최상위 수준 기능의 기원을 은폐하면서 대용량, 수명이 긴 프로그램에이 프로그램을 사용하는 것은 대개 좋은 아이디어가 아닙니다.

var {foo, bar} = require("some/module"); 

위의 문이 수입이 목적

, 그것은 명시 적으로 로컬 범위에서 다른 모듈에서 선택한 속성을 포함하는 자바 스크립트 1.8 destructuring 할당과 함께 사용할 필요 더 권할 "some/module"이 내 보낸 API의 "foo"및 "bar"속성을 호출 범위에서 직접 호출합니다.

Ringo로 명령 줄 스크립트를 작성하는 것은 간단합니다.

ringo [script-file] [script-arg1] [script-arg2] ... 

링고 스크립트 파일을로드하고 시스템 모듈의 args 배열을 통해 인수를 제공합니다 : 모든 임의의 자바 스크립트 파일은 링고 명령에 [스크립트 파일] 인수로 전달 될 수있다. args 배열의 첫 번째 요소는 스크립트 파일의 이름입니다.

참조