标签: v8

node.js:为什么NODE_DEBUG = 1不起作用?(尝试调试require()错误)

我有一个像这样的目录结构:

project
  lib
    paperboy
    redis-client
    node-cookie
  srv
    main.js
  ...
Run Code Online (Sandbox Code Playgroud)

我从项目目录启动main.js:

$ node srv/main.js
Run Code Online (Sandbox Code Playgroud)

在main.js中,我可以这样做:

  paperboy = require('./lib/paperboy');
Run Code Online (Sandbox Code Playgroud)

但是,这失败了:

  redis = require('./lib/redis-client');
Run Code Online (Sandbox Code Playgroud)

同样,如果我在"项目"目录中启动交互式节点,我可以要求使用paperboy,但不能使用redis-client.我得到的错误是:

> require('./lib/redis-client')
Error: Cannot find module './lib/redis-client'
    at resolveModuleFilename (node.js:265:13)
    at loadModule (node.js:231:20)
    at require (node.js:291:14)
...
Run Code Online (Sandbox Code Playgroud)

查看resolveModuleFilename()的源代码,它会尝试打印调试字符串,我看不到:

debug("looking for " + JSON.stringify(id) + " in " + JSON.stringify(paths));
Run Code Online (Sandbox Code Playgroud)

我尝试通过导出NODE_DEBUG = 1来启用它,但在尝试要求时我仍然没有看到此调试打印.

在尝试打印这个调试时我做错了什么?第二,为什么paperboy加载得很好,但redis-client找不到?

附加信息:这是"lib"目录中的完整文件/目录列表:

lib
lib/cookie-node
lib/cookie-node/package.json
lib/cookie-node/LICENSE.txt
lib/cookie-node/README.markdown
lib/cookie-node/example
lib/cookie-node/example/ex1.js
lib/cookie-node/index.js
lib/redis-client
lib/redis-client/package.json
lib/redis-client/TODO.md
lib/redis-client/examples
lib/redis-client/examples/redis-version.js
lib/redis-client/examples/using-kiwi.js
lib/redis-client/examples/subscriber.js
lib/redis-client/examples/publisher.js
lib/redis-client/examples/.redis-version.js.swp
lib/redis-client/examples/README.md
lib/redis-client/seed.yml
lib/redis-client/LICENSE
lib/redis-client/test
lib/redis-client/test/test_throw_from_callback.js
lib/redis-client/test/test_shutdown_reconnect.js
lib/redis-client/test/test.js …
Run Code Online (Sandbox Code Playgroud)

v8 require redis node.js

1
推荐指数
1
解决办法
2294
查看次数

关于V8的TYPE_CHECK宏中的C++语法的问题

一旦在V8引擎代码中读取v8.h,我就可以找到以下宏.

#define TYPE_CHECK(T, S)                                       \
  while (false) {                                              \
    *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);      \
  }
Run Code Online (Sandbox Code Playgroud)

我知道这是检查类型S是否与类型T兼容.在语句中,执行流如何进入while循环?while(false)表示条件始终为false.因此,while循环中的语句永远不会被执行.

结果,宏并不总是可用,是吗?

c++ v8

1
推荐指数
1
解决办法
320
查看次数

用于PHP的LESS编译器

我正在尝试从PHP 编译LESS,并且不想使用node.js或ruby.

我通过谷歌找到了这个PHP实现,但它的接缝真的已经过时,缺乏对新功能的支持.

我正在考虑使用V8js API来运行less.js,这是否可行,因为它没有DOM支持?

基本上我的问题是:如何从PHP应用程序运行此JS文件?

javascript php v8 less

1
推荐指数
1
解决办法
4094
查看次数

在V8中使用TerminateExecution

我现在正在试验V8.我希望能够在一个线程中运行一些(可能是长时间运行的)javascript,然后能够从另一个线程"优雅地"终止执行.

我写了这个简单的片段来测试Lockers的概念和TerminateExecution的用法:

void breaker( Isolate* isolate, int tid ) {

    getchar();      //wait for keyboard input on stdin

    std::cout << "Breaking V8 execution" << std::endl;

    v8::Locker locker( isolate );       //lock the isolate
    v8::V8::TerminateExecution( tid );  //and terminate it
}

