通過C++擴展Google V8 JS引擎的文章很多,Google V8 JS帶的例子也容易明白。但是大部分文章都是Hello World型的,真正使用時發現處處是坑。擴展V8最經典的例子就是node了,如果要做實際項目,研究一下node本身和及其擴展模塊大有裨益。
提到node的C++擴展就不得不提nan,nan是Native Abstractions for Node.js的簡稱,它讓擴展V8變得很容易,特別是用類來擴展的時候。
類從ObjectWrap繼承過來,如:
class Location: public ObjectWrap {
public:
Location();
~Location();
...
用ObjectWrap::Unwrap把JS對象轉換成C++對象:
NAN_SETTER(LocationSetProtocol) {
NanScope();
Location* obj = ObjectWrap::Unwrap<Location>(args.This());
if (value->IsString()) {
v8::String::Utf8Value nativeValue(value);
obj->setProtocol(*nativeValue);
}else{
printf("invalid data type for Location.protocol\n");
}
}
完整代碼請參考:https://github.com/drawapp8/cantk-runtime-v8/tree/master/src/cantk-rt
nan依賴與node的一些宏和函數,我花了點時間把它獨立出來的,你可以到這裏下載:https://github.com/drawapp8/v8-native-binding-generator/tree/master/nan