2012-06-19 15 views
10

में तेजी लाने के लिए अपना स्वयं का स्नैपशॉट कैसे बनाएं मेरे पास एक node.js (v0.6.12) एप्लिकेशन है जो जावास्क्रिप्ट फ़ाइल, startup.js का मूल्यांकन करके शुरू होता है। स्टार्टअप.जेएस का मूल्यांकन करने में काफी समय लगता है, और यदि संभव हो तो मैं नोड के कस्टम निर्माण में 'इसे सेंकना' चाहता हूं।नोड.जेएस/वी 8: स्टार्टअप

नोड, नोड/डीपीएस/वी 8/src के साथ वितरित v8 स्रोत निर्देशिका में स्कैनस्क्रिप्ट होता है जिसे लगभग ऐसा करने के लिए उपयोग किया जा सकता है। लाइन 302 पर, हमारे पास

LIBRARY_FILES = ''' 
runtime.js 
v8natives.js 
array.js 
string.js 
uri.js 
math.js 
messages.js 
apinatives.js 
date.js 
regexp.js 
json.js 
liveedit-debugger.js 
mirror-debugger.js 
debug-debugger.js 
'''.split() 

वे जावास्क्रिप्ट फ़ाइलें एक ही निर्देशिका में मौजूद हैं। बिल्ड प्रक्रिया में कुछ स्पष्ट रूप से उनका मूल्यांकन करता है, राज्य का एक स्नैपशॉट लेता है, और इसे नोड/आउट/रिलीज/ओबीजे/रिलीज/स्नैपशॉट.सीसी (मैक ओएस पर) में बाइट स्ट्रिंग के रूप में सहेजता है। यह फ़ाइल नोड में बेक्ड लगती है।

स्कैनस्क्रिप्ट को बदलकर स्टार्टअप स्नैपशॉट का कुछ अनुकूलन संभव है। उदाहरण के लिए, मैं date.js. को बदलकर बिल्टिन Date.toString की परिभाषा को बदल सकता हूं। मैं लाइब्रेरी फ़ाइलों की सूची में startup.js जोड़कर, global.test = 1 सामग्री के साथ नए वैश्विक चर भी जोड़ सकता हूं।

हालांकि, मैं startup.js में बस कोई जावास्क्रिप्ट कोड नहीं डाल सकता। यदि यह Date.toString = 1; होता है, एक त्रुटि परिणाम भले ही कोड नोड repl पर मान्य है:

Build failed: -> task failed (err #2): 
    {task: libv8.a SConstruct -> libv8.a} 
make: *** [program] Error 1 

और यह स्पष्ट रूप से कोड है कि पुस्तकालयों नोड वी 8 में जोड़ता है पर निर्भर करता है का उपयोग नहीं कर सकते हैं। global.underscore = require('underscore'); एक ही त्रुटि का कारण बनता है।

मुझे आदर्श रूप से एक उपकरण, कस्टम स्नैपशॉट पसंद है, जहां customSnapshot startup.js नोड के साथ startup.js का मूल्यांकन करता है और फिर एक फ़ाइल में स्नैपशॉट डंप करता है, snapshot.cc, जिसे मैं नोड स्रोत निर्देशिका में डाल सकता हूं। मैं फिर नोड का निर्माण कर सकता हूं और स्नैपशॉट को पुनर्निर्माण न करने के लिए कह सकता हूं।

+0

वास्तव में यह विधि मेरे लिए ठीक काम करती है और मैंने node.js v0.8.11 का उपयोग किया जो v8 v3.11.10 के साथ आता है। अंतर यह है कि मैंने नए जीईपी-आधारित निर्माण का उपयोग किया। [यहां] (https://github.com/tarruda/node/commit/2f58630e66e2de4cbadae09ac37da55721de7bd3) आप आवश्यक परिवर्तन देख सकते हैं। जैसा कि आपने कहा था, आप कोड को नहीं बुला सकते हैं जो बिल्टिन ऑब्जेक्ट्स या नोडजेज़ फ़ंक्शंस (कंसोल, आवश्यकता ...) पर निर्भर करता है। आप एनएन प्रारंभिक समारोह का उपयोग कर इसके आसपास काम कर सकते हैं: var वैश्विक = यह; global.initialize = function() { global.console.log ('हैलो नोड'); }; –

उत्तर

7

मैंने अभी mksnapshot कमांड के लिए एक विकल्प जोड़ा है (जो आप V8 बनाते समय चलते हैं)। नया --extra-file = filename.js ध्वज आपको उस फ़ाइल को निर्दिष्ट करने देता है जिसे लोड किया जाना चाहिए और प्रक्रिया में चलाया जाना चाहिए और फिर स्नैपशॉट में डाल देना चाहिए। यह वी 8 के ट्रंक संस्करण पर है, न कि 3.11 शाखा जो नोड 0.8 के लिए उपयोग की जा रही है, इसलिए आपको वी 8 संस्करण 3.11 के साथ नोड 0.8 चलाने की आवश्यकता होगी। जहां तक ​​मैं इस पल में जानता हूं कि काम करता है, लेकिन आप कुछ हद तक अपने आप पर होंगे।

यदि आप इसे आजमाते हैं तो कृपया बग फाइल करें और यह आपके लिए काम नहीं करता है।

+2

धन्यवाद, उपयोगकर्ता 487683, नया विकल्प मेरे लिए काम करता है। वंशावली के लिए, आपके परिवर्तन इस संशोधन में थे: http://code.google.com/p/v8/source/detail?r=11871। निर्माण प्रक्रिया में अतिरिक्त कोड जोड़ने के लिए, मैंने स्कैनस्क्रिप्ट के लाइन 343 पर env.Snapshot की परिभाषा को 'env [' बिल्डर्स '] [' स्नैपशॉट '] =' बिल्डर (एक्शन = '$ SOURCE $ TARGET --logfile "में बदल दिया। $ LOGFILE "--log-snapshot-position --extra-code" path/to/file.js "')'। ऐसा लगता है कि फ़ाइल स्कैनस्क्रिप्ट में सूचीबद्ध लाइब्रेरी फ़ाइलों के बाद निष्पादित हो जाती है, इसलिए यह उन वस्तुओं को संशोधित कर सकती है जो वे पेश करते हैं। हालांकि यह नोड में कुछ भी पहले निष्पादित हो जाता है। –