, skrive node.js addons,,,,, 127,,,,,,,,, 23,,,,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss.,, node.js er god til at skrive dit back - end - i javascript.men hvad nu, hvis du har brug for nogle funktioner, der ikke gives ud af æsken, eller som ikke kan ske, selv ved hjælp af moduler, men er til rådighed i form af c /c + + bibliotek?ja, vildt nok, kan man skrive en addon, som vil gøre det muligt at anvende dette bibliotek i deres javascript kode.lad os se, hvordan,, som de kan læse i node.js dokumentation, addons dynamisk knyttet fælles objekter, der kan levere lim til c /c + + biblioteker.det betyder, at du kan tage stort set alle c /c + + bibliotek og skabe en addon, som vil gøre det muligt at anvende den i node. det, som et eksempel, vil vi skabe et stykke papir for standard, std: snor, objekt.,,, forberedelse, før vi begynder at skrive. du er nødt til at være sikker på, at du har alt hvad du har brug for at samle modul senere.du har brug for node gyp, og alle dens områder.kan du installere, node gyp, ved anvendelse af følgende kommando:,, new public management installere - g node gyp, som for afhængighed, unix - systemer, skal du bruge:,,, pyton (7, 3. x vil ikke arbejde),,,, c + + de toolchain (gpp eller g + +), f.eks. på ubuntu kan du installere alt dette med denne kommando (pyton 2.7 skulle allerede være installeret):,, sudo passende få installere bygger hovedsageligt på vinduer, skal du bruge:,,, pyton (2.7.3, 3. x vil ikke arbejde), microsoft visuel. c + + 2010 (for vinduer xp /vista), microsoft visuelle studie c + + 2012 for vinduer stationære (windows 7 /8), udtrykkelig version af visuelle studie virker fint.,,,, binding.gyp, fil, denne sag er brugt af node gyp, til at skabe passende bull.ld - filer til din addon.det hele. gyp, dokumentation kan findes på deres liste side, men for vores formål denne enkle sag vil gøre:,, ("mål": [{"target_name": "stdstring", "kilder" ["addon. cc", "stdstring. cc"]}]). det, target_name, kan blive, hvad du vil.de kilder, system indeholder alle de sager, som de addon kilde anvendelser.i vores eksempel, der er addon. cc, som vil indeholde den kode, der er nødvendig for at udarbejde vores addon og stdstring. cc, som vil indeholde vores papir klasse.,,,, stdstringwrapper, klasse, vil vi begynde med at definere vores klasse i, stdstring. h, fil.de første to linjer, bør være bekendt med dig, hvis du nogensinde har programmeret i c + +.,,ifndef stdstring_hdefinere stdstring_h, er dette en standard omfatte vagt.vi er nødt til at omfatte disse to personer:,,omfatter < snor >omfatter < node. h >,, det første er for, std: snor, klasse, og den anden omfatter for alle forhold i forbindelse med knudepunkt og v8.,, det, vi kan sige, at vores gruppe:,, klasse stdstringwrapper: offentlige node: objectwrap {, for alle klasser, som vi også ønsker at inddrage i vores addon, vi skal udvide, knude: objectwrap, klasse, og nu kan vi begynde at definere, private, egenskaber for vores klasse:,, private: std: string * s_; eksplicit stdstringwrapper (std: serie s = "); - stdstringwrapper();, bortset fra producenten og giver vi også definere et fingerpeg, std: snor.det er kernen i den teknik, som kan bruges til at lime c /c + + biblioteker node - vi definerer en privat fingerpeg til c /c + + klasse og senere opererer på denne anvisning i alle metoder, næste vi erklærer, konstruktøren, statisk ejendom, som har den funktion, der vil skabe vores klasse i v8:,, statisk v8: klare < v8: værdi > nye (denne v8: argumenter & args), henvises der til den, v8: vedvarende, model dokumentation for yderligere oplysninger. nu vil vi også få en ny metode, der vil blive tildelt, konstruktøren, ovenfor, når v8 initializes vores klasse:,, statisk v8: klare nye (denne v8: argumenter & args), hver funktion, v8 vil se sådan ud: det vil acceptere en reference til, v8: argumenter. målect and return a ,v8::Handle>v8::Value>, - this is how V8 deals with weak-typed JavaScript when we program in strong-typed C++., ,After that, we will have two methods that will be inserted in to the prototype of our object:, , static v8::Handle<v8::Value> add(const v8::Arguments& args); static v8::Handle<v8::Value> toString(const v8::Arguments& args);, ,The ,toString(), method will allow us to get the value of ,s_, instead of ,[Object object], when we use it with normal JavaScript strings., ,Finally, we will have the initialization method (this will be called by V8 to assign the ,constructor, function) and we can close the include guard:, ,public: \tstatic void Init(v8::Handle<v8::Object> exporte)};endif,,, eksport, genstand, svarer til den, module.exports, i javascript moduler.,,,, stdstring.cc, fil, konstruktøren og destructor, nu skabe, stdstring.cc, fil.først må vi inddrage vores overskrift:,,omfatter "stdstring. h", og definere, konstruktøren, ejendom (da det er statisk):,, v8: vedvarende < v8: funktion > stdstringwrapper: konstruktøren;,, konstruktøren for vores klasse vil tildele det, s_, ejendom:,, stdstringwrapper: stdstringwrapper (std: serie s) (s_ = nyt std: string (s).}, og ødelæggeren vil slette det, for at undgå en hukommelse lækage:,, stdstringwrapper: ~ stdstringwrapper() {slette s_;}, også du skal slette alt det, du afsætte med nye, hver gang, der er en chance for, at en undtagelse vil blive kastet, så husk det eller bruge fælles tips.,,,, lokalitet, metode, og denne metode vil blive kaldt v8 at nulstille vores klasse (tildele,constructor,, put everything we want to use in JavaScript in the ,exports, object):, ,void STDStringWrapper::Init(v8::Handle<v8::Object> exports) {, ,First we have to create a function template for our ,New, method:, ,v8::Local<v8::FunctionTemplate> tpl = v8::FunctionTemplate::New(New);, ,This is kind of like ,new Function, in JavaScript - it allows us to prepare our JavaScript class., ,Now we can set this function's name if we want to (if you omit this, your constructor will be anonymous, it would have ,function someName() {}, versus ,function () {},):, ,tpl->SetClassName(v8::String::NewSymbol("STDString"));, ,We used ,v8::String::NewSymbol(), which creates a special kind of string used for property names - this saves the engine a little bit of time., ,After that, we set how many fields each instance of our class will have:, ,tpl->InstanceTemplate()->SetInternalFieldCount(2);, ,We have two methods - ,add(), and ,toString(),, so we set this to ,2,., ,Now we can add our methods to the function's prototype:, ,tpl->PrototypeTemplate()->Set(v8::String::NewSymbol("add"), v8::FunctionTemplate::New(add)->GetFunction()); tpl->PrototypeTemplate()->Set(v8::String::NewSymbol("toString"), v8::FunctionTemplate::New(toString)->GetFunction());, ,This seems like a lot of code, but when you look closely, you will see a pattern there: we use ,tpl->PrototypeTemplate()->Set(), to add each of the methods. We also give each of them a name (using ,v8::String::NewSymbol(),) and a ,FunctionTemplate,., ,Finally, we can put the constructor in the ,constructor, property of our class and in the ,exports, object:, , constructor = v8::Persistent<v8::Function>::New(tpl->GetFunction()); \texports->Set(v8::String::NewSymbol("STDString"), constructor); }, , ,The ,New, Method, ,Now we will define the method that will act as a JavaScript ,Object.prototype.constructor,:, ,v8::Handle<v8::Value> STDStringWrapper::New(const v8::Arguments& args) {, ,First we have to create a scope for it:, ,\tv8::HandleScope scope; , ,After that, we can use the ,.IsConstructCall(), method of the ,args, object to check if the constructor funcden blev kaldt ved hjælp af nye nøgleord:,, hvis (args. isconstructcall()) {, hvis vi først gøre det argument, gik til, std: snor som denne:,, v8: serie: utf8value str (args [0] - > tostring()); std:: string (* str);,,...så kan vi give det til producenten af vores papir klasse:,, stdstringwrapper * mål = nye stdstringwrapper (s), efter at, vi kan bruge. wrap(), metode til formålet skabte vi (der er arvet fra knude: objectwrap) at overdrage til den her variabel:,, mål - > bind (args. this()), kan vi endelig tilbage den nyoprettede objekt, tilbage args. this();,, hvis funktion blev ikke kaldt ved hjælp af nye, vil vi kun påberåbe sig den pågældende, som det ville være.Next, let's create a constant for the argument count:, ,\t} else { \t\tconst int argc = 1; , ,Now let's create an array with our argument:, ,v8::Handle<v8::Value> STDStringWrapper::add(const v8::Arguments& args) {, ,And pass the result of the ,constructor->NewInstance, method to ,scope.Close,, so the object can be used later (,scope.Close, basically allows you to preserve the handle to an object by moving it to the higher scope - this is how functions work):, ,\t\treturn scope.Close(constructor->NewInstance(argc, argv)); \t} } , , ,The ,add, Method, ,Now let's create the ,add, method which will allow you to add something to the internal ,std::string, of our object:, ,v8::Handle<v8::Value> STDStringWrapper::add (denne v8: argumenter & args) {, først er vi nødt til at skabe en mulighed for vores funktion og omdanne det argument, at, std: snor, som vi gjorde tidligere:,, v8: handlescope anvendelsesområde; v8: serie: utf8value str (args [0] - > tostring()); std: serie s (* str), nu er vi nødt til at åbne objekt.This the reverse of the wrapping we did earlier - this time we will get the pointer to our object from the ,this, variable:, ,STDStringWrapper* obj = ObjectWrap::Unwrap<STDStringWrapper>(args.This());, ,Then we can access the ,s_, property and use its ,.append(), method:, ,\tobj->s_->append(s); , ,Finally, we return the current value of the ,s_, property (again, using ,scope.Close,):, ,\treturn scope.Close(v8::String::New(obj->s_->c_str())); } , ,Since the ,v8::String::New(), method accepts only ,char pointer, as a value, we have to use ,obj->s_->c_str(), to get it., , ,The ,toString, Method, ,The last method needed will allow us to convert the object to JavaScript's ,String,:, ,v8::Handle<v8::Value> stdstringwrapper: tostring (denne v8: argumenter & args) {, det er magen til den foregående, er vi nødt til at skabe anvendelsesområde:,, v8: handlescope anvendelsesområde;,, pakker genstand:,, stdstringwrapper * mål = objectwrap: pakker < stdstringwrapper > (args. this()), og returnerer den, s_, ejendom og, v8: snor:,, afkast anvendelsesområde. tæt (v8: string: nye (mål - > s_ - > c_str())},,,,, det sidste ting at gøre, før vi bruger vores addon, naturligvis er udarbejdelse og forbinde.det vil kun omfatte to kommandoer.første:,, node gyp konfigurere, vil det skabe passende bygge konfiguration for os - og forarbejdningsvirksomhed (, makefile, unix, og vcxproj på windows).at indsamle oplysninger og link biblioteket, så bare ring:,, node gyp bygge, hvis alt går vel, du skulle se sådan noget i din computer:,,,,,, og der bør være en , bygge, register oprettet i din addon er mappe.,,, afprøvning, nu kan vi teste vores addon.skabe et, test.js, fil i din addon er mappe og kræve udarbejdet bibliotek (du kan udelade,. node, udvidelse):,, var addon = kræver (. /bygge /frigivelse /addon), næste, skabe en ny instans vores formål:,, var test = ny addon. stdstring ('test), og gøre noget ved det, som at tilføje eller omdannelse til en serie:,, test. der tilsættes (. '); konsol. log ('test er indhold:% s' test), bør det resultere i noget som følgende i konsol, efter at det:,,,,, konklusion, håber jeg, at efter at have læst denne forelæsning vil du ikke længere tror, at det er vanskeligt at skabe, bygge og prøve - c /c + + bibliotek baseret på, node.js addons.med denne metode kan man næsten enhver havn c /c + + bibliotek til node.js med lethed.hvis du vil, kan du tilføje flere elementer til addon vi skabte.der er masser af metoder, std: snor til at træne med.,,, nyttige links, tjek følgende midler til flere oplysninger om node.js addon udvikling, v8 - og c - tilfælde loop bibliotek.,,, node.js addons dokumentation, v8 dokumentation,,, libuv, c begivenhed loop bibliotek) på github,,