2017-02-15 1 views
0

우리는 이전 패키지를 구성하려고합니다. 이를 위해 원래 "export = module"양식을 "export default module"으로 변경하기 시작했습니다. 이 변경은 "import module from 'module'"이 "module_1"로 컴파일되므로 eval()을 사용하는 코드의 다른 부분을 손상시킵니다. eval()에 제공되는 코드는 외부 소스에서 도착하지만 "module_1.default"형식이 아닌 module을 사용하려고합니다.Typescript 이름 생성 메커니즘

이런 종류의 명명 규칙이 실제로 어떻게 작동합니까? 개념을 말해 주시겠습니까? 컴파일 된 모듈 대신 원래 모듈 이름을 어떻게 사용할 수 있습니까? 또는 컴파일 후 모듈의 실제 이름을 가져 오는 함수가 있습니까?

감사합니다, 아담

+0

나는 아마도 당신에게 말할 필요가 없지만, 미래에이 질문을하는 사람들을 위해서 말할 것이다. ** 대답이'eval()'이라면, 아마도 당신은 아마 잘못된 질문 **. 'eval()'을 사용하면 보안상의 취약점과 추적하기 어려운 버그가 발생합니다. 거의 항상 더 나은 솔루션이 있습니다. –

답변

1

그것은 컴파일러에 의해 생성 된 이름을 사용하는 것이 안전합니다. 그것은 바뀔 수 있습니다.

해결 방법 그러나 당신이 할 수 있습니다 : 당신은 변수 module를 사용, 그리고

var module = module_1.default; 

수 있습니다

import myModule from 'module' 
const module = myModule 

두 번째 라인에 컴파일됩니다.

왜 가까운 장래에 export default보다는 export =

을 사용, export default의 사용은 표준이 될 것입니다. 이 기능은 현재 CommonJS 사용 사례를 대체하기 위해 ECMAScript에 의해 설계되었습니다. 회원 default이 더 좋고 일반적입니다.

다음은 예입니다. 당신은 객체 내 보내야 : 다음

const myConfigObject = Object.freeze({ 
    dbHost: "", 
    dbUser: "", 
    // ... 
}) 
export = myConfigObject 

을, 당신은 그것을 가져올 수 있습니다

import * as myConfigObject from "./myConfigObject" 

후, 당신은 관련된 일을 할 수있는 모듈 사용자를하는 데 도움이 작은 도우미 함수 toDSN을 수출하고 싶습니다 export 된 오브젝트 그렇게하는 방법? 헬퍼를 구성의 구성원으로 추가 할 수 있습니다. 그러나 그것은 우아하지 않을 것입니다.

export default Object.freeze({ 
    dbHost: "", 
    dbUser: "", 
    // ... 
}) 
export function toDSN(configObj) { 
    return // ... 
} 

그런 다음, 기본 객체를 가져올 수 있습니다 :

다음은 ES6의 방법입니다

import myConfigObject from "./myConfigObject" 

... 또는 toDSN를 가져옵니다

import { toDSN } from "./myConfigObject" 

... 또는 모두 가져 오기 :

import myConfigObject, { toDSN } from "./myConfigObject" 

작은 누점은 현재 Node.js 사용자 코드에만 해당됩니다. 구성원은 default이어야합니다. Node.js가 ES6 모듈을 구현할 때 함정은 더 이상 존재하지 않습니다.

왜 TS 컴파일러가 가져 오기를위한 중간 변수를 생성합니까?

ES6 모듈의 일반적인 경우에 필요하기 때문에. 다음 ES6 코드는 다음과 같습니다.

import myConfigObject, { toDSN } from "./myConfigObject" 

여기서 두 개의 변수를 가져옵니다. 그러나 CommonJS (또는 AMD) require은 단일 변수 만 가져올 수 있습니다. 따라서 컴파일러는이 단일 변수를 중간 변수 myConfigObject_1으로 가져옵니다. 그런 다음 myConfigObject 개체는 myConfigObject_1.default을 통해 사용할 수 있으며 toDSNmyConfigObject_1.toDSN을 통해 사용할 수 있습니다.

ES6 모듈에 대한 소개는 the article from Mozilla을 제안합니다.

+0

감사합니다. 이로 인해 문제가 해결되었습니다. 그러나 런타임에 이름이 module_1이 된 이유가 궁금합니다. Foo와 EntryPoint가있는 두 개의 모듈로 간단한 프로젝트를 만들었습니다. 푸는 다음과 같이 클래스 이름 foo는 내 보냅니다 '클래스 푸 { } 수출 기본적 푸,' EntryPpint은 다음과 같습니다 '수입 푸 "푸"에서; 내보내기 함수 run() { var foo = new Foo(); }' Foo_1이라는 Foo 인수가있는 함수로 EntryPoint가 컴파일되고 있습니다. 이 행동의 목적이나 원인은 무엇입니까? –

+0

중간 변수가 필요합니다. 나는 편집했다. – Paleo

+0

자세한 내용은이 설명서를 참조 할 수 있습니까? –