int main( int argc, char **argv ) {

    if( argc != 2 ) {
        std::cout << "No script name given" << std::endl;
        return 1;
    }

    Isolate* isolate = Isolate::New();              //create a new isolate
    Isolate::Scope isolateScope( isolate );         //enter it

    v8::Locker locker( isolate …
Run Code Online (Sandbox Code Playgroud)

v8 embedded-v8

1
推荐指数
1
解决办法
1299
查看次数

怎么可以从Node.js应用程序与基于函数的V8调试API进行通信?

我有一个相当特殊的调试问题,因为我的Node应用程序本身就是一个Node调试器(应用程序的一个部分将为调试另一个部分提供调试接口).

我熟悉以下文档中记录的V8调试协议:

https://code.google.com/p/v8/wiki/DebuggerProtocol

以及使用它的多种工具(包括Node中的内部调试器,节点检查器和许多其他工具).如果我必须通过网络连接与该API通信,就像所有现有工具似乎一样,我可以这样做,但我宁愿不出于几个原因.我已经在进程中,希望避免在所有情况下打开调试端口和网络开销(这是我的生产环境的一部分),并且我想从调试API中获取Javascript对象,而不是您通过JSON API获得的JSON-ified版本(缺少一些保真度).

V8调试器文档说:"有两个API:基于函数的API使用JavaScript对象和基于消息的API使用基于JSON的协议.基于函数的API可以由进程内调试器代理使用,而消息基于API的API也可以在进程外使用."

使用JavaScript对象的基于函数的API听起来就像我需要的那样,但我在V8文档中没有看到关于此API或如何使用它的其他内容.我也无法看到如何从Node.js访问此API(或一般的V8).这是可能的,如果是这样,怎么样?

v8 node.js

1
推荐指数
1
解决办法
613
查看次数

错误MSB4057:项目中不存在目标"v8"

我正在尝试使用官方构建脚本并遵循官方Windows构建说明,将V8构建为ArangoDB的一部分.

所有v8*targets(v8-build.bat)的编译都失败:

msbuild All.sln /t:v8 /p:Configuration=Release /p:Platform=x64
msbuild All.sln /t:v8_libbase /p:Configuration=Release /p:Platform=x64
msbuild All.sln /t:v8_libplatform /p:Configuration=Release /p:Platform=x64
Run Code Online (Sandbox Code Playgroud)

错误MSB4057:项目中不存在目标"v8".

如果我在Visual Studio中打开解决方案文件,它看起来像这样:

All.sln

我可以建立v8,v8_libbasev8_libplatform在VS中很好.

  • Windows 7 64位
  • Visual Studio 2013 Ultimate
  • Cygwin 2.2.0
  • cmake 3.3.1

v8 compiler-errors msbuild-target arangodb visual-studio-2013

1
推荐指数
1
解决办法
6591
查看次数

将字符串设置为v8 Array

我使用Nan调查本机Node插件.

所以我试图用以下代码返回Node一个字符串数组:

NAN_METHOD(open) {
    Local<Array> v8Array = Nan::New<Array>();
    std::string str = "erwer";
    v8Array->Set(0, Nan::New<String>(str.c_str()) );
    //v8Array->Set(0, Nan::New<Integer>(12) );
    info.GetReturnValue().Set(v8Array);
}
Run Code Online (Sandbox Code Playgroud)

但它没有编译:

error: no matching function for call to ‘v8::Array::Set(int, Nan::imp::MaybeFactoryBase<v8::String>::return_t)’ v8Array->Set(0, Nan::New<String>(str.c_str()) );

但是将项添加为整数(注释行)可以正常工作.为什么我不能在数组中添加字符串?

c++ v8 node.js-nan

1
推荐指数
1
解决办法
1384
查看次数

在V8 javascript引擎中,如何创建一个为每个实例重用ObjectTemplate的构造函数?

我有工作代码,我可以根据需要创建尽可能多的Point对象,但每次调用构造函数时它都会重新创建对象模板,这看起来可能是错误的.

Local<ObjectTemplate> global_templ = ObjectTemplate::New(isolate);

// make the Point constructor function available to JS
global_templ->Set(v8::String::NewFromUtf8(isolate, "Point"), FunctionTemplate::New(isolate, v8_Point));
Run Code Online (Sandbox Code Playgroud)

然后是构造函数本身:

void v8_Point(const v8::FunctionCallbackInfo<v8::Value>& args) {
    HandleScope scope(args.GetIsolate());

    // this bit should probably be cached somehow
    Local<ObjectTemplate> point_template = ObjectTemplate::New(args.GetIsolate());
    point_template->SetInternalFieldCount(1);

    point_template->SetAccessor(String::NewFromUtf8(args.GetIsolate(), "x"), GetPointX, SetPointX);
    point_template->SetAccessor(String::NewFromUtf8(args.GetIsolate(), "y"), GetPointY, SetPointY);
    // end section to be cached

    Local<Object> obj = point_template->NewInstance();
    Point * p = new Point(1,1);
    obj->SetInternalField(0, External::New(args.GetIsolate(), p));
    args.GetReturnValue().Set(obj);
}
Run Code Online (Sandbox Code Playgroud)

但似乎我应该能够传入point_template对象而不是每次都重新创建它.我看到args中有一个Data()字段,但是它只允许一个Value类型,而ObjectTemplate的类型是Template,而不是Value.

任何有关正确方法的帮助将不胜感激.

c++ v8

1
推荐指数
1
解决办法
1935
查看次数

何时在Node.js V8中分配和编译闭包?

根据我目前关于VM及其行为的假设,我认为每次定义被击中时都会分配和编译闭包; 与在闭包之外声明的函数相比,这些函数被分配和编译一次(因为它们被放置在某个地方,它们的定义只被命中一次).这个假设是否正确?

因此,如果我有一个闭包socket.on('data', function (data) {...}),V8 每次在套接字收到数据时都会分配新内存(并可能重新编译)闭包?

javascript performance v8 node.js

1
推荐指数
1
解决办法
301
查看次数

为什么Node JS需要LIBUV?

因此,也许这个问题太过新手了,但是我仍然不知道为什么LIBUV在Node JS Architecture中占有一席之地?所以这是我对NodeJs架构的理解。

  1. 节点Js是基于V8构建的
  2. V8能够运行以EcmaScript标准编写的代码。
  3. V8用C ++编写。
  4. 因此,如果您想提供任何新功能,我们可以将V8嵌入到C ++项目中,并使用C ++中的新Embedded V8附加新代码。

现在有疑问了

  1. 由于V8支持EcmaScript Javascript,这意味着它具有运行以EcmaScript标准编写的回调的功能。
  2. 因此,我们可以为C ++中的文件系统访问,Http服务器和DB访问添加代码,因为有一些库(头文件)提供了该功能,因为Java是用C ++编写的(如果我写错了,请纠正我),并且Java有能力做到相同。
  3. 现在,如果我们可以在C ++中添加这些功能,那么Libuv的位置在NodeJs体系结构中会出现什么位置。

在此先感谢和快乐编码:)

c++ v8 node.js libuv

1
推荐指数
3
解决办法
211
查看次数