오늘의 v8에 다른 js 파일 파일을 어떻게 포함시킬 수 있습니까?

Nov 23 2020

여기 에서 오래된 anwser 및 최신 업데이트를 찾았 지만이 코드를 최신 (2020) V8 버전에 적용하기가 어렵습니다.

내가 직면하는 많은 어려움이 있습니다.

  1. String::New제거되고 기능에 전달하는 방법을 모르는 지금이 String::NewFromUtf8Literal필요합니다. 전에 이것을 추가해야 합니까?Isolate* isolateIncludeconst Arguments& args
  2. Script::Compile소요 Context지금 paramater으로 객체를
  3. 그리고 마지막 두 줄 코드를 어디에 넣을지 모르겠어요
    Handle<ObjectTemplate> global = ObjectTemplate::New();
    global->Set(String::New("include"), FunctionTemplate::New(Include));
    

-업데이트-

몇 일 후, 나는 등 내 코드가 이 .

그러나 오류로 인해 여전히 컴파일되지 않습니다.

  1. Local에서 얻을 수없는 것 같습니다 Persistent. 심지어 나는 danijar의 전략 을 사용 했습니다 . 생성자를 사용하지 않았기 때문일 수 있지만이 함수 범위 내에서 Persist를 만들 수 없다고 생각합니다.

    samples/import.cc:74:103: Error:cannot convert ‘v8::Local<v8::Context>’ to ‘v8::Context*’
       74 |     global_context = v8::Persistent<v8::Context, CopyablePersistentTraits<v8::Context>>::New(isolate, local_context);
          |                                                                                                       ^~~~~~~~~~~~~
          |                                                                                                       |
          |                                                                                                       v8::Local<v8::Context>
    
  2. 여기에 약간의 오차가 String::NewFromUtf8Literal있습니다

    samples/import.cc:34:110: Error:‘static v8::Local<v8::String> v8::String::NewFromUtf8Literal(v8::Isolate*, const char*, v8::NewStringType, int)’ is private within this context
       34 |   Handle<String> source = String::NewFromUtf8Literal(args.GetIsolate(), buff, v8::NewStringType::kNormal, len);
          |   
    

답변

1 jmrk Nov 24 2020 at 12:15

Include 함수로 전달하는 방법을 모르겠습니다. 이전에 이것을 추가해야 const Arguments& args합니까?

아니요, JS에서 호출 할 함수의 서명을 수정할 수는 없지만 다음 작업을 수행 할 필요는 없습니다. FunctionCallbackInfo(를 대체하는 Arguments) GetIsolate()메서드가 있습니다.

Script::Compile소요 Context지금은 매개 변수로 객체를

이것에 대해 질문이 있기 때문에 모든 것에 대해 하나의 컨텍스트 만 사용하고 있다고 생각합니다. 에 저장하고 필요할 때마다 v8::Persistent생성 v8::Local하십시오. (당분간은 deprecated를 사용할 수도 Isolate::GetCurrentContext()있지만 새로 작성된 코드의 경우 나중에 마이그레이션해야 할 때만 더 많은 작업을 생성 할 수 있으므로 이에 대해 권장하지 않습니다 .)

마지막 두 줄 코드를 어디에 넣을지 모르겠습니다.

전역 개체를 설정할 때마다 앱의 시작 순서 어딘가에 있습니다.

V8 프로젝트에서 유지 관리하는 "셸"샘플 앱을 연구하면 이러한 모든 질문 (및 그 이상)에 대한 답을 얻을 수 있습니다. https://chromium.googlesource.com/v8/v8/+/master/samples/shell.cc. 특히, 그 Load기능은 당신이 원하는 것을 거의 수행합니다.