मैं आज के v8 में एक और js फ़ाइल कैसे शामिल कर सकता हूँ?
मुझे यहां एक पुरानी anwser और बाद की अपडेट मिलती है , लेकिन मेरे लिए इस कोड को नवीनतम (2020) V8 संस्करण के अनुकूल बनाना कठिन है।
मेरे सामने कई कठिनाइयाँ हैं:
String::Newहटा दिया गया है और अब एकString::NewFromUtf8Literalजरूरत हैIsolate* isolateजिसे मैं नहीं जानता कि कैसे कार्यIncludeकरना है, क्या मुझे इसे पहले जोड़ना चाहिएconst Arguments& args?Script::CompileContextअब परमट के रूप में एक वस्तु लेता है- और मुझे नहीं पता कि अंतिम दो लाइन कोड कहां रखे जाएं
Handle<ObjectTemplate> global = ObjectTemplate::New(); global->Set(String::New("include"), FunctionTemplate::New(Include));
-- अपडेट करें --
कुछ काम के बाद, मेरा कोड इस तरह है ।
हालाँकि, यह अभी भी त्रुटियों के कारण संकलित नहीं होगा:
लगता है कि मैं एक
Localसे नहीं मिल सकता हैPersistent, यहां तक कि मैं danijar की रणनीति का इस्तेमाल किया है । शायद ऐसा इसलिए है क्योंकि मैंने कंस्ट्रक्टर का इस्तेमाल नहीं किया है, लेकिन मुझे नहीं लगता कि मैं इस फंक्शन स्कोप के अंदर यहां कोई पर्सिस्ट बना सकता हूं।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>यहां कुछ त्रुटियां
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); |
जवाब
मुझे नहीं पता कि फ़ंक्शन को कैसे पास किया जाए, क्या मुझे इसे पहले जोड़ना चाहिए
const Arguments& args?
नहीं, आप जेएस से बुलाए जाने वाले कार्यों के हस्ताक्षर को संशोधित नहीं कर सकते हैं, लेकिन आपको इसकी आवश्यकता नहीं है: FunctionCallbackInfo(जिसके लिए प्रतिस्थापन Arguments) एक GetIsolate()विधि है।
Script::CompileContextअब पैरामीटर के रूप में एक वस्तु लेता है
जब से आप इस बारे में सवाल कर रहे हैं, मुझे लगता है कि आप केवल एक ही संदर्भ का उपयोग कर रहे हैं सब कुछ के लिए। बस इसे एक स्टोर में रखें v8::Persistent, और v8::Localजब भी आपको इसकी आवश्यकता हो, तब से इसे बनाएं । (कुछ समय के लिए, आप पदावनत का भी उपयोग कर सकते हैं Isolate::GetCurrentContext(), लेकिन नए लिखित कोड के लिए मैं उसके खिलाफ सलाह दूंगा, क्योंकि आप भविष्य में केवल अपने लिए और अधिक काम पैदा करेंगे, जब आपको इससे दूर भागना होगा।)
मुझे नहीं पता कि आखिरी दो लाइन कोड कहां रखें
कहीं आप अपने ऐप के स्टार्टअप सीक्वेंस में ग्लोबल ऑब्जेक्ट सेट कर रहे हैं।
इन सभी प्रश्नों (और अधिक) का उत्तर "शेल" नमूना ऐप का अध्ययन करके दिया जा सकता है जो V8 प्रोजेक्ट रखता है: https://chromium.googlesource.com/v8/v8/+/master/samples/shell.cc। विशेष रूप से, इसका Loadकार्य बहुत अधिक है जो आप चाहते हैं।